यह रणनीति चलती औसत क्रॉसओवर सिद्धांत पर आधारित है। यह लंबी जाती है जब अल्पकालिक चलती औसत नीचे से लंबी अवधि के चलती औसत से ऊपर पार करती है, और छोटी जाती है जब अल्पकालिक चलती औसत ऊपर से लंबी अवधि के चलती औसत से नीचे पार करती है। यह एक विशिष्ट प्रवृत्ति है जो रणनीति का पालन करती है।
रणनीति मुख्य रूप से अल्पकालिक और दीर्घकालिक सरल चलती औसत की गणना करती है और उनके क्रॉसओवर के आधार पर प्रवृत्ति की दिशा निर्धारित करती है।
विशेष रूप से, यह सबसे पहले अल्पकालिक चलती औसत xMA और दीर्घकालिक चलती औसत की गणना करता है, जहां अल्पकालिक अवधि Len है, और दीर्घकालिक अवधि 2*Len है।
फिर यह जांचता है कि क्या अल्पकालिक एमए दीर्घकालिक एमए से ऊपर है, और क्रॉसओवर होने पर एक लंबा संकेत उत्पन्न करता है। यह यह भी जांचता है कि क्या अल्पकालिक एमए दीर्घकालिक एमए से नीचे है, और क्रॉसओवर होने पर एक छोटा संकेत उत्पन्न करता है।
एक लंबा संकेत प्राप्त करने पर, यदि कोई स्थिति नहीं है तो यह बाजार मूल्य पर एक लंबी स्थिति खोलता है। एक छोटा संकेत प्राप्त करने पर, यदि कोई स्थिति नहीं है तो यह बाजार मूल्य पर एक छोटी स्थिति खोलता है।
इसके अतिरिक्त, स्टॉप लॉस और टेक प्रॉफिट पॉइंट कॉन्फ़िगर किए जाते हैं. लॉन्ग ट्रेड के लिए, स्टॉप लॉस एंट्री प्राइस - स्टॉप लॉस प्रतिशत * एंट्री प्राइस, और एंट्री प्राइस + टेक प्रॉफिट प्रतिशत * एंट्री प्राइस पर सेट होता है. शॉर्ट ट्रेड के लिए, स्टॉप लॉस एंट्री प्राइस + स्टॉप लॉस प्रतिशत * एंट्री प्राइस, और एंट्री प्राइस - टेक प्रॉफिट प्रतिशत * एंट्री प्राइस पर सेट होता है.
अंत में, प्रवृत्ति निर्धारण में सहायता के लिए विज़ुअलाइज़ेशन के लिए चलती औसत को ग्राफ किया जाता है।
सरल और समझने में आसान, शुरुआती के लिए उपयुक्त।
चलती औसत क्रॉसओवर के आधार पर बाजार के रुझानों को प्रभावी ढंग से ट्रैक कर सकता है।
स्टॉप लॉस और टेक प्रॉफिट को कॉन्फ़िगर करके जोखिमों को नियंत्रित किया जाता है।
मूविंग एवरेज का विज़ुअलाइज़ेशन ट्रेंड परिवर्तनों को सहज रूप से दर्शाता है।
मूविंग एवरेज के पीछे पड़ने के प्रभाव होते हैं, जिससे सबसे अच्छे प्रवेश बिंदुओं को याद किया जा सकता है।
गलत स्टॉप लॉस कॉन्फ़िगरेशन के परिणामस्वरूप स्टॉप बहुत चौड़े या बहुत तंग हो सकते हैं।
कीमतों में उतार-चढ़ाव से झूठे संकेत मिल सकते हैं।
केवल चलती औसत अवधि के आधार पर अनुकूलन करने से ओवरफिटिंग हो सकती है।
इन जोखिमों को ढीले स्टॉप का उपयोग करके, चलती औसत अवधि संयोजनों का अनुकूलन करके, फिल्टर संकेतकों आदि को जोड़कर कम किया जा सकता है।
गलत संकेतों से बचने के लिए फ़िल्टरिंग के लिए MACD, KDJ जैसे अन्य संकेतक जोड़ें।
इष्टतम मापदंडों को खोजने के लिए छोटी और लंबी चलती औसत अवधि के संयोजनों को अनुकूलित करें।
विभिन्न स्टॉप लॉस/टेक प्रॉफिट रणनीतियों जैसे ट्रेलिंग स्टॉप का परीक्षण करें।
पूंजी उपयोग को अनुकूलित करने के लिए स्थिति आकार जोड़ें।
इस रणनीति का एक स्पष्ट और सरल तर्क है, चलती औसत क्रॉसओवर के आधार पर प्रभावी ढंग से रुझानों को ट्रैक कर सकता है, और इसमें नियंत्रित जोखिम हैं। यह शुरुआती लोगों के लिए सीखने के लिए उपयुक्त है। लेकिन केवल चलती औसत पर भरोसा करने से झूठे संकेत उत्पन्न हो सकते हैं। इसे अधिक मजबूत बनाने के लिए इसे विभिन्न पहलुओं में अनुकूलित करने के लिए अभी भी बहुत जगह है।
/*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')