Artikel ini memperkenalkan strategi perdagangan kuantitatif berdasarkan prinsip crossover purata bergerak. Strategi menentukan arah panjang / pendek dengan membandingkan harga dengan purata bergerak, dan menetapkan tahap keuntungan dan stop loss untuk mengawal risiko. Kod strategi ditulis dalam Pine Script dan bersepadu dengan API platform perdagangan Dhan, yang membolehkan perdagangan automatik isyarat strategi.
Inti strategi ini adalah purata bergerak. Ia mengira purata bergerak mudah harga penutupan dalam tempoh tertentu sebagai asas untuk menilai trend. Apabila harga melintasi di atas purata bergerak, ia menjana isyarat panjang, dan apabila ia melintasi di bawah, ia menjana isyarat pendek. Fungsi exrem digunakan untuk menapis isyarat berulang berterusan dan meningkatkan kualiti isyarat. Strategi menetapkan tahap mengambil keuntungan dan menghentikan kerugian yang sesuai berdasarkan arah kedudukan semasa dan hubungan antara harga dan purata bergerak, mengawal risiko dan pulangan setiap perdagangan.
Perpindahan purata crossover adalah kaedah trend yang mudah dan mudah digunakan yang dapat menangkap dengan berkesan trend pasaran jangka menengah hingga panjang. Dengan tetapan parameter yang munasabah, strategi dapat memperoleh pulangan yang stabil di pasaran trend. Tetapan mengambil keuntungan dan menghentikan kerugian membantu mengawal penarikan dan meningkatkan nisbah risiko-balasan. Logik kod strategi jelas, menggunakan modularisasi fungsi, dengan ketara dan skalabiliti yang kuat. Di samping itu, strategi mengintegrasikan API platform Dhan untuk merealisasikan pelaksanaan pesanan automatik, meningkatkan kecekapan pelaksanaan.
Purata bergerak adalah penunjuk yang tertinggal secara semula jadi. Semasa titik perubahan pasaran, isyarat mungkin tertunda, yang membawa kepada peluang perdagangan optimum yang hilang atau isyarat palsu. Tetapan parameter yang tidak betul akan mempengaruhi prestasi strategi dan perlu dioptimumkan mengikut ciri dan jangka masa pasaran yang berbeza. Peratusan tetap mengambil keuntungan dan berhenti kerugian mungkin tidak menyesuaikan diri dengan perubahan dalam turun naik pasaran, dan juga terdapat risiko kerugian kerana tetapan parameter yang tidak betul.
Strategi crossover purata bergerak adalah strategi perdagangan kuantitatif yang mudah dan praktikal yang dapat memperoleh keuntungan dalam pasaran trend melalui penjejakan trend dan kawalan stop loss. Walau bagaimanapun, strategi itu sendiri mempunyai batasan tertentu dan perlu dioptimumkan dan ditingkatkan mengikut ciri pasaran dan keutamaan risiko. Dalam aplikasi praktikal, juga perlu memberi perhatian kepada pelaksanaan disiplin yang ketat dan kawalan risiko yang betul. Pengaturcaraan strategi boleh menggunakan bahasa profesional seperti Pine Script dan mengintegrasikan API platform perdagangan untuk merealisasikan pelaksanaan strategi automatik.
/*backtest start: 2024-05-01 00:00:00 end: 2024-05-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © syam-mohan-vs @ T7 - wwww.t7wealth.com www.t7trade.com //This is an educational code done to describe the fundemantals of pine scritpting language and integration with Indian discount broker Dhan. This strategy is not tested or recommended for live trading. //@version=5 strategy("Pine & Dhan - Moving Average Crossover Strategy", overlay=true) //Remove excess signals exrem(condition1, condition2) => temp = false temp := na(temp[1]) ? false : not temp[1] and condition1 ? true : temp[1] and condition2 ? false : temp[1] ta.change(temp) == true ? true : false // Define MA period ma_period = input(20, title = "MA Length") // Define target and stop loss levels target_percentage = input.float(title="Target Profit (%)", defval=2.0) stop_loss_percentage = input.float(title="Stop Loss (%)", defval=1.0) // Calculate the MA ma = ta.sma(close, ma_period) // Entry conditions long_entry = close >= ma short_entry = close < ma // Calculate target and stop loss prices target_price = long_entry ? strategy.position_avg_price + (close * (target_percentage / 100)) : strategy.position_avg_price - (close * (target_percentage / 100)) stop_loss_price = short_entry ? strategy.position_avg_price + (close * (stop_loss_percentage/ 100)) : strategy.position_avg_price - (close * (stop_loss_percentage / 100)) long_entry := exrem(long_entry,short_entry) short_entry := exrem(short_entry,long_entry) // Plot the MA plot(ma, color=color.blue, linewidth=2, title="MA") // Plot the entry and exit signals plotshape(long_entry, style=shape.arrowup, color=color.green, size=size.small,location = location.belowbar) plotshape(short_entry, style=shape.arrowdown, color=color.red, size=size.small,location = location.abovebar) //Find absolute value of positon size to exit position properly size = math.abs(strategy.position_size) //Replace these four JSON strings with those generated from user Dhan account long_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"I","sort_order":"1","price":"0"}]}' long_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' short_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}' // Submit orders based on signals if(strategy.position_size == 0) if long_entry strategy.order("Long", strategy.long,alert_message=long_msg) if short_entry strategy.order("Short", strategy.short,alert_message=short_msg) if(strategy.position_size > 0) if(short_entry) strategy.order("Short", strategy.short, qty = size, alert_message=short_msg) else strategy.exit("Long Exit", from_entry="Long", qty = size, stop=stop_loss_price, limit= target_price, alert_message=long_exit_msg) if(strategy.position_size < 0) if(long_entry) strategy.order("Long", strategy.long, qty = size, alert_message=long_msg) else strategy.exit("Short Exit", from_entry="Short", qty = size, stop=stop_loss_price, limit= target_price, alert_message=short_exit_msg)