移動平均クロスオーバーと上部鉄道の突破推進戦略

作者: リン・ハーンチャオチャン,日付: 2023-11-13 11:52:22
タグ:

img

概要

この戦略は,MACDの高速線とスローラインのクロスオーバー信号を,他の複数の指標に基づく判断と組み合わせて,移動平均指数線の突破信号をタイムリーに把握し,購入または売却の決定を行います.これは短期取引戦略に属します.

戦略の論理

  1. MACDの速いラインとスローラインのクロスオーバーを主要な取引信号として使用する.速いラインがスローラインを越えたとき,ロングポジションを取ること.速いラインがスローラインを下回ったとき,ショートポジションを取ること.

  2. RSI インジケーターを組み込み,過買い・過売状態を決定します. 中央線の下はロング,上はショートです.

  3. 現在の閉じる価格を特定の期間のSMAラインと比較します.SMAを下回る閉じる価格はロングを示し,上回りはショートを示します.

  4. 特定の期間の最高値の0.5フィボナッチレベルを,ロングのレジスタンスとして計算します.特定の期間の最低値の0.5フィボナッチレベルを,ショートへのサポートとして計算します.

  5. 快線が上を横切って価格がサポートを下回る時,長引く.快線が下を横切って価格がレジスタンスを下回る時,短引く.

  6. トレイリングストップロスのメカニズムを採用する.ストップロスは初期にエントリー価格の一定の割合で固定される.損失が一定のレベルに達すると,徐々にトレリングストップロスのメカニズムに切り替える.

利点

  1. この戦略はMACDクロスオーバーシグナルを完全に利用しており,これは古典的で効果的な技術指標取引シグナルです.

  2. RSIやSMAのような複数の指標からの確認を組み込むことで 誤った信号をフィルターし 信頼性を高めることができます

  3. ブレイクトレードにおける動的サポートとレジスタンスのレベルを計算することで,より大きなトレンドを把握できます.

  4. ストップロスはリスクをコントロールしながら 利益の大半を 確保できます

  5. 戦略の論理は明確でシンプルで 初心者でも簡単に理解し 習得できます

リスク

  1. MACDインジケーターは遅れている問題があり,最適なエントリーとアウトプットポイントを見逃す可能性があります.

  2. 複数の指標を組み合わせると 複雑性と矛盾する信号の危険性が高まります

  3. サポートとレジスタンスを動的に計算する際に誤ったブレイクアウトのリスクがあります.

  4. トレイリングストップ・ロスは,強いトレンドで早急に終了し,トレンドに乗れない可能性があります.

  5. パラメータは繰り返しテストと最適化が必要で,不適切なパラメータはパフォーマンスに悪影響を及ぼします.

オプティマイゼーションの方向性

  1. MACD周期を最適化するために異なるパラメータの組み合わせをテストする.

  2. 多次元分析のために ボリンジャー帯やKDJなどの指標を導入します

  3. サポートと抵抗の合理性を判断するためのより多くの要素を組み込む.

  4. タイムベースや波動性ベースのストップのような より高度なストップ損失メカニズムを研究します

  5. 自動パラメータ最適化用の自動最適化モジュールを追加します

概要

この戦略は,MACD,RSI,SMAなどの指標を組み合わせて,移動平均突破信号を機会的に捕捉する.これは典型的な短期間のブレイクアウト取引戦略に属している.信号生成には一定の遅れがあるが,パラメータ最適化によって正確性が向上することができる.全体として,これは単純で明確な論理を持つ戦略であり,ほとんどの人が理解しやすいものであり,さらなるテストと最適化に価値がある.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-09 23:00:00
period: 1m
basePeriod: 1m
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/
// © onurenginogutcu

//@version=4
strategy("R19 STRATEGY", overlay=true, calc_on_every_tick=true , margin_long=100, margin_short=100 ,  process_orders_on_close=true )



sym = input(title="Symbol", type=input.symbol, defval="BINANCE:BTCUSDT" , group = "SYMBOL") 
timeFrame = input(title="Strategy Decision Time Frame", type = input.resolution ,  defval="60")

adxlen = input(14, title="ADX Smoothing" , group = "ADX")
dilen = input(14, title="ADX DI Length", group = "ADX")
adxemalenght = input(30, title="ADX EMA", group = "ADX")
adxconstant = input(19, title="ADX CONSTANT", group = "ADX")

fibvar = input (title = "Fibo Look Back Canles" , defval = 50 , minval = 0 , group = "FIBO MACD SMA")
smaLookback = input (title = "SMA Look Back Candles" , defval = 30 , minval = 0 , group = "FIBO MACD SMA")
MACDFast = input (title = "MACD Fast Lenght" , defval = 15 , minval = 0 , group = "FIBO MACD SMA")
MACDSlow = input (title = "MACD Slow Lenght" , defval = 30 , minval = 0 , group = "FIBO MACD SMA")
MACDSmooth = input (title = "MACD Signal Smoothing" , defval = 9 , minval = 0 , group = "FIBO MACD SMA")
MACDLookback = input (title = "MACD Look Back Candles" , defval = 100 , minval = 0 , group = "FIBO MACD SMA")

