Moving Average Crossover + Strategi Momentum Garis Perlahan MACD

Penulis:ChaoZhang, Tarikh: 2024-04-12 17:16:06
Tag:SMAEMAMACD

img

Ringkasan

Strategi ini menggabungkan crossover purata bergerak dan penunjuk MACD sebagai isyarat perdagangan utama. Ia menggunakan crossover purata bergerak pantas dengan pelbagai purata bergerak perlahan sebagai isyarat kemasukan, dan nilai positif / negatif histogram garis perlahan MACD sebagai pengesahan trend. Strategi menetapkan pelbagai tahap mengambil keuntungan dan stop-loss semasa kemasukan, dan terus menyesuaikan tahap stop-loss apabila masa memegang meningkat untuk mengunci keuntungan.

Prinsip Strategi

  1. Apabila MA pantas melintasi di atas MA1 yang perlahan, harga penutupan di atas MA2 yang perlahan, dan histogram MACD lebih besar daripada 0, pergi panjang;
  2. Apabila MA pantas melintasi di bawah MA perlahan 1, harga penutupan adalah di bawah MA perlahan 2, dan histogram MACD kurang daripada 0, pergi pendek;
  3. Tetapkan pelbagai tahap mengambil keuntungan dan berhenti rugi semasa masuk. Tahap mengambil keuntungan adalah berdasarkan keutamaan risiko, sementara tahap berhenti rugi disesuaikan secara berterusan apabila masa pegangan meningkat untuk secara beransur-ansur mengunci keuntungan;
  4. Tempoh purata bergerak, parameter MACD, tahap mengambil keuntungan dan stop-loss, dan lain-lain, semuanya boleh disesuaikan dengan fleksibel untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

Strategi ini menggunakan persilangan MA untuk menangkap trend dan MACD untuk mengesahkan arah, meningkatkan kebolehpercayaan penghakiman trend.

Kelebihan Strategi

  1. MA crossover adalah kaedah trend klasik yang boleh menangkap pembentukan trend tepat pada masanya;
  2. Penggunaan pelbagai MA boleh menilai lebih komprehensif kekuatan dan kelangsungan trend;
  3. Indikator MACD dapat mengenal pasti trend dengan berkesan dan menilai momentum, berfungsi sebagai pelengkap kuat untuk persilangan MA;
  4. Reka bentuk mengambil keuntungan berganda dan stop-loss dinamik boleh mengawal risiko dan membiarkan keuntungan berjalan, meningkatkan ketahanan sistem;
  5. Parameter boleh diselaraskan dan disesuaikan, dan boleh ditetapkan secara fleksibel mengikut instrumen dan jangka masa yang berbeza.

Risiko Strategi

  1. Perpindahan MA mempunyai risiko kelewatan isyarat, yang mungkin terlepas trend awal atau mengejar tinggi;
  2. Tetapan parameter yang tidak betul boleh membawa kepada perdagangan berlebihan atau tempoh penahan yang terlalu lama, meningkatkan kos dan risiko;
  3. Tahap stop loss yang terlalu agresif boleh menyebabkan stop-out yang terlalu awal, manakala tahap take profit yang terlalu konservatif boleh menjejaskan pulangan;
  4. Perubahan trend mendadak atau anomali pasaran boleh menyebabkan strategi gagal.

Risiko ini boleh dikawal dengan mengoptimumkan parameter, menyesuaikan kedudukan, menetapkan syarat tambahan, dll. Walau bagaimanapun, tidak ada strategi yang dapat mengelakkan risiko sepenuhnya, dan pelabur perlu memperlakukannya dengan berhati-hati.

Arahan Pengoptimuman Strategi

  1. Mempertimbangkan pengenalan lebih banyak penunjuk, seperti RSI, Bollinger Bands, dan lain-lain, untuk mengesahkan lagi trend dan isyarat;
  2. Melakukan pengoptimuman yang lebih halus mengenai penetapan tahap mengambil keuntungan dan stop-loss, seperti mempertimbangkan ATR atau tahap berasaskan peratusan;
  3. Sesuaikan parameter secara dinamik berdasarkan turun naik pasaran untuk meningkatkan kesesuaian;
  4. Memperkenalkan modul saiz kedudukan untuk menyesuaikan saiz kedudukan berdasarkan keadaan risiko;
  5. Mengumpul strategi untuk mewujudkan portfolio strategi untuk mempelbagaikan risiko.

Melalui pengoptimuman dan penambahbaikan yang berterusan, strategi boleh menjadi lebih kukuh dan boleh dipercayai, lebih menyesuaikan diri dengan persekitaran pasaran yang berubah.

Ringkasan

