अनुसंधान के माहौल में डोंचियन चैनल रणनीति का विश्लेषण

लेखक:लिडिया, बनाया गयाः 2022-12-26 09:19:00, अद्यतन किया गयाः 2023-09-20 10:43:17

img

अनुसंधान के माहौल में डोंचियन चैनल रणनीति का विश्लेषण

रणनीति का परिचय

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

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

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

डोंचियन चैनल रणनीतिक नियम

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

img

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

यदि कीमत ऊपरी ट्रैक से ऊपर बढ़ जाती है, तो यह एक खरीद संकेत है; इसके विपरीत, यदि कीमत निचले ट्रैक से नीचे गिरती है, तो यह एक बिक्री संकेत है। चूंकि ऊपरी और निचले ट्रैक की गणना उच्चतम और निम्नतम कीमतों द्वारा की जाती है, आम तौर पर, कीमतें शायद ही कभी एक ही समय में ऊपरी और निचले चैनल लाइनों से ऊपर और नीचे गिरती हैं। ज्यादातर मामलों में, कीमत ऊपरी या निचले ट्रैक के साथ एकतरफा या ऊपरी और निचले ट्रैक के बीच चलती है।

रणनीतिक तर्क

डोंचियन चैनल का उपयोग करने के कई तरीके हैं, जिनका उपयोग अकेले या अन्य संकेतकों के साथ किया जा सकता है। इस पाठ में, हम सबसे सरल विधि का उपयोग करेंगे। अर्थात्, जब कीमत नीचे से ऊपर तक ऊपरी ट्रैक के माध्यम से टूटती है, अर्थात, दबाव रेखा से ऊपर, हम मानते हैं कि कई पक्षों की ताकत बढ़ रही है, बढ़ते बाजार की एक लहर बन गई है, और खरीद खुली स्थिति संकेत उत्पन्न हुआ है; जब कीमत ऊपर से नीचे की ट्रैक से नीचे गिरती है, अर्थात, समर्थन रेखा से नीचे, हम मानते हैं कि छोटी स्थिति पक्ष मजबूत हो रहा है, एक गिरावट की प्रवृत्ति की लहर बन गई है, और बिक्री उद्घाटन स्थिति संकेत उत्पन्न हुआ है।

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

खरीद और बिक्री की शर्तें

  • लंबी शुरुआती स्थितिः यदि कोई स्थिति नहीं है और समापन मूल्य ऊपरी ट्रैक से अधिक है।
  • शॉर्ट ओपनिंग पोजीशनः यदि कोई पोजीशन नहीं है और बंद होने की कीमत निचले ट्रैक से कम है।
  • लंबी समापन स्थितिः यदि आप एक लंबी स्थिति रखते हैं और समापन मूल्य मध्य ट्रैक से कम है।
  • शॉर्ट क्लोजिंग पोजीशनः यदि आप शॉर्ट पोजीशन रखते हैं और क्लोजिंग की कीमत मध्य ट्रैक से अधिक है।

रणनीति संहिता का कार्यान्वयन

इसके बाद, हम FMZ क्वांट प्लेटफॉर्म के अनुसंधान वातावरण में इस रणनीति को एक-एक करके समझेंगे:

एफएमजेड क्वांट प्लेटफॉर्म के अनुसंधान वातावरण में नीचे दिखाए अनुसार प्रवेश करें:

img

पायथन संस्करण.ipynb में डोंचियन चैनल रणनीति में [1]:

from fmz import *
task = VCtx('''backtest
start: 2019-08-01 09:00:00
end: 2019-10-10 15:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
''')
# Create a Backtesting Environment
# The example format of the backtest information in red above can be obtained by clicking "Save settings" on the strategy edting page of the FMZ Quant platform.

[2] मेंः

# First, we need to get the position information, and we define a mp() function to do this.

def mp():
    positions = exchange.GetPosition() # Get position array
    if len(positions) == 0: # If the length of the position array is 0
        return 0 # Prove a short position, return 0
    for i in range(len(positions)): # Iterate through the positions array
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # If there are long position orders, return 1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # If there are short position orders, return -1
        
    print(positions)
    
mp() # Next, we execute this function to get the position information, and we can see that the result is 0, which means that the current position is short.

आउट[2]:0

[3] मेंः

# Let's start testing this strategy using the current main rebar contract as an example.

exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888.

बाहर[3]: {संयोजन प्रकार: 0, CreateDate: 0, डिलीवरीमाह : 9, पूर्ति वर्ष : 0, अंतिम वितरण तिथि: 0, एक्सचेंज आईडी: SHFE, ExchangeInstID: rb888, समाप्ति तिथि : 0, इंस्टलाइफ फेज: 49, इंस्ट्रूमेंट आईडी: rb888, इंस्ट्रूमेंट नाम: rb निरंतरता, IsTrading: 1, लॉन्ग मार्जिन रेशियो: 0.06, MaxLimitOrderVolume: 500, मैक्स मार्जिनसाइड एल्गोरिथ्म: 49, मैक्समार्केटऑर्डरवॉल्यूम: 30, MinLimitOrderVolume: 1, MinMarketOrderVolume: 1, OpenDate: 0, विकल्प प्रकार: 48, पोजीशन दिनांक प्रकार : 49, स्थितिप्रकार: 50, प्राइसटिक : 1, उत्पाद वर्ग: 49, उत्पाद आईडी: rb, शॉर्ट मार्जिन रेशियो: 0.06, प्रारंभ दिनांक : 0, स्ट्राइक प्राइस : 0, अंडरलाइंग इंस्ट्रिड: rb, अंतर्निहितबहुवचन: 1, वॉल्यूम मल्टीपल : 10}