trailingStopLong = input (title = "Trailing Long Stop %" , defval = 2.0 , step = 0.1, group = "TP & SL") * 0.01
trailingStopShort = input (title = "Trailing Short Stop %" , defval = 2.0 , step = 0.1 , group = "TP & SL") * 0.01
LongTrailingProfitStart = input (title = "Long Profit Start %" , defval = 2.0 , step = 0.1 , group = "TP & SL") * 0.01
ShortTrailingProfitStart = input (title = "Short Profit Start %" , defval = 2.0 , step = 0.1, group = "TP & SL") * 0.01

lsl = input(title="Max Long Stop Loss (%)",
     minval=0.0, step=0.1, defval=3.0, group = "TP & SL") * 0.01
     
ssl = input(title="Max Short Stop Loss (%)",
     minval=0.0, step=0.1, defval=2.5, group = "TP & SL") * 0.01
     
longtp = input(title="Long Take Profit (%)",
     minval=0.0, step=0.1, defval=100, group = "TP & SL") * 0.01
     
shorttp = input(title="Short Take Profit (%)",
     minval=0.0, step=0.1, defval=100, group = "TP & SL") * 0.01
     
capperc = input(title="Capital Percentage to Invest (%)",
     minval=0.0, maxval=100, step=0.1, defval=95, group = "CAPITAL TO INVEST") * 0.01
     

symClose = security(sym, timeFrame, close)
symHigh = security(sym, timeFrame, high)
symLow = security(sym, timeFrame, low)

atr = atr (14) 

/////////adx code

dirmov(len) =>
	up = change(symHigh)
	down = -change(symLow)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(plusDM, len) / truerange)
	minus = fixnan(100 * rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)
emasig = ema (sig , adxemalenght )


////////adx code over



i = ema (symClose , MACDFast) - ema (symClose , MACDSlow) 
r = ema (i , MACDSmooth)

sapust = highest (i , MACDLookback) * 0.729 
sapalt = lowest (i , MACDLookback) * 0.729  


simRSI = rsi (symClose , 50 ) 




fibtop = lowest (symLow , fibvar) + ((highest (symHigh , fibvar) - lowest (symLow , fibvar)) * 0.50)
fibbottom = lowest (symLow , fibvar) + ((highest (symHigh , fibvar) - lowest (symLow , fibvar)) * 0.50)





cond1 = 0
cond2 = 0
cond3 = 0
cond4 = 0


longCondition = crossover(i, r) and i < sapalt and sig > adxconstant and symClose < sma (symClose , smaLookback) and simRSI < sma (simRSI , 50) and symClose < fibbottom 
shortCondition = crossunder(i, r) and i > sapust and sig > adxconstant and  symClose > sma (symClose , smaLookback) and simRSI > sma (simRSI , 50) and symClose > fibtop 


//////////////////////probability long/short
if (crossover(i, r) and i < sapalt)
    cond1 := 35
else if (crossunder(i, r) and i > sapust)
    cond1 := -35
else
    cond1 := 0
    
if (symClose < sma (symClose , smaLookback))
    cond2 := 30
else if (symClose > sma (symClose , smaLookback))
    cond2 := -30
else
    cond2 := 0
    
if (simRSI < sma (simRSI , 50))
    cond3 := 25
else if (simRSI > sma (simRSI , 50))
    cond3 := -25
else
    cond3 := 0
    
if (symClose < fibbottom)
    cond4 := 10
else if (symClose > fibbottom)
    cond4 := -10
else
    cond4 := 0
    
probab = cond1 + cond2 + cond3 + cond4
////////////////////////////////////////////////////////////////

///////////////////////////////////////////STRATEGY ENTRIES AND STOP LOSSES /////
var startTrail = 0
var trailingLongPrice = 0.0
var trailingShortPrice = 0.0

if (longCondition and strategy.position_size == 0)
    strategy.entry("Long", strategy.long , qty = capperc * strategy.equity / close )

if (shortCondition and strategy.position_size == 0)
    strategy.entry("Short" , strategy.short , qty = capperc * strategy.equity / close )
    
    
if (strategy.position_size == 0)    
    trailingShortPrice := 0.0
    trailingLongPrice := 0.0  
    startTrail := 0
/////////////////////////////////strategy exit

if (strategy.position_size > 0 and close >= strategy.position_avg_price * (1 + LongTrailingProfitStart))
    startTrail := 1

if (strategy.position_size < 0 and close <= strategy.position_avg_price * (1 - ShortTrailingProfitStart))
    startTrail := -1
    



trailingLongPrice := if strategy.position_size > 0 and startTrail == 1
    stopMeasure = close * (1 - trailingStopLong)
    max (stopMeasure , trailingLongPrice [1])
else if strategy.position_size > 0 and startTrail == 0
    strategy.position_avg_price * (1 - lsl)


trailingShortPrice := if strategy.position_size < 0 and startTrail == -1
    stopMeasure = close * (1 + trailingStopShort)
    min (stopMeasure , trailingShortPrice [1])
else if strategy.position_size < 0 and startTrail == 0
    strategy.position_avg_price * (1 + ssl)




if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop = trailingLongPrice , limit=strategy.position_avg_price*(1 + longtp))
 

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop = trailingShortPrice , limit=strategy.position_avg_price*(1 - shorttp))


////////////////////////vertical colouring signals
bgcolor(color=longCondition ? color.new (color.green , 70) : na)
bgcolor(color=shortCondition ? color.new (color.red , 70) : na)

plot (trailingLongPrice , color = color.green) ///long price trailing stop
plot (trailingShortPrice , color = color.red) /// short price trailing stop
plot (startTrail , color = color.yellow)
plot (probab , color = color.white) ////probability


もっと