রিসোর্স লোড হচ্ছে... লোডিং...

গবেষণা পরিবেশে ডনচিয়ান চ্যানেল কৌশল বিশ্লেষণ

লেখক:এফএমজেড-লিডিয়া, সৃষ্টিঃ ২০২২-১২-২৬ ০৯ঃ১৯:০০, আপডেটঃ ২০২৩-০৯-২০ ১০ঃ৪৩ঃ১৭

img

গবেষণা পরিবেশে ডনচিয়ান চ্যানেল কৌশল বিশ্লেষণ

কৌশল প্রবর্তন

অনেক ট্রেডিং কৌশলগুলির মধ্যে, ডনচিয়ান চ্যানেল কৌশলটি সর্বাধিক ক্লাসিক অগ্রগতি কৌশলগুলির মধ্যে একটি হওয়া উচিত। এটি 1970 সালের প্রথম দিকে বিখ্যাত ছিল। সেই সময়ে, একটি বিদেশী সংস্থা মূলধারার প্রোগ্রাম ট্রেডিং কৌশলগুলির উপর সিমুলেশন পরীক্ষা এবং গবেষণা পরিচালনা করেছিল। ফলাফলগুলি দেখিয়েছে যে ডনচিয়ান চ্যানেল কৌশলটি সমস্ত কৌশল পরীক্ষার মধ্যে সবচেয়ে সফল ছিল।

পরবর্তীতে, ট্রেডিং ইতিহাসে সর্বাধিক বিখ্যাত টার্টল ট্রেডার প্রশিক্ষণ মার্কিন যুক্তরাষ্ট্রে অনুষ্ঠিত হয়, যা একটি দুর্দান্ত সাফল্য ছিল। সেই সময়ে, টার্টলস এর ট্রেডিং পদ্ধতিগুলি গোপনীয় ছিল, তবে দশ বছরেরও বেশি সময় পরে, টার্টল ট্রেডিং বিধিগুলি জনসাধারণের কাছে প্রকাশিত হয়েছিল, লোকেরা আবিষ্কার করেছিল যে টার্টলস ডনচিয়ান চ্যানেল কৌশলটির উন্নত সংস্করণ ব্যবহার করেছিল।

ব্রেকথ্রু ট্রেডিং কৌশল তুলনামূলকভাবে মসৃণ প্রবণতা সহ ট্রেডিং জাতের জন্য উপযুক্ত। সর্বাধিক সাধারণ ব্রেকথ্রু ট্রেডিং পদ্ধতি হ'ল নির্দিষ্ট ট্রেডিং পয়েন্ট বিচার করার জন্য মূল্য, সমর্থন এবং প্রতিরোধের মধ্যে আপেক্ষিক অবস্থানের সম্পর্ক ব্যবহার করা। এই নিবন্ধে ডনচিয়ান চ্যানেল কৌশলটিও এই নীতির উপর ভিত্তি করে।

ডনচিয়ান চ্যানেল কৌশল নিয়মাবলী

ডনচিয়ান চ্যানেল একটি প্রবণতা সূচক, এবং এর চেহারা এবং সংকেত বোলিংজার ব্যান্ড সূচকের সাথে কিছুটা অনুরূপ। তবে, ডনচিয়ান মূল্য চ্যানেলটি একটি নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ মূল্য এবং সর্বনিম্ন মূল্য অনুসারে নির্মিত হয়। উদাহরণস্বরূপ, সর্বশেষ 50 কে-লাইনগুলির সর্বোচ্চ মূল্যের সর্বাধিক মানটি উপরের ট্র্যাকটি গঠনের জন্য গণনা করা হয়; সর্বশেষ 50 কে-লাইনগুলির সর্বনিম্ন মূল্যের সর্বনিম্ন মানটি নিম্ন ট্র্যাকটি গঠনের জন্য গণনা করুন।

img

উপরের চিত্রটিতে দেখানো হয়েছে, এই সূচকটি বিভিন্ন রঙের তিনটি বক্ররেখার সমন্বয়ে গঠিত। ডিফল্টরূপে, 20 টি সময়ের মধ্যে সর্বোচ্চ এবং সর্বনিম্ন দামগুলি বাজারের দামের অস্থিরতা দেখানোর জন্য ব্যবহৃত হয়। যখন চ্যানেলটি সংকীর্ণ হয়, এর অর্থ হ'ল বাজারের অস্থিরতা ছোট। বিপরীতভাবে, যখন চ্যানেলটি প্রশস্ত হয়, এর অর্থ হ'ল বাজারের অস্থিরতা বড়।

যদি দাম উপরের ট্র্যাকের উপরে উঠে যায়, এটি একটি ক্রয় সংকেত; বিপরীতে, যদি দাম নিম্ন ট্র্যাকের নীচে পড়ে, এটি একটি বিক্রয় সংকেত। যেহেতু উপরের এবং নিম্ন ট্র্যাকগুলি সর্বোচ্চ এবং সর্বনিম্ন দাম দ্বারা গণনা করা হয়, সাধারণত, দামগুলি একসাথে উপরের এবং নিম্ন চ্যানেল লাইনের নীচে কমই বৃদ্ধি পায় এবং পড়ে। বেশিরভাগ ক্ষেত্রে, দামটি উপরের বা নিম্ন ট্র্যাকগুলি একতরফাভাবে বা উপরের এবং নিম্ন ট্র্যাকগুলির মধ্যে চলে।

কৌশলগত যুক্তি

