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.
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.
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.
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.
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.
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')