Moving Average Crossover and Upper Rail Breakthrough Impulse Strategy (Strategi Impulse untuk Perpindahan Rata-rata dan Perpindahan Kereta Api Atas)

Penulis:ChaoZhang, Tanggal: 2023-11-13 11:52:22
Tag:

img

Gambaran umum

Strategi ini memanfaatkan sinyal silang dari garis cepat dan garis lambat MACD, dikombinasikan dengan penilaian berdasarkan beberapa indikator lainnya, untuk menangkap sinyal terobosan dari garis indeks rata-rata bergerak secara tepat waktu dan membuat keputusan beli atau jual.

Logika Strategi

  1. Gunakan persilangan garis cepat MACD dan garis lambat sebagai sinyal perdagangan utama. Ketika garis cepat melintasi di atas garis lambat, ambil posisi panjang. Ketika garis cepat melintasi di bawah garis lambat, ambil posisi pendek.

  2. Masukkan indikator RSI untuk menentukan kondisi overbought dan oversold. Di bawah garis tengah menunjukkan panjang, sementara di atas menunjukkan pendek.

  3. Bandingkan harga penutupan saat ini dengan garis SMA periode tertentu.

  4. Hitung tingkat 0,5 Fibonacci dari nilai tertinggi periode tertentu sebagai resistance untuk long. Hitung tingkat 0,5 Fibonacci dari nilai terendah periode tertentu sebagai support untuk short.

  5. Ambil panjang ketika garis cepat melintasi di atas dan harga berada di bawah support. Ambil pendek ketika garis cepat melintasi di bawah dan harga berada di atas resistance.

  6. Mengadopsi mekanisme stop loss trailing. Stop loss ditetapkan pada persentase tertentu dari harga masuk pada awalnya. Ketika kerugian mencapai tingkat tertentu, beralih ke stop loss trailing bertahap.

Keuntungan

  1. Strategi ini sepenuhnya memanfaatkan sinyal crossover MACD, yang merupakan sinyal perdagangan indikator teknis klasik dan efektif.

  2. Menggabungkan konfirmasi dari beberapa indikator seperti RSI dan SMA dapat menyaring sinyal palsu dan meningkatkan keandalan.

  3. Menghitung tingkat dukungan dan resistensi dinamis untuk perdagangan breakout dapat menangkap tren yang lebih besar.

  4. Stop loss trailing dapat mengunci sebagian besar keuntungan sambil mengendalikan risiko.

  5. Logika strategi yang jelas dan sederhana, mudah dipahami dan dikuasai untuk pemula.

Risiko

  1. Indikator MACD memiliki masalah yang tertinggal dan mungkin melewatkan titik masuk dan keluar yang optimal.

  2. Menggabungkan beberapa indikator meningkatkan kompleksitas dan risiko sinyal yang bertentangan.

  3. Ada risiko pecah yang salah saat menghitung dukungan dan resistensi secara dinamis.

  4. Trailing stop loss dapat keluar prematur dalam tren yang kuat, gagal untuk naik tren.

  5. Parameter membutuhkan pengujian dan pengoptimalan berulang, parameter yang tidak tepat berdampak negatif pada kinerja.

Arahan Optimasi

  1. Uji kombinasi parameter yang berbeda untuk mengoptimalkan periode MACD.

  2. Memperkenalkan lebih banyak indikator seperti Bollinger Bands, KDJ untuk analisis multidimensi.

  3. Sertakan lebih banyak faktor untuk menilai kelayakan dukungan dan perlawanan.

  4. Carilah mekanisme stop loss yang lebih canggih seperti stop berbasis waktu atau volatilitas.

  5. Tambahkan modul optimasi otomatis untuk optimasi parameter otomatis.

Ringkasan

Strategi ini menggabungkan MACD, RSI, SMA dan indikator lain untuk menangkap sinyal terobosan rata-rata bergerak secara oportunistik. Ini termasuk dalam strategi perdagangan breakout jangka pendek yang khas. Ada beberapa keterlambatan dalam generasi sinyalnya, tetapi akurasi dapat ditingkatkan melalui optimasi parameter. Secara keseluruhan, ini adalah strategi dengan logika yang sederhana dan jelas, mudah dipahami bagi kebanyakan, dan layak untuk pengujian dan optimasi lebih lanjut.


/*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


Lebih banyak