चलती औसत क्रॉसओवर रणनीति

लेखक:चाओझांग, दिनांक: 2023-10-10 10:44:25
टैगः

अवलोकन

मूविंग एवरेज क्रॉसओवर रणनीति मूविंग एवरेज पर आधारित एक आम तौर पर इस्तेमाल की जाने वाली ट्रेडिंग रणनीति है। यह एक तेज मूविंग एवरेज और एक धीमी मूविंग एवरेज के क्रॉसओवर का उपयोग ट्रेडिंग सिग्नल के रूप में करती है। जब तेजी से मूविंग एवरेज नीचे से धीमी मूविंग एवरेज के ऊपर से पार हो जाती है, तो यह एक खरीद संकेत है। जब तेजी से मूविंग एवरेज ऊपर से धीमी मूविंग एवरेज के नीचे से पार हो जाती है, तो यह एक बिक्री संकेत है। यह रणनीति 50 दिनों के एमए को तेज एमए और 200 दिनों के एमए को धीमी एमए के रूप में उपयोग करती है।

रणनीति तर्क

इस रणनीति का मूल तर्क चलती औसत के सिद्धांत पर आधारित है। चलती औसत प्रभावी रूप से मूल्य उतार-चढ़ाव को चिकनी कर सकती है और मूल्य रुझानों को इंगित कर सकती है। तेजी से एमए मूल्य परिवर्तनों के प्रति अधिक संवेदनशील है और प्रवृत्ति उलट बिंदुओं को पकड़ सकती है। धीमी एमए मूल्य परिवर्तनों के प्रति कम संवेदनशील है और अल्पकालिक उतार-चढ़ाव को फ़िल्टर कर सकती है। जब तेज एमए धीमी एमए से ऊपर जाता है, तो यह कीमतों में एक अपट्रेंड का संकेत देता है। जब तेज एमए धीमी एमए से नीचे जाता है, तो यह कीमतों में एक डाउनट्रेंड का संकेत देता है।

विशेष रूप से, यह रणनीति पहले 50-दिवसीय एमए और 200-दिवसीय एमए को परिभाषित करती है। लंबी प्रवेश स्थिति तब निर्धारित की जाती है जब तेज एमए धीमी एमए से ऊपर पार हो जाती है। छोटी प्रवेश स्थिति तब निर्धारित की जाती है जब तेज एमए धीमी एमए से नीचे पार हो जाती है। ओवरलैपिंग ट्रेडों से बचने के लिए, रणनीति नियंत्रण के लिए isEntry और isExit ध्वज का उपयोग करती है। जब प्रवेश शर्त पूरी हो जाती है, तो isEntry को true पर सेट किया जाता है। जब बाहर निकलने की शर्त पूरी हो जाती है, तो isExit को true पर सेट किया जाता है। एक लंबी स्थिति केवल तभी खोली जाएगी जब isEntry गलत हो और एक खरीद संकेत दिखाई दे। एक छोटी स्थिति केवल तभी खोली जाएगी जब isExit गलत हो और एक बेच संकेत दिखाई दे।

इसके अतिरिक्त, रणनीति भी लाभ लेने और स्टॉप लॉस स्तर निर्धारित करती है। उपयोगकर्ता इनपुट के माध्यम से टीपी / एसएल प्रतिशत दूरी को परिभाषित कर सकते हैं। टीपी और एसएल कीमतों की गणना प्रवेश मूल्य प्रतिशत के आधार पर की जाएगी। जब स्थिति का आकार 0 से अधिक होता है, तो टीपी और एसएल को लंबे टीपी / एसएल प्रतिशत के आधार पर निष्पादित किया जाएगा। जब स्थिति का आकार 0 से कम होता है, तो टीपी और एसएल को छोटे टीपी / एसएल प्रतिशत पर आधारित किया जाएगा।

लाभ विश्लेषण

इस रणनीति के लाभों में निम्नलिखित शामिल हैंः

  1. इसे लागू करना सरल है. यह पूरी तरह से एमए क्रॉस के आधार पर व्यापार करता है, जो बिना ट्रेडिंग अनुभव के शुरुआती लोगों के लिए उपयुक्त है.

  2. जोखिम प्रबंधन के साथ नियंत्रित ड्रॉडाउन चलती औसत अल्पकालिक उतार-चढ़ाव को फ़िल्टर कर सकते हैं और बंद होने से बच सकते हैं।

  3. अनुकूलन क्षमता के लिए अनुकूलन योग्य मापदंड. उपयोगकर्ता एमए अवधि और टीपी / एसएल स्तर जैसे मापदंडों को अनुकूलित कर सकते हैं.

  4. स्पष्ट विज़ुअलाइज़ेशन। रणनीति चार्ट पर प्रमुख एमए, प्रविष्टियों और टीपी / एसएल स्तरों को प्लॉट करती है।

  5. विस्तार योग्य ढांचा। रणनीति संरचना पूर्ण है। इसे बढ़ाने के लिए नए संकेत और संकेतक जोड़े जा सकते हैं।

