
海取引決定システムは,突破理論に基づくトレンド追跡取引戦略である.取引品種の最高価格と最低価格の移動平均によって取引信号を生成し,潜在的なトレンドの識別を実現する.価格が指定された周期内の最高価格または最低価格を破るときに取引信号を生成する.この戦略は,移動停止,倉庫管理および資金管理モジュールを同時に統合し,より完全な意思決定システムにします.
海取引決定システムの核心策略信号は,価格とN1サイクル最高値とN2サイクル最低値との比喩的な大小関係によって生成される.価格がN1サイクル最高値を突破すると,買入信号が生成され,価格がN2サイクル最低値を突破すると,売出信号が生成される.シャットダウンモードは,新しい信号の生成を制御するために使用される.
ポジション開設後,リアルタイムで価格とストップ価格の大きさの関係を比較して,移動ストップシグナルを生成する.同時に,価格と加仓ラインの関係を比較して,加仓シグナルを生成する.ストップ価格と加仓ラインはATRに関連している.
ポジションを開設するたびに,保有単位を計算し,初期資金の一定割合を取り,単一の損失が総資本に与える影響を回避する.単一の損失は一定の範囲で制限される.
海取引の意思決定システムには以下の利点があります.
潜在的トレンドを捕捉する:価格と周期的な最高最低価格の関係を比較して潜在的トレンドの方向を判断し,潜在的価格トレンドを早期に捕捉することができる.
リスク管理: 資金管理と止損を用い,単価および全体的な損失のリスクを制御する.
準備金管理: 適切な準備金管理により,トレンド中の追加利益が得られます.
整合性: 資金管理,損失管理,加仓管理を組み合わせて,意思決定システムをより完全にする.
シンプルで明快:信号生成規則はシンプルで直接で,理解し,検証しやすい.
海取引の意思決定システムにはいくつかのリスクがあります.
偽突破リスク:価格が偽突破最高値または最低値が発生し,誤ったシグナルを生じさせる可能性があります.いくつかの偽突破をフィルターするためにパラメータを適切に調整できます.
トレンド逆転リスク:加仓後の価格逆転が損失を増やすリスクがある.加仓の回数を適切に制限し,時宜で損失を止めなければならない.
パラメータ最適化リスク:異なる市場のパラメータ設定は大きく異なる.リスクを下げるために,市場最適化パラメータを分割すべきである.
海取引の意思決定システムは,以下の点で最適化できます.
フィルターを追加: 価格の突破の強さを検出し,偽の突破をフィルターします.
ストップ・ロスの最適化: ストップ・ロスを合理的に追跡し,利潤を保護し,不必要なストップ・ロスを減らすためのバランスを探す方法
分市場パラメータ最適化:異なる品種特性を対象に最適化パラメータの組み合わせ.
機械学習の強化: 機械学習アルゴリズムによるトレンドの判断
海取引決定システムは,価格と指定期間の最高最低価格の関係を比較して潜在的トレンド方向を判断し,リスク管理モジュールと組み合わせて,決定システム全体を構築する. それは,強いトレンド追跡能力を持ち,同時に,偽突破リスクとパラメータ最適化の問題がある. この戦略は,量化取引の基本モデルとして使用され,その基礎で拡張され,最適化され,独自の意思決定システムに適したものを開発することができる.
/*backtest
start: 2024-01-29 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © 李和邪
// 本脚本所有内容只适用于交流学习,不构成投资建议,所有后果自行承担。
//@version=5
strategy(title='Turtle Trading Strategy@lihexie',
shorttitle='OKX-海龟交易系统@李和邪',
overlay=true,
pyramiding=4,
initial_capital = 1000,
default_qty_type = strategy.percent_of_equity,
default_qty_value=100,
slippage = 0,
commission_type = strategy.commission.percent,
commission_value = 0.05)
// 输入参数
from_date = input(timestamp("2013-01-01T00:00:00+08:00"), "From Date/开始日期")
end_date = input(timestamp("2024-08-01T00:00:00+08:00"), "To Date/结束日期")
valid_date() => true
current_mode = input.string("Mode 1", "Enter Mode/进场系统",['Mode 1','Mode 2'])
// mode 1
entry_length = input.int(20, 'Entry Length/系统1进场长度', minval=1) // 进场长度
exit_length = input.int(10, 'Exit Length/系统2出场长度', minval=1) // 出场长度
// mode 2
entry_length_mode2 = input.int(55, 'Mode2 Entry Length/系统2进场长度', minval=1) // 进场长度
exit_length_mode2 = input.int(20, 'Mode2 Exit Length/系统2出场长度', minval=1)
atr_period = input.int(14, "ATR Period/计算ATR的周期", minval=1) // ATR周期
risk_per_trade = input.float(0.02, "Risk Per Trade/每笔交易的风险,0.02就是2%", minval=0.001, maxval=1) // 每笔交易的风险
initial_stop_atr_multiple = input.float(2, "Initial Stop ATR Multiple/止损使用的ATR倍数", minval=0.1, maxval=10) // 初始止损ATR倍数
pyramid_atr_multiple = input.float(0.5, "Pyramid ATR Multiple/加仓使用的ATR倍数", minval=0.1, maxval=10) // 加仓ATR倍数
max_units = input.int(4, "Max Units/最大头寸单位数", minval=1, maxval=10) // 最大头寸单位数
highlighting = input(title='Highlighter On/Off ?/是否高亮显示', defval=true) // 是否高亮显示
// 初始化变量
var int units = 0
var float trailing_stop_long = na
var float trailing_stop_short = na
var float real_entry_price_long = na
var float real_entry_price_short = na
var float add_unit_price_long = na
var float add_unit_price_short = na
var bool last_trade_win = false
// 计算ATR
atr = ta.atr(atr_period)
// 计算单位大小
unit_size = (strategy.equity * risk_per_trade) / (initial_stop_atr_multiple * atr)
// 切换模式
mode_signal = current_mode == "Mode 1" ? (last_trade_win==false?true:false) : true
float entry_price_long = na
float entry_price_short = na
float exit_price_long = na
float exit_price_short = na
// 计算进场和出场价格
if current_mode == "Mode 1"
entry_price_long := ta.highest(entry_length)
entry_price_short := ta.lowest(entry_length)
exit_price_long := ta.lowest(exit_length)
exit_price_short := ta.highest(exit_length)
else
entry_price_long := ta.highest(entry_length_mode2)
entry_price_short := ta.lowest(entry_length_mode2)
exit_price_long := ta.lowest(exit_length_mode2)
exit_price_short := ta.highest(exit_length_mode2)
// 计算止损价格
stop_price_long = entry_price_long - (initial_stop_atr_multiple * atr)
stop_price_short = entry_price_short + (initial_stop_atr_multiple * atr)
// 交易逻辑
// 生成买入和卖出信号
long_signal = ta.crossover(close, entry_price_long[1]) and strategy.position_size==0 and valid_date()
short_signal = ta.crossunder(close, entry_price_short[1]) and strategy.position_size==0 and valid_date()
// 生成出场信号
exit_long_signal = ta.crossunder(close, exit_price_long[1]) and strategy.position_size > 0 and valid_date()
exit_short_signal = ta.crossover(close, exit_price_short[1]) and strategy.position_size < 0 and valid_date()
if long_signal
if mode_signal
strategy.entry("Long", strategy.long, qty=unit_size, stop=stop_price_long)
units := 1
trailing_stop_long := stop_price_long
real_entry_price_long := close
add_unit_price_long := real_entry_price_long+pyramid_atr_multiple*atr
else
last_trade_win:=false
if short_signal
if mode_signal
strategy.entry("Short", strategy.short, qty=unit_size, stop=stop_price_short)
units := 1
trailing_stop_short := stop_price_short
real_entry_price_short := close
add_unit_price_short := real_entry_price_short-pyramid_atr_multiple*atr
else
last_trade_win:=false
// 出场逻辑
if exit_long_signal
last_trade_win := strategy.position_avg_price<close?true:false
strategy.close_all("SL")
units := 0
real_entry_price_long := na
add_unit_price_long := na
trailing_stop_long := na
if exit_short_signal
last_trade_win := strategy.position_avg_price>close?true:false
strategy.close_all("SS")
units := 0
real_entry_price_short := na
add_unit_price_short := na
trailing_stop_short := na
// 生成加仓信号
add_unit_signal = (close > add_unit_price_long or close < add_unit_price_short) and units[1] < max_units and valid_date()
// 加仓逻辑
if add_unit_signal
if strategy.position_size > 0
strategy.entry("AL", strategy.long, qty=unit_size)
real_entry_price_long := close
add_unit_price_long := real_entry_price_long+pyramid_atr_multiple*atr
trailing_stop_long := real_entry_price_long - (initial_stop_atr_multiple * atr)
if strategy.position_size < 0
strategy.entry("AS", strategy.short, qty=unit_size)
real_entry_price_short := close
add_unit_price_short := real_entry_price_short-pyramid_atr_multiple*atr
trailing_stop_short := real_entry_price_short + (initial_stop_atr_multiple * atr)
units := units + 1
// 移动止损逻辑
trailing_stop_long_signal = ta.crossunder(close, trailing_stop_long) and strategy.position_size > 0 and valid_date()
trailing_stop_short_signal = ta.crossover(close, trailing_stop_short) and strategy.position_size < 0 and valid_date()
if trailing_stop_long_signal
last_trade_win := strategy.position_avg_price<close?true:false
strategy.close_all("TSL")
units := 0
real_entry_price_long := na
add_unit_price_long := na
trailing_stop_long := na
if trailing_stop_short_signal
last_trade_win := strategy.position_avg_price>close?true:false
strategy.close_all("TSS")
units := 0
real_entry_price_short := na
add_unit_price_short := na
trailing_stop_short := na
// 美化图表
plot_entry_lowest = plot(entry_price_short, 'Lower', color=color.new(#0094FF, 0)) // 绘制进场最低线
plot_entry_highest = plot(entry_price_long, 'Upper', color=color.new(#0094FF, 0)) // 绘制进场最高线
entry_line = ta.barssince(short_signal) <= ta.barssince(long_signal) ? entry_price_short : entry_price_long // 进场线
exit_line = ta.barssince(short_signal) <= ta.barssince(long_signal) ? exit_price_short : exit_price_long // 出场线
plot(entry_line, title='Trend Line', color=color.new(#ff52f1, 0), linewidth=2) // 绘制趋势线
plot_exit = plot(exit_line, title='Exit Line', color=color.new(color.blue, 0), linewidth=1, style=plot.style_circles) // 绘制出场线
entry_long_color = highlighting and strategy.position_size>0 ? color.new(color.green, transp = 88) : na
entry_short_color = highlighting and strategy.position_size<0 ? color.new(color.red, transp = 88) : na
fill(plot_entry_highest, plot_exit, color=entry_long_color, title='Background') // 高亮多头趋势
fill(plot_entry_lowest, plot_exit, color=entry_short_color, title='Background') // 高亮空头趋势