これはモメンタムベースのブレイクアウト取引戦略である.市場動向と変動を判断するために移動平均値,ATR,RSIおよびその他の指標を使用し,取引のための厳格なストップ・ロスト/テイク・プロフィート設定を組み合わせます.この戦略は主に価格が移動平均値プラスATR範囲を下回り,または下回り,取引信号を生成するかどうかを判断します.
この戦略の主なポイントは:
EMA を使って価格傾向の方向を判断する.EMA を越えた価格は上昇信号であり,下を越えた価格は下落信号である.
ATRは市場の変動を示します.ATRを係数で掛けるとストップ損失範囲として機能します.これは単一の損失を効果的に制御できます.
RSI は過買い/過売り状態を示します.ストップ・ロスト価格とEMAクロスオーバーによって示されるブレイクアウト取引は,RSI が過買い/過売りゾーンにないときに起こなければなりません.これは誤ったブレイクアウトを回避します.
過去の期間の高/低点を利益のベースとして使用します. 利益の価格を追跡することで,より多くの利益が確保できます.
厳格なストップ・ロスト/テイク・プロフィートルール ATRベースのストップ・ロストはリスクを制御し,利益のロックをとる.
エントリーシグナルは,価格がEMAプラスATRストップ損失範囲を突破すると起動する.ブイシグナルでは,価格が高点を超越する必要があります.ベアシグナルでは,価格が低点を下回る必要があります.
この戦略の利点:
複数の指示が誤差を回避し,正確性を向上させる
ATR ストップ・ロスは 損失を合理的な水準に保ちます
ダイナミックな収益追跡は利益を最大化します
厳格な規則はリスク管理を容易にする
異なる市場に適応するための指標とパラメータのための大きな最適化空間
この戦略のリスク:
収益性は市場変動と相関する.トレンドが不透明かサイクルが長い場合,利益は限られることがあります.
ストップ・ロスは再びブレイクする前に,ストップ・ロスの価格を絞り込むことができます.これはトレンドを逃す結果になります.ストップ・ロスの価格を少しリラックスさせることができます.
3.トレンド市場での追いかける可能性はあります.
オプティマイゼーションのアイデア:
異なる製品と時間枠の MA,ATR パラメータを調整する.
MACDやKDJなどの指標を追加します.
アダプティブストップのリアルタイムATR値に基づいて,ATR係数を動的に調整する.
複数のタイムフレームのコンボシステムを確立します. 異なるタイムフレーム指標は信号品質を改善することができます.
最良のパフォーマンスを達成するためにパラメータ/インジケーターの最適化のために機械学習を使用します.
この戦略は判断のための指標と厳格なストップ・ロスト/テイク・プロフィートの利用を図る.市場動向を決定するために移動平均値,ATRおよびRSIを利用する.厳格なリスク管理により,リスクを管理しながらトレンドに乗ることができる.さらなるパラメータとルール最適化は,長期的に利益をもたらす取引システムとなる.
/*backtest start: 2024-01-27 00:00:00 end: 2024-02-03 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="UT Bot Strategy", overlay = true) //CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. // Inputs emaLengh = input(2, title = "emaLengh") a = input(3.0, title = "Key Vaule. 'This changes the sensitivity'") c = input(10, title = "ATR Period") h = input(false, title = "Signals from Heikin Ashi Candles") emaLengh2 = input(9, title = "emaLengh show") rate = input(0.00025, title = "波动率min") rateMax = input(0.00045, title = "波动率max") adx_length = input(20, title = "adx_length") adx_min = input(14, title = "adx_min") sma_length = input(11, title = "sma_length") rsi_len = input(9, title = "rsi_len") src = h ? security(heikinashi(syminfo.tickerid), timeframe.period, close, lookahead = false) : close // boll 通道---------------------------------------------------- length = input(20, minval=1) mult = input(2.0, minval=0.001, maxval=50, title="StdDev") basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev bbr = (src - lower)/(upper - lower) // plot(upper, color = color.rgb(46, 59, 240), title="upper") // plot(lower, color = color.rgb(46, 59, 240), title="lower") // plot(bbr, "Bollinger Bands %B", color=#26A69A) // band1 = hline(1, "Overbought", color=#787B86, linestyle=hline.style_dashed) // hline(0.5, "Middle Band", color=color.new(#787B86, 50)) // band0 = hline(0, "Oversold", color=#787B86, linestyle=hline.style_dashed) // fill(band1, band0, color=color.rgb(38, 166, 154, 90), title="Background") // boll 通道---------------------------------------------------- // 线性回归 -------------------------------------------------------------- zlsma_length = input(title="zlsma-Length", type=input.integer, defval=50) zlsma_offset = input(title="zlsma-Offset", type=input.integer, defval=0) lsma = linreg(src, zlsma_length, zlsma_offset) lsma2 = linreg(lsma, zlsma_length, zlsma_offset) eq= lsma-lsma2 zlsma = lsma+eq // plot(zlsma , color = color.rgb(243, 243, 14), title="zlsma",linewidth=3) // 线性回归 -------------------------------------------------------------- // -------------------------------- rsi = rsi(src, 6) // xHH = sma(high, sma_length) // xLL = sma(low, sma_length) // movevalue = (xHH - xLL) / 2 // xHHM = xHH + movevalue // xLLM = xLL - movevalue // plot(xHHM, color = color.rgb(208, 120, 219), title="xHHM") // plot(xLLM, color = color.rgb(208, 120, 219), title="xLLM") xATR = atr(c) nLoss = a * xATR xATRTrailingStop = 0.0 xATRTrailingStop := iff(src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), src - nLoss), iff(src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), src + nLoss), iff(src > nz(xATRTrailingStop[1], 0), src - nLoss, src + nLoss))) pos = 0 pos := iff(src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0), 1, iff(src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue ema = ema(src,emaLengh) // sma = sma(src,emaLengh) emaFast = ema(src,100) emaSlow = ema(src,576) emaShow = ema(src, emaLengh2) // sma = sma(src, 8) // [superTrend, dir] = supertrend(3, 200) // 判断连续涨 [diplus, diminus, adx] = dmi(adx_length, adx_length) above = crossover(ema, xATRTrailingStop) below = crossover(xATRTrailingStop, ema) // above = ema == xATRTrailingStop // below = xATRTrailingStop== ema // smaabove = crossover(src, sma) // smabelow = crossover(sma, src) // smaabove = src > sma // smabelow = sma > src close_rate (n)=> abs(close[n]-open[n])/min(close[n],open[n]) rate_val = close_rate(0) rate_val1 = close_rate(1) buy = src > xATRTrailingStop and above and src > zlsma and adx >adx_min // and src>emaShow // and rate_val < rate_val1*2 and rate_val >=rate_val1 // and rate_val1<rateMax // and close[1]>open[1] sell = src < xATRTrailingStop and below and src < zlsma and adx >adx_min // and src<emaShow // and rate_val < rate_val1*2 and rate_val >=rate_val1 // and rate_val1<rateMax // and open[1]>close[1] and rate_val1 > rate // buy = src > xATRTrailingStop // sell = src < xATRTrailingStop // plot(rate_val1 , color = color.red, title="rate_val1") barbuy = src > xATRTrailingStop barsell = src < xATRTrailingStop atrRsi = rsi(xATRTrailingStop,rsi_len) // plot(emaFast , color = color.rgb(243, 206, 127), title="emaFast") // plot(ema , color = color.rgb(47, 227, 27), title="ut-ema") // plot(emaShow , color = color.rgb(47, 227, 27), title="ema9") plot(xATRTrailingStop, color = color.rgb(233, 233, 232), title="xATRTrailingStop") plotshape(buy, title = "Buy", text = 'Buy', style = shape.labelup, location = location.belowbar, color= color.green, textcolor = color.white, size = size.tiny) plotshape(sell, title = "Sell", text = 'Sell', style = shape.labeldown, location = location.abovebar, color= color.red, textcolor = color.white, size = size.tiny) // plotshape(buy, title = "Sell", text = 'Sell', style = shape.labelup, location = location.belowbar, color= color.green, textcolor = color.white, transp = 0, size = size.tiny) // plotshape(sell, title = "buy", text = 'buy', style = shape.labeldown, location = location.abovebar, color= color.red, textcolor = color.white, transp = 0, size = size.tiny) // barcolor(barbuy ? color.green : na) // barcolor(barsell ? color.red : na) // strategy.entry("short", false, when = buy) // strategy.entry("long ", true, when = sell) strategy.entry("long", true, when = buy and strategy.position_size == 0) strategy.entry("short", false, when = sell and strategy.position_size == 0) //动态止盈start------------------------------------------------------------------------------------------ profit = input( 0.015, title = "最小收益率") close_profit_rate = input( 10, title = "平仓收益回撤比") loss = input(0.004, title = "回撤率") // 收益回撤比例 profit_price_scale =profit/close_profit_rate var float profit_price = 0 // 计算小收益价格 get_profit_price(long) => float res = 0 if long == true res := strategy.position_avg_price * (1+profit) if long == false res := strategy.position_avg_price * (1-profit) res // 止盈平仓条件 close_profit_position(long)=> bool result=false if long == true and profit_price>0 and profit_price*(1-profit_price_scale) >=close and get_profit_price(true) <= close result:=true if long == false and profit_price>0 and profit_price*(1+profit_price_scale) <=close and get_profit_price(false) >= close result:=true result // 更新动态止盈价格 update_profit_price(price)=> float res = price // 无仓位时 动态止盈价格为0 if strategy.position_size == 0 res := 0 // long - 价格大于最小收益时保存 if strategy.position_size > 0 and get_profit_price(true) <= close and (res==0 or res < close) res := close // short - 价格小于最小收益时保存 if strategy.position_size < 0 and get_profit_price(true) >= close and (res==0 or res > close) res := close res /////// profit_price := update_profit_price(profit_price) long_close_profit_position = close_profit_position(true) short_close_profit_position = close_profit_position(false) // plot(profit_price, color = color.green, title="profit_price") //动态止盈end------------------------------------------------------------------------------------------ strategy.close("long",comment="long-止盈",when = strategy.position_size > 0 and long_close_profit_position) strategy.close("long",comment="long-止损",when = strategy.position_size >0 and strategy.position_avg_price * (1-loss) >= close) strategy.close("short",comment="short-止盈",when = strategy.position_size <0 and short_close_profit_position) strategy.close("short",comment="short-止损",when = strategy.position_size <0 and strategy.position_avg_price * (1+loss) <= close)