Strategi Pembalikan Rata-rata Pergerakan Ganda


Tanggal Pembuatan: 2023-12-25 13:24:14 Akhirnya memodifikasi: 2023-12-25 13:24:14
menyalin: 1 Jumlah klik: 575
1
fokus pada
1621
Pengikut

Strategi Pembalikan Rata-rata Pergerakan Ganda

Ringkasan

Strategi pembalikan rata-rata bergerak ganda adalah strategi perdagangan kuantitatif yang menggunakan rata-rata bergerak ganda untuk mengidentifikasi tren jangka pendek dan jangka panjang. Strategi ini menggabungkan rata-rata bergerak sederhana 10 hari dan rata-rata bergerak sederhana 200 hari, untuk menangkap peluang pembelian mundur jangka pendek di bawah tren bullish jangka panjang. Strategi ini juga memiliki beberapa mekanisme pelacakan tren dan pengendalian kerugian.

Prinsip Strategi

Strategi pembalikan rata-rata bergerak ganda didasarkan pada asumsi berikut:

  1. 200-day SMA dapat mengidentifikasi arah tren jangka panjang pasar. Ketika harga berada di atas garis 200-day, itu berarti bahwa saham besar berada dalam tren bullish jangka panjang.

  2. Moving Average 10 Hari Sederhana dapat mengidentifikasi penurunan pasar dalam waktu singkat. Ketika harga berada di bawah garis 10 hari, itu menunjukkan penurunan dalam waktu singkat.

  3. Dalam tren bullish jangka panjang, setiap pullback jangka pendek dapat dianggap sebagai peluang untuk penangkapan yang lebih efisien.

Berdasarkan asumsi di atas, logika pembuatan sinyal perdagangan untuk strategi ini adalah:

  1. Ketika harga close out melewati garis 200 hari dan pada saat yang sama melewati garis 10 hari, ini mewakili tren bullish jangka panjang, dan ada pembalikan dalam jangka pendek, sehingga menghasilkan sinyal beli.

  2. Ketika memegang posisi, jika harga penutupan kembali melewati garis 10 hari, yang mewakili pembalikan tren jangka pendek, stop loss harus segera dihentikan. Selain itu, jika harga saham mengalami penurunan yang lebih besar yang menyebabkan kerugian mencapai batas stop loss yang telah ditetapkan sebelumnya, stop loss juga akan diaktifkan.

  3. Ketika saham besar secara keseluruhan mengalami penurunan yang lebih besar, Anda dapat mengambil kesempatan untuk melakukan penarikan rendah, dan memutuskan kapan tepat waktu untuk membeli dengan batas penurunan yang telah ditetapkan sebelumnya.

Dengan desain seperti itu, Anda dapat secara efektif melakukan penarikan rendah dalam tren bullish jangka panjang, dan mengatur stop loss untuk mengendalikan risiko.

Keunggulan Strategis

Strategi pembalikan rata-rata bergerak ganda memiliki beberapa keuntungan sebagai berikut:

  1. Strategi yang jelas dan sederhana, mudah dipahami dan diterapkan.
  2. Dengan menggunakan filter moving average ganda, Anda dapat secara efektif mengidentifikasi tren jangka panjang dan pendek dari saham dan saham.
  3. Efisiensi waktu yang lebih baik. Efisiensi penggunaan dana yang lebih tinggi dapat diperoleh dengan menangkap pembalikan jangka pendek.
  4. Dengan mekanisme built-in stop loss, Anda dapat mengontrol kerugian dari posisi individu.
  5. Parameter dapat diatur secara fleksibel, untuk indeks saham besar dan saham populer.

Risiko Strategis

Meskipun ada keuntungan yang jelas dari strategi pembalikan rata-rata bergerak ganda, ada juga risiko berikut:

  1. Pada saat ini, strategi harus dihentikan sementara dan menunggu tren yang jelas untuk memulai.
  2. Hanya mengandalkan rata-rata bergerak untuk menilai tren dan menghasilkan sinyal, mungkin akan kehilangan fitur lain yang efektif. Anda dapat mempertimbangkan untuk memperkenalkan lebih banyak indikator untuk pengoptimalan kombinasi.
  3. Metode penghentian kerugian tunggal mungkin terlalu kaku, dan berbagai jenis mekanisme penghentian kerugian dapat diuji.
  4. Parameter kebijakan perlu disesuaikan dan dioptimalkan untuk standar yang berbeda, jika tidak, itu akan mempengaruhi stabilitas.

Arah optimasi strategi

Ada beberapa cara untuk memaksimalkan strategi inversi rata-rata bergerak ganda:

  1. Uji kombinasi rata-rata bergerak dengan panjang yang berbeda untuk mencari parameter optimal.
  2. Menambahkan indikator tambahan lainnya untuk membentuk sinyal yang lebih stabil. Misalnya, volume transaksi, indikator getaran, dll.
  3. Uji berbagai jenis stop loss, seperti tracking stop loss, time stop loss, dan lain-lain.
  4. Optimalkan parameter pembelian dan stop loss agar dapat beradaptasi dengan perubahan kondisi pasar.
  5. Menambahkan algoritma pembelajaran mesin untuk mengoptimalkan parameter dengan lebih banyak data historis.

