Strategi Crossover Rata-rata Bergerak

Penulis:ChaoZhang, Tanggal: 2023-10-24 16:39:40
Tag:

img

Gambaran umum

Strategi ini didasarkan pada prinsip crossover rata-rata bergerak. Ini pergi panjang ketika rata-rata bergerak jangka pendek melintasi di atas rata-rata bergerak jangka panjang dari bawah, dan pergi pendek ketika rata-rata bergerak jangka pendek melintasi di bawah rata-rata bergerak jangka panjang dari atas.

Logika Strategi

Strategi ini terutama menghitung rata-rata bergerak sederhana jangka pendek dan jangka panjang, dan menentukan arah tren berdasarkan persilangan mereka.

Secara khusus, pertama-tama menghitung rata-rata bergerak jangka pendek xMA dan rata-rata bergerak jangka panjang, di mana periode jangka pendek adalah Len, dan periode jangka panjang adalah 2*Len.

Kemudian ia memeriksa apakah MA jangka pendek melintasi di atas MA jangka panjang, dan menghasilkan sinyal panjang jika crossover terjadi.

Setelah menerima sinyal panjang, ia membuka posisi panjang dengan harga pasar jika tidak ada posisi. Setelah menerima sinyal pendek, ia membuka posisi pendek dengan harga pasar jika tidak ada posisi.

Selain itu, titik stop loss dan take profit dikonfigurasi. Untuk perdagangan panjang, stop loss ditetapkan pada harga masuk - stop loss percentage * harga masuk, dan take profit pada harga masuk + take profit percentage * harga masuk. Untuk perdagangan pendek, stop loss ditetapkan pada harga masuk + stop loss percentage * harga masuk, dan take profit pada harga masuk - take profit percentage * harga masuk.

Akhirnya, rata-rata bergerak digambarkan untuk visualisasi untuk membantu penentuan tren.

Keuntungan

  • Sederhana dan mudah dimengerti, cocok untuk pemula.

  • Dapat secara efektif melacak tren pasar berdasarkan crossover rata-rata bergerak.

  • Risiko dikendalikan dengan mengkonfigurasi stop loss dan take profit.

  • Visualisasi rata-rata bergerak secara intuitif mencerminkan perubahan tren.

Risiko

  • Rata-rata bergerak memiliki efek keterlambatan, yang dapat menyebabkan kehilangan titik masuk terbaik.

  • Konfigurasi stop loss yang tidak benar dapat mengakibatkan stop terlalu lebar atau terlalu ketat.

  • Whipsawing harga dapat menghasilkan sinyal palsu.

  • Mengoptimalkan hanya berdasarkan periode rata-rata bergerak dapat menyebabkan overfit.

Risiko ini dapat dikurangi dengan menggunakan stop yang lebih longgar, mengoptimalkan kombinasi periode rata-rata bergerak, menambahkan indikator filter dll.

Arahan Optimasi

  • Tambahkan indikator lain seperti MACD, KDJ untuk penyaringan untuk menghindari sinyal palsu.

  • Mengoptimalkan kombinasi periode rata-rata bergerak pendek dan panjang untuk menemukan parameter yang optimal.

  • Uji strategi stop loss/take profit yang berbeda seperti trailing stop.

  • Tambahkan ukuran posisi untuk mengoptimalkan pemanfaatan modal.

Ringkasan

Strategi ini memiliki logika yang jelas dan sederhana, dapat melacak tren secara efektif berdasarkan crossover rata-rata bergerak, dan memiliki risiko yang dapat dikendalikan. Ini cocok untuk pemula untuk belajar dari. Tetapi hanya mengandalkan rata-rata bergerak dapat menghasilkan sinyal palsu. Masih ada banyak ruang untuk mengoptimalkannya dalam berbagai aspek untuk membuatnya lebih kuat.


/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')

Lebih banyak