
ডোনাল্ড ট্রেন্ড অনুসরণ কৌশলটি ডোনাল্ড চ্যানেল নীতির উপর ভিত্তি করে বিকাশ করা একটি ট্রেন্ড অনুসরণ কৌশল যা ব্ল্যাক বক্স ট্রেন্ড অনুসরণ করে লিফটিং দ্য ভিল নিবন্ধে বর্ণিত হয়েছে। এই কৌশলটি ডোনাল্ড চ্যানেল ব্যবহার করে মূল্যের প্রবণতা নির্ধারণ করে, দামের ভিত্তিতে উচ্চ বা নিম্নের ভিত্তিতে অবস্থান তৈরি করে।
কৌশলটি ডোনিয়ান চ্যানেলের সূচকের উপর ভিত্তি করে প্রবণতার দিক নির্ধারণ করে। ডোনিয়ান চ্যানেলটি একটি দীর্ঘ চক্রের চ্যানেল এবং একটি সংক্ষিপ্ত চক্রের চ্যানেল নিয়ে গঠিত। যখন দাম দীর্ঘ চক্রের চ্যানেলটি ভেঙে দেয় তখন ট্রেন্ড হিসাবে বিচার শুরু হয়; যখন দাম সংক্ষিপ্ত চক্রের চ্যানেলটি ভেঙে দেয় তখন ট্রেন্ড হিসাবে বিচার শেষ হয়।
নির্দিষ্টভাবে, দীর্ঘতর চক্রের চ্যানেলের দৈর্ঘ্য 50 দিন বা 20 দিন, এবং সংক্ষিপ্ত চক্রের চ্যানেলের দৈর্ঘ্য 50 দিন, 20 দিন বা 10 দিন। যদি দাম 50 দিনের মধ্যে সর্বোচ্চ মূল্যের সমান হয়, তবে একটি বোনাস খুলুন; যদি দাম 50 দিনের মধ্যে সর্বনিম্ন মূল্যের সমান হয়, তবে একটি খালি বোনাস খুলুন। যদি দাম 20 দিনের বা 10 দিনের মধ্যে সর্বনিম্ন মূল্যের সমান হয়, তবে একটি বোনাস বন্ধ করুন; যদি দাম 20 দিনের বা 10 দিনের মধ্যে সর্বোচ্চ মূল্যের সমান হয়, তবে একটি খালি বোনাস বন্ধ করুন।
এইভাবে, দুটি ভিন্ন পর্যায়ের ডোনিয়ান চ্যানেলের সমন্বয় দ্বারা, একটি প্রবণতা শুরু হওয়ার সময় একটি অবস্থান নির্ধারণ করা যেতে পারে, এবং প্রবণতা শেষ হওয়ার সময় একটি সময়মত ক্ষতি বন্ধ করা যেতে পারে।
এই কৌশলটির প্রধান সুবিধাগুলো হলঃ
প্রবণতা ধরার ক্ষমতা শক্তিশালী। প্রবণতার শুরু এবং শেষ নির্ধারণের জন্য ডোনিয়ান চ্যানেল ভেঙে প্রবণতা কার্যকরভাবে অনুসরণ করা যেতে পারে।
ঝুঁকি নিয়ন্ত্রণ করা হয়েছে। একক ক্ষতি নিয়ন্ত্রণের জন্য চলমান স্টপ ব্যবহার করা হয়েছে।
প্যারামিটারগুলি নমনীয়ভাবে সামঞ্জস্য করা যায়। বিভিন্ন জাত এবং বাজারের পরিবেশের সাথে খালের চক্রের সংমিশ্রণটি অবাধে বেছে নেওয়া যেতে পারে।
সহজ, সুস্পষ্ট লেনদেনের লজিক.
এই কৌশলটি নিম্নলিখিত ঝুঁকিগুলিও বহন করেঃ
যখন প্রবণতা অস্পষ্ট হয়, তখন স্টপ লস নিয়ে অনেক ছোটখাট সমন্বয় ঘটবে।
ব্রেকিং ব্যর্থতার ঝুঁকি। দামটি চ্যানেলটি ভেঙে যাওয়ার পরে আবারও ফিরে আসতে পারে, যার ফলে স্টপ লস হয়।
চক্র নির্বাচন ঝুঁকি। যদি চ্যানেল চক্রটি ভুলভাবে সেট করা হয়, তবে ট্রেডিংয়ে গোলমাল হতে পারে।
শার্প অনুপাতের পতনের ঝুঁকি। যদি আপনি আপনার পজিশন বাড়ান এবং স্টপ লস সামঞ্জস্য না করেন তবে শার্প অনুপাতের পতনের ঝুঁকি রয়েছে।
সমাধানঃ
এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যেতে পারেঃ
ফিল্টারিং শর্ত যুক্ত করুন এবং whipsaws এড়ান। উদাহরণস্বরূপ, সংযোজন ক্ষমতা সূচকগুলি সত্যিকারের ব্রেকথ্রু নির্ধারণ করে।
চ্যানেল চক্রের সমন্বয় এবং পজিশন নিয়ন্ত্রণের অপ্টিমাইজেশান, মুদ্রা ক্ষতির হার বাড়ানো। স্বনির্ধারিত ক্ষতি বন্ধ ব্যবস্থা চালু করা যেতে পারে।
ব্রেকপয়েন্ট অপ্টিমাইজেশনের চেষ্টা করুন এবং সর্বোত্তম প্যারামিটার সমন্বয় খুঁজে বের করুন।
মেশিন লার্নিং অ্যালগরিদম যোগ করা, প্যারামিটারগুলির গতিশীল অপ্টিমাইজেশন এবং সমন্বয় করা।
ডোনিয়ান ট্রেন্ড ট্র্যাকিং কৌশলটি দামের প্রবণতার শুরু এবং শেষের বিষয়ে দ্বি-চ্যানেলের বিচার করে, ট্রেন্ড ট্র্যাকিংয়ের ট্রেডিং পদ্ধতি গ্রহণ করে, একক ক্ষতির কার্যকর নিয়ন্ত্রণ করে। এই কৌশলটি প্যারামিটারগুলিকে সামঞ্জস্য করতে নমনীয়, বাস্তবায়নে সহজ, এটি একটি খুব ব্যবহারিক ট্রেন্ড ট্র্যাকিং কৌশল। তবে শকুনের পরিস্থিতিতে লাভজনকতার অভাব এবং প্যারামিটার নির্বাচনের ঝুঁকি সম্পর্কেও সতর্কতা অবলম্বন করা দরকার। আরও অপ্টিমাইজেশনের মাধ্যমে, আরও ভাল কৌশল কার্যকারিতা অর্জন করা যেতে পারে।
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title="Donchian", overlay=true,
pyramiding=0, initial_capital=1000,
commission_type=strategy.commission.cash_per_order,
commission_value=2, slippage=2)
// =============================================================================
// VARIABLES
// =============================================================================
donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50')
permit_long = input.bool(title = 'Permit long', defval = true)
permit_short = input.bool(title = 'Permit short', defval = true)
risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25)
stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5)
atrLen = input.int(title="ATR Length", defval=20)
close_in_end = input.bool(title = 'Close in end', defval = true)
permit_stop = input.bool(title = 'Permit stop', defval = false)
// =============================================================================
// CALCULATIONS
// =============================================================================
donch_len_big =
donch_string == '50/20' ? 50 :
donch_string == '50/50' ? 50 :
donch_string == '20/20' ? 20 :
donch_string == '20/10' ? 20 :
donch_string == '100/100' ? 100 :
na
donch_len_small =
donch_string == '50/20' ? 20 :
donch_string == '50/50' ? 50 :
donch_string == '20/20' ? 20 :
donch_string == '20/10' ? 10 :
donch_string == '100/100' ? 100 :
na
big_maxclose = ta.highest(close, donch_len_big)
big_minclose = ta.lowest(close, donch_len_big)
small_maxclose = ta.highest(close, donch_len_small)
small_minclose = ta.lowest(close, donch_len_small)
atrValue = ta.atr(atrLen)[1]
tradeWindow = true
// =============================================================================
// NOTOPEN QTY
// =============================================================================
risk_usd = (risk_percent / 100) * strategy.equity
atr_currency = (atrValue * syminfo.pointvalue)
notopen_qty = risk_usd / (stopOffset * atr_currency)
// =============================================================================
// LONG STOP
// =============================================================================
long_stop_price = 0.0
long_stop_price :=
strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue :
strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price:
strategy.position_size > 0 ? long_stop_price[1] :
na
// =============================================================================
// SHORT STOP
// =============================================================================
short_stop_price = 0.0
short_stop_price :=
strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue :
strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price :
strategy.position_size < 0 ? short_stop_price[1] :
na
// =============================================================================
// PLOT VERTICAL COLOR BAR
// =============================================================================
cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
cross_dn = strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
bg_color = cross_up ? color.green : cross_dn ? color.red : na
bg_color := color.new(bg_color, 70)
bgcolor(bg_color)
// =============================================================================
// PLOT DONCHIAN LINES
// =============================================================================
s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na
s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na
s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na :
strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na
plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black")
plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black")
plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow")
plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red")
plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia")
// =============================================================================
// ENTRY ORDERS
// =============================================================================
if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
strategy.entry("Long", strategy.long, qty=notopen_qty)
if strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
strategy.entry("Short", strategy.short, qty=notopen_qty)
// =============================================================================
// EXIT ORDERS
// =============================================================================
if strategy.position_size > 0 and permit_stop
strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price)
if strategy.position_size < 0 and permit_stop
strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price)
// ==========
if strategy.position_size > 0 and close == small_minclose and not barstate.islast
strategy.close(id="Long", comment='Donch')
if strategy.position_size < 0 and close == small_maxclose and not barstate.islast
strategy.close(id="Short", comment='Donch')
// ==========
if close_in_end
if not tradeWindow
strategy.close_all(comment='Close in end')
// =============================================================================
// END
// =============================================================================