इसके बाद, हमें K-लाइन सरणी मिलती है, क्योंकि रणनीतिक तर्क के अनुसार, हमें बाजार को एक निश्चित अवधि के लिए चलाने की आवश्यकता होती है और फिर तार्किक निर्णय लेने की आवश्यकता होती है, ताकि हमारा रणनीतिक तर्क बाजार के अनुकूल हो सके। यहां हम अस्थायी रूप से प्रारंभिक आवश्यकता के रूप में 50 K-लाइन लेंगे। FMZ Quant की K-लाइन जानकारी एक सरणी के रूप में संग्रहीत की जाती है, जिसमें उच्चतम मूल्य, सबसे कम मूल्य, उद्घाटन मूल्य, समापन मूल्य, व्यापार मात्रा और अन्य जानकारी होती है। इस भाग की सामग्री के लिए, कृपया FMZ Quant प्लेटफॉर्म के आधिकारिक एपीआई दस्तावेज़ का संदर्भ लेंःhttps://www.fmz.com/api

[4] मेंः

# Next we define a variable to store the K-line array.

records = exchange.GetRecords() # Get the K-line array

[5] मेंः

# According to the strategy logic description, we use the closing price as the price to open a position, so we need to calculate the closing price of the latest K-line.

close = records[len(records) - 1].Close # Get the latest K-line closing price
close

बाहर[5]: 3846.0

फिर, हमें मानक के रूप में समापन मूल्य का उपयोग करके 50 के लाइनों में उच्चतम मूल्य के अधिकतम मूल्य और सबसे कम मूल्य के न्यूनतम मूल्य की गणना करने की आवश्यकता है।

[6] मेंः

upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
upper

बाहर[6]: 3903.0

[7] मेंः

lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
lower

बाहर[7]: 3856.0

इसके बाद, हमें इस चैनल के ऊपरी और निचले ट्रैक के औसत मूल्य की गणना करने की आवश्यकता है।

[8] मेंः

middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks.
middle

बाहर[8]: 3879.5

ऊपर, हमने इस रणनीति के लिए आवश्यक सभी गणनाएं पूरी कर ली हैं। इसके बाद, हम खोलने की शर्तों का तार्किक रूप से न्याय करना शुरू करेंगे और तार्किक निर्णय के परिणामों के अनुसार वास्तविक खोलने की स्थिति ऑपरेशन करेंगे। यहां यह ध्यान दिया जाना चाहिए कि हमें एफएमजेड क्वांट प्लेटफॉर्म के घरेलू कमोडिटी वायदा टेम्पलेट का उपयोग करने की आवश्यकता है। चूंकि वर्तमान अनुसंधान वातावरण इस टेम्पलेट का समर्थन नहीं कर सकता है, इसलिए हम इसे अस्थायी रूप से लिखेंगे, लेकिन ऑपरेशन एक त्रुटि की रिपोर्ट करेगा, वास्तविक कोडिंग के लिए एफएमजेड क्वांट प्लेटफॉर्म रणनीति लेखन पृष्ठ में, इस टेम्पलेट को बिना किसी समस्या के आयात करें, टेम्पलेट का पता हैःhttps://www.fmz.com/strategy/24288जब आप एफएमजेड क्वांट प्लेटफॉर्म रणनीति संपादन पृष्ठ पर कोड करते हैं, तो आपको पहले इस टेम्पलेट को अपनी रणनीति लाइब्रेरी में कॉपी करने की आवश्यकता है, और फिर बैकटेस्टिंग करते समय इसे चेक करें।

[ ] मेंः

obj = ext.NewPositionManager() # When using the FMZ Quant trading class library, errors will be reported at runtime, which can be ignored. Now it is the research environment,
                               # This problem does not occur during the actual coding process, and the following is the same without further comment.

अगला कदम रणनीति के तर्क को निर्धारित करना और तर्क के अनुसार पदों को खोलना और बंद करना है।

[ ] मेंः

if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
            obj.CoverAll() # Close all positions
        if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
            obj.CoverAll() # Close all positions
        if positions == 0: # If it's a short position
            if close > upper: # If the closing price rises above the upper track
                obj.OpenLong("rb888", 1) # Buy opening positions
            elif close < lower: # If the closing price falls below the lower track
                obj.OpenShort("rb888", 1) # Sell opening positions

[ ] मेंः

# Complete strategy code:
def mp():
    positions = exchange.GetPosition() # Get the position array
    if len(positions) == 0: # If the length of the position array is 0
        return 0 # It proved a short position, return 0
    for i in range(len(positions)): # Iterate through the positions array
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # If there are long position orders, return 1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # If there are short position orders, return -1

def main(): # Main function
    exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888
    while True: # Enter the loop
        records = exchange.GetRecords() # Get the K-line array
        if len(records) < 50: continue # If there are less than 50 K-lines, skip the loop
        close = records[len(records) - 1].Close # Get the latest K-line closing price
        positions = mp() # Get position information function
        upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
        lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
        middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks
        obj = ext.NewPositionManager() # Use the Trading Library
        if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
            obj.CoverAll() # Close all positions
        if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
            obj.CoverAll() # Close all positions
        if positions == 0: # If it's a short position
            if close > upper: # If the closing price rises above the upper track
                obj.OpenLong("rb888", 1) # Buy opening positions
            elif close < lower: # If the closing price falls below the lower track
                obj.OpenShort("rb888", 1) # Sell opening positions

संबंधित

अधिक