जोखिम विश्लेषण

इस रणनीति के जोखिमों में निम्नलिखित शामिल हैंः

  1. अत्यधिक बाजार की घटनाओं के दौरान नुकसान को रोकने में असमर्थ, जिससे भारी ड्रॉडाउन होता है। तेजी से एमए मूल्य परिवर्तन के प्रति संवेदनशील है और चरम परिस्थितियों में विफल हो सकता है।

  2. विभिन्न बाजारों में गिरावट का सामना करना पड़ता है, जिससे लगातार नुकसान होता है।

  3. व्यापारिक लागतों पर विचार नहीं किया जाता है। वास्तविक व्यापार में शुल्क और फिसलन से लाभप्रदता पर महत्वपूर्ण प्रभाव पड़ेगा।

  4. बैकटेस्ट ओवरफिटिंगः वास्तविक बाजार स्थितियां जटिल हैं और बैकटेस्ट परिणाम लाइव प्रदर्शन का प्रतिनिधित्व नहीं कर सकते हैं।

समाधानों में शामिल हैंः

  1. एक व्यापक स्टॉप लॉस का प्रयोग करें, या एक अतिरिक्त ब्रेकआउट स्टॉप लॉस जोड़ें।

  2. एमए की दूरी बढ़ाएं, व्यापार की आवृत्ति कम करें या अन्य फ़िल्टर जोड़ें।

  3. वास्तविक व्यापारिक लागतों पर विचार करें, व्यापक लाभ लक्ष्य क्षेत्र निर्धारित करें।

  4. बाजार की बदलती स्थितियों को ध्यान में रखते हुए मापदंडों को धीरे-धीरे अनुकूलित करें और ओवरफिटिंग को कम करें।

अनुकूलन दिशाएँ

इस रणनीति को निम्नलिखित पहलुओं में अनुकूलित किया जा सकता हैः

  1. एमए अवधि जैसे इष्टतम मापदंडों को खोजने के लिए विभिन्न मापदंड संयोजनों का परीक्षण करें।

  2. अन्य संकेतकों को फ़िल्टर के रूप में जोड़ें, जैसे कि एमएसीडी, केडी आदि।

  3. बेहतर जोखिम प्रबंधन के लिए स्टॉप लॉस रणनीति को अनुकूलित करें, जैसे कि स्टॉप लॉस को पीछे छोड़ना।

  4. जोखिम को नियंत्रित करते हुए मुनाफे को बढ़ाने के लिए लीवरेज के साथ स्थिति का आकार बढ़ाएं।

  5. ट्रेडिंग लागतों पर विचार करें, लाइव ट्रेडिंग के लिए मापदंडों का अनुकूलन करें।

  6. ओवरफिटिंग को कम करने के लिए सांख्यिकीय तरीकों का उपयोग करके पैरामीटर स्थिरता का मूल्यांकन करें।

निष्कर्ष

निष्कर्ष में, इस एमए क्रॉसओवर रणनीति में एक स्पष्ट तर्क है और इसे लागू करना सरल है, जो एल्गो ट्रेडिंग के लिए एक परिचयात्मक रणनीति के रूप में उपयुक्त है। लेकिन इसमें जोखिम और सीमाएं भी हैं। स्थिर लाभ प्राप्त करने के लिए सावधानीपूर्वक पैरामीटर और फ़िल्टर अनुकूलन, और जोखिम नियंत्रण की आवश्यकता है। इस रणनीति में उपयोगकर्ताओं के लिए अपनी खुद की ट्रेडिंग शैली के अनुरूप इसके आधार पर नवाचार और अनुकूलन करने के लिए बहुत विस्तार है।


/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gjfsdrtytru

//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)


// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)

plot(fastMA, "Fast MA",  color.blue)
plot(slowMA, "Slow MA",  color.red)

// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)

// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)


// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"

//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////

// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options

// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL

// Determine TP/SL price based on percentage given
longProfitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice  = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice  = strategy.position_avg_price * (1 + shortStopPerc)

// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)

entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and  shortCondition
exitShort = not isExit_Short and closeShort

if (entryLong)
    isEntry_Long := true
    isExit_Long := false
if (exitLong)
    isEntry_Long := false
    isExit_Long := true
if (entryShort)
    isEntry_Short := true
    isExit_Short := false
if (exitShort)
    isEntry_Short := false
    isExit_Short := true

// Order Execution
if testPeriod() 
    if entryLong
        strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
    if entryShort
        strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}


// TP/SL Execution
if (strategy.position_size > 0)
    strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
    strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}

if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
    strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
    
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")

अधिक