অনেক ট্রেডিং কৌশলগুলির মধ্যে, ডনচিয়ান চ্যানেল কৌশলটি সর্বাধিক ক্লাসিক অগ্রগতি কৌশলগুলির মধ্যে একটি হওয়া উচিত। এটি 1970 সালের প্রথম দিকে বিখ্যাত ছিল। সেই সময়ে, একটি বিদেশী সংস্থা মূলধারার প্রোগ্রাম ট্রেডিং কৌশলগুলির উপর সিমুলেশন পরীক্ষা এবং গবেষণা পরিচালনা করেছিল। ফলাফলগুলি দেখিয়েছে যে ডনচিয়ান চ্যানেল কৌশলটি সমস্ত কৌশল পরীক্ষার মধ্যে সবচেয়ে সফল ছিল।
পরবর্তীতে, ট্রেডিং ইতিহাসে সর্বাধিক বিখ্যাত
ব্রেকথ্রু ট্রেডিং কৌশল তুলনামূলকভাবে মসৃণ প্রবণতা সহ ট্রেডিং জাতের জন্য উপযুক্ত। সর্বাধিক সাধারণ ব্রেকথ্রু ট্রেডিং পদ্ধতি হ'ল নির্দিষ্ট ট্রেডিং পয়েন্ট বিচার করার জন্য মূল্য, সমর্থন এবং প্রতিরোধের মধ্যে আপেক্ষিক অবস্থানের সম্পর্ক ব্যবহার করা। এই নিবন্ধে ডনচিয়ান চ্যানেল কৌশলটিও এই নীতির উপর ভিত্তি করে।
ডনচিয়ান চ্যানেল একটি প্রবণতা সূচক, এবং এর চেহারা এবং সংকেত বোলিংজার ব্যান্ড সূচকের সাথে কিছুটা অনুরূপ। তবে, ডনচিয়ান মূল্য চ্যানেলটি একটি নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ মূল্য এবং সর্বনিম্ন মূল্য অনুসারে নির্মিত হয়। উদাহরণস্বরূপ, সর্বশেষ 50 কে-লাইনগুলির সর্বোচ্চ মূল্যের সর্বাধিক মানটি উপরের ট্র্যাকটি গঠনের জন্য গণনা করা হয়; সর্বশেষ 50 কে-লাইনগুলির সর্বনিম্ন মূল্যের সর্বনিম্ন মানটি নিম্ন ট্র্যাকটি গঠনের জন্য গণনা করুন।
উপরের চিত্রটিতে দেখানো হয়েছে, এই সূচকটি বিভিন্ন রঙের তিনটি বক্ররেখার সমন্বয়ে গঠিত। ডিফল্টরূপে, 20 টি সময়ের মধ্যে সর্বোচ্চ এবং সর্বনিম্ন দামগুলি বাজারের দামের অস্থিরতা দেখানোর জন্য ব্যবহৃত হয়। যখন চ্যানেলটি সংকীর্ণ হয়, এর অর্থ হ'ল বাজারের অস্থিরতা ছোট। বিপরীতভাবে, যখন চ্যানেলটি প্রশস্ত হয়, এর অর্থ হ'ল বাজারের অস্থিরতা বড়।
যদি দাম উপরের ট্র্যাকের উপরে উঠে যায়, এটি একটি ক্রয় সংকেত; বিপরীতে, যদি দাম নিম্ন ট্র্যাকের নীচে পড়ে, এটি একটি বিক্রয় সংকেত। যেহেতু উপরের এবং নিম্ন ট্র্যাকগুলি সর্বোচ্চ এবং সর্বনিম্ন দাম দ্বারা গণনা করা হয়, সাধারণত, দামগুলি একসাথে উপরের এবং নিম্ন চ্যানেল লাইনের নীচে কমই বৃদ্ধি পায় এবং পড়ে। বেশিরভাগ ক্ষেত্রে, দামটি উপরের বা নিম্ন ট্র্যাকগুলি একতরফাভাবে বা উপরের এবং নিম্ন ট্র্যাকগুলির মধ্যে চলে।
ডনচিয়ান চ্যানেল ব্যবহার করার অনেকগুলি উপায় রয়েছে, যা একা বা অন্যান্য সূচকগুলির সাথে একত্রিতভাবে ব্যবহার করা যেতে পারে। এই পাঠে, আমরা সবচেয়ে সহজ পদ্ধতিটি ব্যবহার করব। অর্থাৎ, যখন দামটি নীচে থেকে উপরের দিকে উপরের ট্র্যাকটি ভেঙে দেয়, অর্থাৎ, চাপের লাইনের উপরে, আমরা বিশ্বাস করি যে অনেক পক্ষের শক্তি বাড়ছে, একটি উত্থান বাজারের তরঙ্গ গঠিত হয়েছে, এবং ক্রয় খোলা অবস্থান সংকেত উত্পন্ন হয়েছে; যখন দাম উপরে থেকে নীচে ট্র্যাকের নীচে পড়ে, অর্থাৎ, সমর্থন লাইনের নীচে, আমরা বিশ্বাস করি যে শর্ট পজিশন পক্ষ শক্তিশালী হচ্ছে, একটি নিম্নমুখী প্রবণতার তরঙ্গ গঠিত হয়েছে, এবং বিক্রয় খোলার অবস্থান সংকেত উত্পন্ন হয়েছে।
যদি পজিশন খোলার জন্য কেনার পর দাম ডনচিয়ান চ্যানেলের মাঝারি ট্র্যাকের দিকে ফিরে যায়, আমরা মনে করি যে মাল্টি পার্টি ফোর্স দুর্বল হচ্ছে, অথবা শর্ট পজিশন পার্টি ফোর্স শক্তিশালী হচ্ছে, এবং পজিশন বিক্রি এবং বন্ধের সংকেত উৎপন্ন হয়; যদি বিক্রয় পজিশন খোলার পর দাম ডনচিয়ান চ্যানেলের মাঝারি ট্র্যাকের দিকে ফিরে যায়, আমরা মনে করি যে শর্ট পজিশন দিক দুর্বল হচ্ছে, অথবা মাল্টি পার্টি ফোর্স শক্তিশালী হচ্ছে, এবং কিনুন বন্ধের সংকেত পজিশন উৎপন্ন হয়।
ক্রয় ও বিক্রয় শর্তাবলী
পরবর্তী, আমরা FMZ কোয়ান্ট প্ল্যাটফর্মের গবেষণা পরিবেশে একের পর এক এই কৌশলটি বুঝতে পারবঃ
নিম্নলিখিত চিত্র অনুযায়ী FMZ Quant প্ল্যাটফর্মের গবেষণা পরিবেশে প্রবেশ করুনঃ
পাইথন সংস্করণে ডোনচিয়ান চ্যানেল কৌশল.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]:
{
এরপরে, আমরা কে-লাইন অ্যারেটি পাই, কারণ কৌশলগত যুক্তি অনুসারে, আমাদের বাজারের একটি নির্দিষ্ট সময়ের জন্য চলতে হবে এবং তারপরে যৌক্তিক বিচার করতে হবে, যাতে আমাদের কৌশলগত যুক্তি বাজারে আরও ভালভাবে খাপ খাইয়ে নিতে পারে। এখানে আমরা অস্থায়ীভাবে 50 কে-লাইনগুলি প্রাথমিক প্রয়োজনীয়তা হিসাবে নেব। এফএমজেড কোয়ান্টের কে-লাইন তথ্য একটি অ্যারে আকারে সংরক্ষণ করা হয়, যা সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, খোলার মূল্য, বন্ধের মূল্য, ট্রেডিং পরিমাণ এবং অন্যান্য তথ্য ধারণ করে। এই অংশের বিষয়বস্তুর জন্য, দয়া করে এফএমজেড কোয়ান্ট প্ল্যাটফর্মের অফিসিয়াল এপিআই নথিতে দেখুনঃ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]: ৩৮৪৬.০
তারপর, আমাদের সর্বোচ্চ মূল্যের সর্বোচ্চ মান এবং 50 কে-লাইনগুলির মধ্যে সর্বনিম্ন মূল্যের সর্বনিম্ন মান গণনা করতে হবে বন্ধের মূল্যকে স্ট্যান্ডার্ড হিসাবে ব্যবহার করে।
[6] এঃ
upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
upper
আউট[6]: ৩৯০৩.০
[৭] এঃ
lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
lower
আউট[7]: ৩৮৫৬.০
এরপরে, আমাদের এই চ্যানেলের উপরের এবং নীচের ট্র্যাকগুলির গড় মান গণনা করতে হবে।
[8] এঃ
middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks.
middle
আউট[8]: ৩৮৭৯.৫
উপরে, আমরা এই কৌশলটির জন্য প্রয়োজনীয় সমস্ত গণনা সম্পন্ন করেছি। এরপরে, আমরা উদ্বোধনের শর্তগুলি যৌক্তিকভাবে বিচার করতে শুরু করব এবং যৌক্তিক বিচারের ফলাফল অনুসারে প্রকৃত খোলার অবস্থান অপারেশনটি সম্পাদন করব। এখানে এটি লক্ষ করা উচিত যে আমাদের এফএমজেড কোয়ান্ট প্ল্যাটফর্মের দেশীয় পণ্য ফিউচার টেম্পলেটটি ব্যবহার করতে হবে। বর্তমান গবেষণা পরিবেশ এই টেম্পলেটটি সমর্থন করতে পারে না বলে আমরা এটি অস্থায়ীভাবে লিখব, তবে অপারেশনটি একটি ত্রুটি রিপোর্ট করবে, প্রকৃত কোডিংয়ের জন্য এফএমজেড কোয়ান্ট প্ল্যাটফর্ম কৌশল লেখার পৃষ্ঠায়, এই টেম্পলেটটি কোনও সমস্যা ছাড়াই আমদানি করুন, টেম্পলেট ঠিকানাটি হ'লঃhttps://www.fmz.com/strategy/24288. যখন আপনি FMZ Quant প্ল্যাটফর্ম কৌশল সম্পাদনা পৃষ্ঠায় কোড, আপনি প্রথম আপনার নিজস্ব কৌশল লাইব্রেরিতে এই টেমপ্লেট কপি করতে হবে, এবং তারপর ব্যাক টেস্টিং সময় এটি চেক আউট.
[ ] এঃ
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