ডনচিয়ান চ্যানেল ব্যবহার করার অনেকগুলি উপায় রয়েছে, যা একা বা অন্যান্য সূচকগুলির সাথে একত্রিতভাবে ব্যবহার করা যেতে পারে। এই পাঠে, আমরা সবচেয়ে সহজ পদ্ধতিটি ব্যবহার করব। অর্থাৎ, যখন দামটি নীচে থেকে উপরের দিকে উপরের ট্র্যাকটি ভেঙে দেয়, অর্থাৎ, চাপের লাইনের উপরে, আমরা বিশ্বাস করি যে অনেক পক্ষের শক্তি বাড়ছে, একটি উত্থান বাজারের তরঙ্গ গঠিত হয়েছে, এবং ক্রয় খোলা অবস্থান সংকেত উত্পন্ন হয়েছে; যখন দাম উপরে থেকে নীচে ট্র্যাকের নীচে পড়ে, অর্থাৎ, সমর্থন লাইনের নীচে, আমরা বিশ্বাস করি যে শর্ট পজিশন পক্ষ শক্তিশালী হচ্ছে, একটি নিম্নমুখী প্রবণতার তরঙ্গ গঠিত হয়েছে, এবং বিক্রয় খোলার অবস্থান সংকেত উত্পন্ন হয়েছে।

যদি পজিশন খোলার জন্য কেনার পর দাম ডনচিয়ান চ্যানেলের মাঝারি ট্র্যাকের দিকে ফিরে যায়, আমরা মনে করি যে মাল্টি পার্টি ফোর্স দুর্বল হচ্ছে, অথবা শর্ট পজিশন পার্টি ফোর্স শক্তিশালী হচ্ছে, এবং পজিশন বিক্রি এবং বন্ধের সংকেত উৎপন্ন হয়; যদি বিক্রয় পজিশন খোলার পর দাম ডনচিয়ান চ্যানেলের মাঝারি ট্র্যাকের দিকে ফিরে যায়, আমরা মনে করি যে শর্ট পজিশন দিক দুর্বল হচ্ছে, অথবা মাল্টি পার্টি ফোর্স শক্তিশালী হচ্ছে, এবং কিনুন বন্ধের সংকেত পজিশন উৎপন্ন হয়।

ক্রয় ও বিক্রয় শর্তাবলী

  • লং ওপেনিং পজিশনঃ যদি কোনও পজিশন না থাকে এবং বন্ধের মূল্য উপরের ট্র্যাকের চেয়ে বেশি হয়।
  • শর্ট ওপেনিং পজিশনঃ যদি কোনও পজিশন না থাকে এবং বন্ধের দাম নিম্ন ট্র্যাকের চেয়ে কম হয়।
  • লং ক্লোজিং পজিশনঃ যদি আপনি একটি লং পজিশন ধরে রাখেন এবং ক্লোজিং মূল্য মধ্যম ট্র্যাকের চেয়ে কম হয়।
  • শর্ট ক্লোজিং পজিশনঃ আপনি যদি একটি শর্ট পজিশন ধরে রাখেন এবং ক্লোজিং মূল্য মধ্যম ট্র্যাকের চেয়ে বেশি হয়।

কৌশল কোড বাস্তবায়ন

পরবর্তী, আমরা FMZ কোয়ান্ট প্ল্যাটফর্মের গবেষণা পরিবেশে একের পর এক এই কৌশলটি বুঝতে পারবঃ

নিম্নলিখিত চিত্র অনুযায়ী FMZ Quant প্ল্যাটফর্মের গবেষণা পরিবেশে প্রবেশ করুনঃ

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, এক্সচেঞ্জ ইনস্ট আইডি : rb888, সমাপ্তির তারিখ: 0, ইনস্ট লাইফ ফেজ : ৪৯, ইনস্ট্রুমেন্ট আইডি : rb888, ইনস্ট্রুমেন্ট নাম: rb ধারাবাহিকতা, ট্রেডিং : ১, লং মার্জিন রেসিওঃ ০.০৬, MaxLimitOrderVolume: 500, ম্যাক্স মার্জিন সাইড অ্যালগরিদম: 49, ম্যাক্স মার্কেট অর্ডার ভলিউম : 30, মিনিটলিমিটঅর্ডারভলিউম: ১, মিন মার্কেট অর্ডার ভলিউম: ১, ওপেন ডেট: 0, অপশন টাইপ: ৪৮, পজিশন তারিখ টাইপ : 49, পজিশনটাইপ: ৫০, প্রাইসটিক : ১, পণ্যের শ্রেণীঃ ৪৯ পণ্য আইডি: rb, শর্ট মার্জিন রেসিওঃ ০.০৬, প্রারম্ভিক ডেলিভারি তারিখ: 0, স্ট্রাইক প্রাইস : 0, আন্ডারলেন্ডিং ইনস্ট্রাইড: rb, অন্তর্নিহিত বহুগুণ : ১, ভলিউমমাল্টিপল: 10}

এরপরে, আমরা কে-লাইন অ্যারেটি পাই, কারণ কৌশলগত যুক্তি অনুসারে, আমাদের বাজারের একটি নির্দিষ্ট সময়ের জন্য চলতে হবে এবং তারপরে যৌক্তিক বিচার করতে হবে, যাতে আমাদের কৌশলগত যুক্তি বাজারে আরও ভালভাবে খাপ খাইয়ে নিতে পারে। এখানে আমরা অস্থায়ীভাবে 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

সম্পর্কিত

আরো