এই কৌশলটি দীর্ঘ এবং সংক্ষিপ্ত ব্যবসায়ের প্রবণতা দিক নির্ধারণের জন্য দুটি টাইমফ্রেমে গড় দিকনির্দেশক সূচক (ডিআই +) এবং নেতিবাচক দিকনির্দেশক সূচক (ডিআই-) ব্যবহার করে। যখন ডিআই + বৃহত্তর এবং ছোট উভয় সময়ফ্রেমে ডিআই- এর চেয়ে বেশি হয়, তখন এটি একটি উত্থান প্রবণতা নির্দেশ করে এবং একটি দীর্ঘ সংকেত ট্রিগার হয়। যখন ডিআই- উভয় ফ্রেমে ডিআই + এর চেয়ে বেশি হয়, তখন এটি একটি হ্রাস প্রবণতা নির্দেশ করে এবং একটি সংক্ষিপ্ত সংকেত ট্রিগার হয়।
কৌশলটি বেশ কয়েকটি নীতির উপর ভিত্তি করেঃ
উচ্চ, নিকট এবং নিম্ন মূল্য ব্যবহার করে DI+ এবং DI- গণনা করুন।
DI+ এবং DI- এর তুলনা দুটি সময়সীমার উপর করুন। প্রধান চার্ট সময়সীমার (যেমন 1 ঘন্টা) এবং বৃহত্তর সময়সীমার (যেমন দৈনিক) উপর যথাক্রমে DI+ এবং DI- গণনা করুন। দুটি সময়সীমার মধ্যে মানগুলি তুলনা করুন।
প্রবণতার দিকনির্দেশনা নির্ধারণ করুন। যখন ডিআই + বড় এবং ছোট সময় ফ্রেম উভয়ই ডিআই- এর চেয়ে বড় হয়, এটি একটি উত্থান প্রবণতা নির্দেশ করে। যখন ডিআই - উভয় ফ্রেমে ডিআই + এর চেয়ে বড় হয়, এটি একটি হ্রাস প্রবণতা নির্দেশ করে।
ট্রিগার ট্রেডিং সিগন্যাল। উভয় ফ্রেমে DI+>DI- দীর্ঘ সংকেত দেয়। উভয় ফ্রেমে DI->DI+ সংক্ষিপ্ত সংকেত দেয়।
স্টপ লস সেট করুন। ট্রেন্ড অনুসরণ করার জন্য গতিশীল স্টপ লস গণনা করতে ATR ব্যবহার করুন।
প্রস্থান শর্তাবলী। স্টপ লস বা মূল্য বিপরীত হলে প্রস্থান করুন।
এই কৌশলটির নিম্নলিখিত সুবিধা রয়েছে:
ডাবল টাইমফ্রেম ডিআই ফিল্টার ব্যবহার করে কিছু ভুয়া পলায়ন করে।
এটিআর ট্রেলিং স্টপ লাভের সুরক্ষা সর্বাধিক করে এবং স্টপগুলি খুব শক্ত হওয়া এড়ায়।
সময়মত স্টপ লস একক ট্রেডের ক্ষতি নিয়ন্ত্রণ করে।
ট্রেন্ডের সাথে ট্রেডিং ট্রেন্ডকে ক্রমাগত ধরতে সক্ষম করে।
সহজ এবং পরিষ্কার নিয়ম, লাইভ ট্রেডিং জন্য বাস্তবায়ন করা সহজ।
এছাড়া বেশ কিছু ঝুঁকি রয়েছে:
ডিআই-এর বিলম্বিত প্রভাব রয়েছে, প্রবেশের সময়টি মিস করতে পারে। প্যারামিটারগুলি অপ্টিমাইজ করতে পারে বা অন্যান্য সূচক যুক্ত করতে পারে।
ডাবল টাইমফ্রেম বড় এবং ছোট TF এর মধ্যে পার্থক্য থাকতে পারে। আরও টাইমফ্রেম বৈধতা যোগ করুন।
স্টপ লস খুব আক্রমনাত্মক হতে পারে কারণ ওভার ট্রেডিং. ATR গুণক শিথিল.
সাইডওয়েস মার্কেটে হুইপসা ঘন ঘন লেনদেনের কারণ হতে পারে।
পরামিতি অপ্টিমাইজেশান ঐতিহাসিক তথ্য উপর নির্ভর করে এবং overfitted হতে পারে। সতর্কতার সাথে পরামিতি দৃঢ়তা মূল্যায়ন করুন।
কৌশলটি নিম্নলিখিত দিকগুলিতে উন্নত করা যেতে পারেঃ
সেরা প্যারামিটার সেটের জন্য ডিআই গণনার পরামিতিগুলি অপ্টিমাইজ করুন।
সিগন্যালের নির্ভুলতা উন্নত করতে অন্যান্য সূচক ফিল্টার যোগ করুন, যেমন MACD, KDJ ইত্যাদি।
স্টপ লস কৌশল উন্নত করা যাতে বাজারের আরও শর্তাবলী যেমন ট্রেলিং স্টপ বা অপেক্ষমান অর্ডারের সাথে মানিয়ে নেওয়া যায়।
গুরুত্বপূর্ণ সংবাদ ঘটনা এড়ানোর জন্য ট্রেডিং সেশনের ফিল্টার যুক্ত করুন।
অনুকূলতা উন্নত করার জন্য বিভিন্ন পণ্যের উপর পরামিতি স্থিতিশীলতা পরীক্ষা করুন।
ঐতিহাসিক তথ্যের উপর মডেল প্রশিক্ষণের জন্য মেশিন লার্নিং চালু করুন।
সংক্ষেপে, এটি একটি সাধারণ প্রবণতা অনুসরণকারী কৌশল যা প্রবণতার দিক নির্ধারণ করতে এবং প্রবণতা বরাবর লাভ লক করতে স্টপ লস সেট করতে ডিআই ব্যবহার করে। সুবিধাটি লাইভ ট্রেডিংয়ের জন্য এর পরিষ্কার যুক্তি এবং বাস্তবায়নের সহজতায় রয়েছে। প্যারামিটার অপ্টিমাইজেশান, ফিল্টার যুক্ত করা ইত্যাদির মাধ্যমে উন্নতির জন্যও জায়গা রয়েছে। আরও অপ্টিমাইজেশন এবং দৃust়তা পরীক্ষার সাথে এটি একটি খুব ব্যবহারিক প্রবণতা অনুসরণকারী কৌশল হয়ে উঠতে পারে।
/*backtest start: 2022-10-31 00:00:00 end: 2023-11-06 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © DojiEmoji //@version=5 strategy("DI+/- multi TF Strat [KL]", overlay=true, pyramiding=1, initial_capital=1000000000, default_qty_type=strategy.percent_of_equity, default_qty_value=5) var string GROUP_ALERT = "Alerts" var string GROUP_SL = "Stop loss" var string GROUP_ORDER = "Order size" var string GROUP_TP = "Profit taking" var string GROUP_HORIZON = "Time horizon of backtests" var string GROUP_IND = "Directional IndicatorDI+ DI-" // ADX Indicator { adx_len = input(14, group=GROUP_IND, tooltip="Typically 14") tf1 = input.timeframe("", title="DI +/- in Timeframe 1", group=GROUP_IND, tooltip="Main: DI+ > DI-") tf2 = input.timeframe("1D", title="DI +/- in Timeframe 2", group=GROUP_IND, tooltip="Confirmation: DI+ > DI-") // adx_thres = input(20, group=GROUP_IND) //threshold not used in this strategy get_ADX(_high, _close, _low) => // (high, close, mid) -> [plus_DM, minus_DM] // Based on TradingView user BeikabuOyaji's implementation _tr = math.max(math.max(_high - _low, math.abs(_high - nz(_close[1]))), math.abs(_low - nz(_close[1]))) smooth_tr = 0.0 smooth_tr := nz(smooth_tr[1]) - nz(smooth_tr[1]) / adx_len + _tr smooth_directional_mov_plus = 0.0 smooth_directional_mov_plus := nz(smooth_directional_mov_plus[1]) - nz(smooth_directional_mov_plus[1]) / adx_len + (_high - nz(_high[1]) > nz(_low[1]) - _low ? math.max(_high - nz(_high[1]), 0) : 0) smooth_directional_mov_minus = 0.0 smooth_directional_mov_minus := nz(smooth_directional_mov_minus[1]) - nz(smooth_directional_mov_minus[1]) / adx_len + (nz(_low[1]) - _low > _high - nz(_high[1]) ? math.max(nz(_low[1]) - _low, 0) : 0) plus_DM = smooth_directional_mov_plus / smooth_tr * 100 minus_DM = smooth_directional_mov_minus / smooth_tr * 100 // DX = math.abs(plus_DM - minus_DM) / (plus_DM + minus_DM) * 100 // DX not used in this strategy [plus_DM, minus_DM] // DI +/- from timeframes 1 and 2 [plus_DM_tf1, minus_DM_tf1] = get_ADX(request.security(syminfo.tickerid, tf1, high), request.security(syminfo.tickerid, tf1, close),request.security(syminfo.tickerid, tf1, low)) [plus_DM_tf2, minus_DM_tf2] = get_ADX(request.security(syminfo.tickerid, tf2, high),request.security(syminfo.tickerid, tf2, close),request.security(syminfo.tickerid, tf2, low)) // } end of block: ADX Indicator var string ENUM_LONG = "LONG" var string LONG_MSG_ENTER = input.string("Long entered", title="Alert MSG for buying (Long position)", group=GROUP_ALERT) var string LONG_MSG_EXIT = input.string("Long closed", title="Alert MSG for closing (Long position)", group=GROUP_ALERT) backtest_timeframe_start = input(defval=timestamp("01 Apr 2020 13:30 +0000"), title="Backtest Start Time", group=GROUP_HORIZON) within_timeframe = true // Signals for entry _uptrend_confirmed = plus_DM_tf1 > minus_DM_tf1 and plus_DM_tf2 > minus_DM_tf2 entry_signal_long = _uptrend_confirmed plotshape(_uptrend_confirmed, style=shape.triangleup, location=location.bottom, color=color.green) plotshape(not _uptrend_confirmed, style=shape.triangledown, location=location.bottom, color=color.red) // Trailing stop loss ("TSL") { tsl_multi = input.float(2.0, title="ATR Multiplier for trailing stoploss", group=GROUP_SL) SL_buffer = ta.atr(input.int(14, title="Length of ATR for trailing stoploss", group=GROUP_SL)) * tsl_multi TSL_source_long = low var stop_loss_price_long = float(0) var pos_opened_long = false stop_loss_price_long := pos_opened_long ? math.max(stop_loss_price_long, TSL_source_long - SL_buffer) : TSL_source_long - SL_buffer // MAIN: { if pos_opened_long and TSL_source_long <= stop_loss_price_long pos_opened_long := false alert(LONG_MSG_EXIT, alert.freq_once_per_bar) strategy.close(ENUM_LONG, comment=close < strategy.position_avg_price ? "stop loss" : "take profit") // (2) Update the stoploss to latest trailing amt. if pos_opened_long strategy.exit(ENUM_LONG, stop=stop_loss_price_long, comment="SL") // (3) INITIAL ENTRY: if within_timeframe and entry_signal_long pos_opened_long := true alert(LONG_MSG_ENTER, alert.freq_once_per_bar) strategy.entry(ENUM_LONG, strategy.long, comment="long") // Plotting: TSL_transp_long = pos_opened_long and within_timeframe ? 0 : 100 plot(stop_loss_price_long, color=color.new(color.green, TSL_transp_long)) // CLEAN UP: Setting variables back to default values once no longer in use if ta.change(strategy.position_size) and strategy.position_size == 0 pos_opened_long := false if not pos_opened_long stop_loss_price_long := float(0) // } end of MAIN block