Meringkaskan

Strategi pembalikan rata-rata bergerak ganda secara keseluruhan adalah strategi kuantitatif yang sangat praktis. Ini memanfaatkan keunggulan rata-rata bergerak untuk melakukan penarikan dan kerugian rendah dalam banyak hal yang panjang, sehingga menghasilkan keuntungan satu putaran yang lebih tinggi.

Kode Sumber Strategi
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
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/
// © Gold_D_Roger
//note: spreading 1 statement over multiple lines needs 1 apce + 1 tab | multi line function is 1 tab
//Recommended tickers: SPY (D), QQQ (D) and big indexes, AAPL (4H)

//@version=5
strategy("Davin's 10/200MA Pullback on SPY Strategy v2.0",
     overlay=true,
     initial_capital=10000,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=10, // 10% of equity on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.1) //Insert your broker's rate, IB is 0.005USD or tiered

//Best parameters
// SPY D
// Stop loss 0.15
// commission of 0.005 USD using Interactive brokers
// Exit on lower close 
// Buy more when x% down --> 14%
// DO NOT include stop condition using MA crossover

// Get User Input
i_ma1           = input.int(title="MA Length 1", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA 200")
i_ma2           = input.int(title="MA Length 2", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA 10")
i_ma3           = input.int(title="MA Length 3", defval=50, step=1, group="Strategy Parameters", tooltip="MA for crossover signals`")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.15, step=0.01, group="Strategy Parameters", tooltip="Hard stop loss of 10%")
i_startTime     = input(title="Start filter", defval=timestamp("01 Jan 2013 13:30 +0000"), group="Time filter", tooltip="Start date and time to begin")
i_endTime       = input(title="End filter", defval=timestamp("01 Jan 2099 19:30 +0000"), group="Time filter", tooltip="End date and time to stop")
i_lowerClose    = input.bool(title="Exit on lower close", defval=true, group="Strategy Parameters", tooltip="Wait for lower close after above 10SMA before exiting") // optimise exit strat, boolean type creates tickbox type inputs
i_contrarianBuyTheDip = input.bool(title="Buy whenever more than x% drawdown", defval=true, group="Strategy Parameters", tooltip="Buy the dip! Whenever x% or more drawdown on SPY")
i_contrarianTrigger = input.int(title="Trigger % drop to buy the dip", defval=14, step=1, group="Strategy Parameters", tooltip="% drop to trigger contrarian Buy the Dip!") 
//14% to be best for SPY 1D
//20% best for AMZN 1D
i_stopByCrossover_MA2_3 = input.bool(title="Include stop condition using MA crossover", defval=false, group="Strategy Parameters", tooltip="Sell when crossover of MA2/1 happens")

// Get indicator values
ma1 = ta.sma(close,i_ma1) //param 1
ma2 = ta.sma(close,i_ma2) //param 2
ma3 = ta.sma(close,i_ma3) //param 3
ma_9 = ta.ema(close,9) //param 2
ma_20 = ta.ema(close,20) //param 3

// Check filter(s)
f_dateFilter = true //make sure date entries are within acceptable range

// Highest price of the prev 52 days: https://www.tradingcode.net/tradingview/largest-maximum-value/#:~:text=()%20versus%20ta.-,highest(),max()%20and%20ta.
highest52 = ta.highest(high,52)
overall_change = ((highest52 - close[0]) / highest52) * 100

// Check buy/sell conditions
var float buyPrice = 0 //intialise buyPrice, this will change when we enter a trade ; float = decimal number data type 0.0
buyCondition  = (close > ma1 and close < ma2 and strategy.position_size == 0 and f_dateFilter) or (strategy.position_size == 0 and i_contrarianBuyTheDip==true and overall_change > i_contrarianTrigger and f_dateFilter) // higher than 200sma, lower than short term ma (pullback) + avoid pyramiding positions
sellCondition = close > ma2 and strategy.position_size > 0 and (not i_lowerClose or close < low[1])  //check if we already in trade + close above 10MA; 
// third condition: EITHER i_lowerClose not turned on OR closing price has to be < previous candle's LOW [1]

stopDistance  = strategy.position_size > 0 ? ((buyPrice - close)/close) : na // check if in trade > calc % drop dist from entry, if not na
stopPrice     = strategy.position_size > 0 ? (buyPrice - (buyPrice * i_stopPercent)) : na // calc SL price if in trade, if not, na
stopCondition = (strategy.position_size > 0 and stopDistance > i_stopPercent) or (strategy.position_size > 0 and (i_stopByCrossover_MA2_3==true and ma3 < ma1))


// Enter positions
if buyCondition 
    strategy.entry(id="Long", direction=strategy.long) //long only

    
if buyCondition[1] // if buyCondition is true prev candle
    buyPrice := open // entry price = current bar opening price

// Exit position
if sellCondition or stopCondition 
    strategy.close(id="Long", comment = "Exit" + (stopCondition ? "Stop loss=true" : "")) // if condition? "Value for true" : "value for false"
    buyPrice := na //reset buyPrice

// Plot
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset = -1)
plot(ma1, color=color.blue) //defval=200
plot(ma2, color=color.white) //defval=10
plot(ma3, color=color.yellow) // defval=50