Strategi ini menggabungkan penyambungan MA dan penunjuk MACD untuk membina sistem dagangan yang agak lengkap. Reka bentuk pelbagai MA dan pelbagai operasi meningkatkan keupayaan penangkapan trend dan kawalan risiko sistem. Logik strategi jelas dan mudah difahami dan dilaksanakan, sesuai untuk pengoptimuman dan penambahbaikan lanjut. Walau bagaimanapun, ia masih perlu digunakan dengan berhati-hati dalam amalan, memberi perhatian kepada kawalan risiko. Dengan pengoptimuman dan konfigurasi yang munasabah, strategi ini berpotensi menjadi alat dagangan yang mantap dan berkesan.


/*backtest
start: 2023-04-06 00:00:00
end: 2024-04-11 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/
// © maxmirus

//@version=5
strategy("My strategy_Cross_SMA(EMA)+Macd,slow3",overlay=true)
// ver 4
// Date Inputs
startDate     = input(timestamp('2019-01-01T00:00:00+0300'), ''                              , inline='time1',
  tooltip=' Время первого бара расчета стратегии. Первый ордер может быть выставлен на следующем баре после стартового.')
finishDate    = input(timestamp('2044-01-01T00:00:00+0300'), ''                              , inline='time2',
  tooltip=' Время после которого больше не будут размещаться ордера входа в позицию.')

// Calculate start/end date and time condition
time_cond = true

//SMA(EMA) Inputs

fast=input.int(12, title="Fastlength",group="MA")
slow1=input.int(54,title="Slowlength1",group="MA")
slow2=input.int(100, title="Slowlength2",group="MA")
slow3=input.int(365, title="Slowlength3",group="MA")

fastma=input.string(title="Fastlength", defval="EMA",options=["SMA","EMA"],group="MA")
slowma1=input.string(title="Slowlength1", defval="EMA",options=["SMA","EMA"],group="MA")
slowma2=input.string(title="Slowlength2", defval="EMA",options=["SMA","EMA"],group="MA")
slowma3=input.string(title="Slowlength3", defval="EMA",options=["SMA","EMA"],group="MA")

fastlength = fastma == "EMA" ? ta.ema(close, fast) : ta.sma(close, fast)
slowlength1 = slowma1 == "EMA" ? ta.ema(close, slow1) : ta.sma(close, slow1)
slowlength2 = slowma2 == "EMA" ? ta.ema(close, slow2) : ta.sma(close, slow2)
slowlength3 = slowma3 == "EMA" ? ta.ema(close, slow3) : ta.sma(close, slow3)

//Macd Inputs

macdfastline = input.int(12, title="FastMacd",group="MACD")
macdslowline = input.int(26,title="SlowMacd",group="MACD")
macdhistline = input.int(9,title="HistMacd",group="MACD")
src=input(defval=close,title="Source",group="MACD")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"],group="MACD")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"],group="MACD")


fast_ma = sma_source == "SMA" ? ta.sma(src, macdfastline) : ta.ema(src, macdfastline)
slow_ma = sma_source == "SMA" ? ta.sma(src, macdslowline) : ta.ema(src, macdslowline)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, macdhistline) : ta.ema(macd, macdhistline)
hist = macd - signal
//fastMACD = ta.ema(close, macdline) - ta.ema(close, signalline)
//signalMACD = ta.ema(MACD, histline)
//histMACD = MACD - aMACD

//EMA Plot

plot(fastlength,title="SMAfast",color=color.blue)
plot(slowlength1,title="SMAslow1",color=color.orange)
plot(slowlength2,title="SMAslow2",color=color.red)
plot(slowlength3,title="SMAslow3",color=color.black)

//Macd plot
//col_macd = input(#2962FF, "MACD Line  ", group="Color Settings", inline="MACD")
//col_signal = input(#FF6D00, "Signal Line  ", group="Color Settings", inline="Signal")
//col_grow_above = input(#26A69A, "Above   Grow", group="Histogram", inline="Above")
//col_fall_above = input(#B2DFDB, "Fall", group="Histogram", inline="Above")
//col_grow_below = input(#FFCDD2, "Below Grow", group="Histogram", inline="Below")
//col_fall_below = input(#FF5252, "Fall", group="Histogram", inline="Below")

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)

//Take profit
tp1=input.float(5.1,title="Take Profit1_%",step=0.1)/100
tp2=input.float(10.1,title="Take Profit2_%",step=0.1)/100

//Stop loss
sl1=input.float(5.1,title="Stop loss1_%",step=0.1)/100
sl2=input.float(0.1,title="Stop loss2_%",step=0.1)/100
sl3=input.float(-5.5,title="Stop loss3_%", step=0.1)/100

//Qty closing position

Qty1 = input.float(0.5, title="QtyClosingPosition1",step=0.01)
Qty2 = input.float(0.25, title="QtyClosingPosition2",step=0.01)

//Take profit Long and Short

LongTake1=strategy.position_avg_price*(1+tp1)
LongTake2=strategy.position_avg_price*(1+tp2)

ShortTake1=strategy.position_avg_price*(1-tp1)
ShortTake2=strategy.position_avg_price*(1-tp2)

//Plot Levels Take 
plot(strategy.position_size > 0 ? LongTake1 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongTake2 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortTake1 : na,color=color.green,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortTake2 : na,color=color.green,style=plot.style_linebr)

//Stop loss long and short

LongStop1=strategy.position_avg_price*(1-sl1)
LongStop2=strategy.position_avg_price*(1-sl2)
LongStop3=strategy.position_avg_price*(1-sl3)
ShortStop1=strategy.position_avg_price*(1+sl1)
ShortStop2=strategy.position_avg_price*(1+sl2)
ShortStop3=strategy.position_avg_price*(1+sl3)
//Stop=strategy.position_avg_price


//Plot Levels Stop
plot(strategy.position_size > 0 ? LongStop1 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongStop2 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size > 0 ? LongStop3 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop1 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop2 : na,color=color.red,style=plot.style_linebr)
plot(strategy.position_size < 0 ? ShortStop3 : na,color=color.red,style=plot.style_linebr)


//Entry condition

LongCondition1 = ta.crossover(fastlength, slowlength1)
LongCondition2 = close>slowlength2
LongCondition3 = time_cond
LongCondition4=close>slowlength3
//LongCondition5=slowlength100>slowlength3
LongCondition6 = hist > 0
buy=(LongCondition1 and LongCondition2 and LongCondition3 and LongCondition4 and LongCondition6 ) and strategy.position_size<=0
//longCondition3 = nz(strategy.position_size) == 0//если отсутствует открытая позиция


ShortCondition1 = ta.crossunder(fastlength, slowlength1)
ShortCondition2 = close<slowlength2
ShortCondition3 = time_cond
ShortCondition4=close<slowlength3
//ShortCondition5=slowlength100<slowlength3
ShortCondition6=hist < 0
sell=(ShortCondition1 and ShortCondition2 and ShortCondition3 and ShortCondition4 and ShortCondition6 ) and strategy.position_size>=0



//Strategy entry

strategy.cancel_all(not strategy.position_size)

if(buy)
    strategy.cancel_all()
    strategy.entry("Buy",strategy.long)
if(sell)
    strategy.cancel_all()
    strategy.entry("Sell",strategy.short)
    
//Strategy Long exit    

var int exitCounter=0

exitCounter := not strategy.position_size or strategy.position_size > 0 and strategy.position_size[1] < 0 or strategy.position_size < 0  and strategy.position_size[1] > 0 ? 0:
               strategy.position_size > 0 and strategy.position_size[1]>strategy.position_size?  exitCounter[1] + 1:
               strategy.position_size < 0 and strategy.position_size[1]<strategy.position_size?  exitCounter[1] - 1:
               exitCounter[1]
if strategy.position_size > 0 and strategy.position_size[1]<=0
    strategy.order("Take Long1",strategy.short, qty=math.abs(strategy.position_size*Qty1), limit=LongTake1, oca_name='Long1', oca_type=strategy.oca.cancel)
if strategy.position_size > 0  and strategy.position_size[1]<=0   
    strategy.order("Take Long2",strategy.short, qty=math.abs(strategy.position_size*Qty2), limit=LongTake2, oca_name='Long2', oca_type=strategy.oca.cancel)

    
if strategy.position_size > 0  and strategy.position_size[1]<=0   
    strategy.order("Stop Long1",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop1,oca_name='Long1',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==1
    strategy.order("Stop Long2",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop2,oca_name='Long2',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==2
    strategy.order("Stop Long3",strategy.short, qty=math.abs(strategy.position_size),stop=LongStop3)
    
    
    
    
//  Strategy Short exit  
    
    
if strategy.position_size < 0 and strategy.position_size[1]>=0
    strategy.order("Take Short1", strategy.long, qty=math.abs(strategy.position_size*Qty1), limit=ShortTake1, oca_name='Short1', oca_type=strategy.oca.cancel)
if strategy.position_size < 0 and strategy.position_size[1]>=0 
    strategy.order("Take Short2", strategy.long, qty=math.abs(strategy.position_size*Qty2), limit=ShortTake2, oca_name='Short2', oca_type=strategy.oca.cancel)


    
if strategy.position_size < 0 and strategy.position_size[1]>=0
    strategy.order("Stop Short1",strategy.long, qty=math.abs(strategy.position_size),stop=ShortStop1,oca_name='Short1',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==-1
    strategy.order("Stop Short2",strategy.long, qty=math.abs(strategy.position_size),stop=ShortStop2,oca_name='Short2',oca_type=strategy.oca.cancel)
if ta.change(exitCounter) and exitCounter==-2
    strategy.order("Stop Short3",strategy.long,qty=math.abs(strategy.position_size),stop=ShortStop3)
    



Berkaitan

Lebih lanjut