कई ट्रेडिंग रणनीतियों के बीच, डोंचियन चैनल रणनीति सबसे क्लासिक सफलता रणनीतियों में से एक होनी चाहिए। यह 1970 की शुरुआत में प्रसिद्ध थी। उस समय, एक विदेशी कंपनी ने मुख्यधारा के कार्यक्रम ट्रेडिंग रणनीतियों पर सिमुलेशन परीक्षण और अनुसंधान किया था। परिणामों से पता चला कि डोंचियन चैनल रणनीति सभी रणनीति परीक्षणों में सबसे सफल थी।
बाद में, व्यापार के इतिहास में सबसे प्रसिद्ध
ब्रेकथ्रू ट्रेडिंग रणनीति अपेक्षाकृत चिकनी प्रवृत्ति वाली ट्रेडिंग किस्मों के लिए उपयुक्त है। सबसे आम ब्रेकथ्रू ट्रेडिंग विधि विशिष्ट ट्रेडिंग बिंदु का न्याय करने के लिए मूल्य, समर्थन और प्रतिरोध के बीच सापेक्ष स्थिति संबंध का उपयोग करना है। इस लेख में डॉनचियन चैनल रणनीति भी इस सिद्धांत पर आधारित है।
डोंचियन चैनल एक प्रवृत्ति संकेतक है, और इसकी उपस्थिति और संकेत बोलिंगर बैंड संकेतक के कुछ समान हैं। हालांकि, डोंचियन का मूल्य चैनल एक निश्चित अवधि के भीतर उच्चतम मूल्य और सबसे कम मूल्य के अनुसार बनाया गया है। उदाहरण के लिए, नवीनतम 50 के-लाइनों के उच्चतम मूल्य का अधिकतम मूल्य ऊपरी ट्रैक बनाने के लिए गणना की जाती है; निचले ट्रैक बनाने के लिए नवीनतम 50 के-लाइनों के सबसे कम मूल्य का न्यूनतम मूल्य गणना करें।
जैसा कि ऊपर दिए गए चित्र में दिखाया गया है, यह संकेतक विभिन्न रंगों के तीन वक्रों से बना है। डिफ़ॉल्ट रूप से, बाजार की कीमतों की अस्थिरता दिखाने के लिए 20 अवधि के भीतर उच्चतम और निम्नतम कीमतों का उपयोग किया जाता है। जब चैनल संकीर्ण होता है, तो इसका मतलब है कि बाजार अस्थिरता छोटी होती है। इसके विपरीत, जब चैनल चौड़ा होता है, तो इसका मतलब है कि बाजार अस्थिरता बड़ी होती है।
यदि कीमत ऊपरी ट्रैक से ऊपर बढ़ जाती है, तो यह एक खरीद संकेत है; इसके विपरीत, यदि कीमत निचले ट्रैक से नीचे गिरती है, तो यह एक बिक्री संकेत है। चूंकि ऊपरी और निचले ट्रैक की गणना उच्चतम और निम्नतम कीमतों द्वारा की जाती है, आम तौर पर, कीमतें शायद ही कभी एक ही समय में ऊपरी और निचले चैनल लाइनों से ऊपर और नीचे गिरती हैं। ज्यादातर मामलों में, कीमत ऊपरी या निचले ट्रैक के साथ एकतरफा या ऊपरी और निचले ट्रैक के बीच चलती है।
डोंचियन चैनल का उपयोग करने के कई तरीके हैं, जिनका उपयोग अकेले या अन्य संकेतकों के साथ किया जा सकता है। इस पाठ में, हम सबसे सरल विधि का उपयोग करेंगे। अर्थात्, जब कीमत नीचे से ऊपर तक ऊपरी ट्रैक के माध्यम से टूटती है, अर्थात, दबाव रेखा से ऊपर, हम मानते हैं कि कई पक्षों की ताकत बढ़ रही है, बढ़ते बाजार की एक लहर बन गई है, और खरीद खुली स्थिति संकेत उत्पन्न हुआ है; जब कीमत ऊपर से नीचे की ट्रैक से नीचे गिरती है, अर्थात, समर्थन रेखा से नीचे, हम मानते हैं कि छोटी स्थिति पक्ष मजबूत हो रहा है, एक गिरावट की प्रवृत्ति की लहर बन गई है, और बिक्री उद्घाटन स्थिति संकेत उत्पन्न हुआ है।
यदि स्थिति खोलने के लिए खरीदने के बाद कीमत डोंचियन चैनल के मध्य ट्रैक पर वापस गिर जाती है, तो हमें लगता है कि बहु-पक्षीय बल कमजोर हो रहा है, या शॉर्ट पोजीशन पार्टी बल मजबूत हो रहा है, और बिक्री और स्थिति को बंद करने का संकेत उत्पन्न होता है; यदि बिक्री स्थिति खोलने के बाद कीमत डोंचियन चैनल के मध्य ट्रैक पर वापस बढ़ जाती है, तो हमें लगता है कि शॉर्ट पोजीशन पक्ष कमजोर हो रहा है, या बहु-पक्षीय बल मजबूत हो रहे हैं, और खरीद बंद करने का संकेत उत्पन्न होता है।
खरीद और बिक्री की शर्तें
इसके बाद, हम FMZ क्वांट प्लेटफॉर्म के अनुसंधान वातावरण में इस रणनीति को एक-एक करके समझेंगे:
एफएमजेड क्वांट प्लेटफॉर्म के अनुसंधान वातावरण में नीचे दिखाए अनुसार प्रवेश करें:
पायथन संस्करण.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]:
{
इसके बाद, हमें 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