Strategi Crossover Purata Bergerak

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

img

Ringkasan

Strategi ini berdasarkan prinsip persilangan purata bergerak. Ia pergi panjang apabila purata bergerak jangka pendek melintasi di atas purata bergerak jangka panjang dari bawah, dan pergi pendek apabila purata bergerak jangka pendek melintasi di bawah purata bergerak jangka panjang dari atas.

Logika Strategi

Strategi ini terutamanya mengira purata bergerak sederhana jangka pendek dan jangka panjang, dan menentukan arah trend berdasarkan persilangan mereka.

Secara khusus, ia mula-mula mengira purata bergerak jangka pendek xMA dan purata bergerak jangka panjang, di mana tempoh jangka pendek adalah Len, dan tempoh jangka panjang adalah 2*Len.

Kemudian ia memeriksa sama ada MA jangka pendek melintasi di atas MA jangka panjang, dan menghasilkan isyarat panjang jika persilangan berlaku.

Apabila menerima isyarat panjang, ia membuka kedudukan panjang pada harga pasaran jika tidak ada kedudukan. Apabila menerima isyarat pendek, ia membuka kedudukan pendek pada harga pasaran jika tidak ada kedudukan.

Di samping itu, titik stop loss dan take profit dikonfigurasi. Untuk perdagangan panjang, stop loss ditetapkan pada harga masuk - peratusan stop loss * harga masuk, dan mengambil keuntungan pada harga masuk + mengambil peratusan keuntungan * harga masuk. Untuk perdagangan pendek, stop loss ditetapkan pada harga masuk + peratusan stop loss * harga masuk, dan mengambil keuntungan pada harga masuk - mengambil peratusan keuntungan * harga masuk.

Akhirnya, purata bergerak digambarkan untuk visualisasi untuk membantu penentuan trend.

Kelebihan

  • Mudah dan mudah difahami, sesuai untuk pemula.

  • Dapat mengesan dengan berkesan trend pasaran berdasarkan crossover purata bergerak.

  • Risiko dikawal dengan mengkonfigurasi stop loss dan mengambil keuntungan.

  • Visualisasi purata bergerak secara intuitif mencerminkan perubahan trend.

Risiko

  • Purata bergerak mempunyai kesan kelewatan, yang boleh menyebabkan kehilangan titik kemasukan terbaik.

  • Konfigurasi stop loss yang tidak betul boleh menyebabkan stop terlalu lebar atau terlalu ketat.

  • Whipsawing harga boleh menghasilkan isyarat palsu.

  • Mengoptimumkan semata-mata berdasarkan tempoh purata bergerak boleh membawa kepada overfit.

Risiko ini boleh dikurangkan dengan menggunakan hentian yang lebih longgar, mengoptimumkan kombinasi tempoh purata bergerak, menambah penunjuk penapis dll.

Arahan pengoptimuman

  • Tambah penunjuk lain seperti MACD, KDJ untuk penapisan untuk mengelakkan isyarat palsu.

  • Mengoptimumkan gabungan tempoh purata bergerak pendek dan panjang untuk mencari parameter yang optimum.

  • Uji strategi Stop Loss / Take Profit yang berbeza seperti trailing stop.

  • Tambah saiz kedudukan untuk mengoptimumkan penggunaan modal.

Ringkasan

Strategi ini mempunyai logik yang jelas dan mudah, boleh mengesan trend dengan berkesan berdasarkan persilangan purata bergerak, dan mempunyai risiko yang boleh dikawal. Ia sesuai untuk pemula belajar. Tetapi hanya bergantung pada purata bergerak boleh menghasilkan isyarat palsu. Masih ada banyak ruang untuk mengoptimumkannya dalam pelbagai aspek untuk menjadikannya lebih mantap.


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