DI কৌশল অনুসরণ করে মাল্টি-টাইম ফ্রেম ট্রেন্ড


সৃষ্টির তারিখ: 2023-11-07 16:31:07 অবশেষে সংশোধন করুন: 2023-11-07 16:31:07
অনুলিপি: 0 ক্লিকের সংখ্যা: 647
1
ফোকাস
1621
অনুসারী

DI কৌশল অনুসরণ করে মাল্টি-টাইম ফ্রেম ট্রেন্ড

ওভারভিউ

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

মূলনীতি

এই কৌশলটি মূলত নিম্নলিখিত নীতিগুলির উপর ভিত্তি করে তৈরি করা হয়েছেঃ

  1. ডিআই+ এবং ডিআই- ক্যালকুলেট করুন উচ্চ মূল্য, বন্ধ মূল্য, নিম্ন মূল্য গ্রহণ করে ডিআই+ এবং ডিআই- ক্যালকুলেট করুন

  2. দুটি সময় ফ্রেমের ডিআই+ এবং ডিআই-এর তুলনা করুন। ডিআই+ এবং ডিআই-কে মূল মানচিত্রের সময় ফ্রেম (যেমন 1 ঘন্টা) এবং বৃহত্তর সময় ফ্রেম (যেমন সূর্যের রেখা) তে গণনা করা হয় এবং বড় এবং ছোট সম্পর্কগুলি তুলনা করা হয়।

  3. প্রবণতার দিকনির্দেশনা নির্ধারণ করুন। যখন বড় সময় ফ্রেম এবং ছোট সময় ফ্রেমের ডিআই + উভয়ই ডিআই -এর চেয়ে বড় হয়, তখন এটি একটি মাল্টিহেড প্রবণতা হিসাবে বিচার করা হয়। যখন দুটি সময় ফ্রেমের ডিআই - উভয়ই ডিআই + এর চেয়ে বড় হয়, তখন এটি একটি ফাঁকা প্রবণতা হিসাবে বিচার করা হয়।

  4. ট্রেডিং সিগন্যাল প্রেরণ করুন। মাল্টিহেড সিগন্যাল দুটি টাইম ফ্রেম ডিআই+> ডিআই-এর জন্য; খালি হেড সিগন্যাল দুটি টাইম ফ্রেমের জন্য ডিআই-> ডিআই+, খালি।

  5. ট্রেন্ড ট্র্যাকিং স্টপ অর্জনের জন্য এটিআর ভিত্তিক স্টপ লেভেল সেট করুন।

  6. বিদায়ের শর্ত স্টপ লস ট্রিগার বা দামের বিপরীতমুখী হলে পজিশন বন্ধ

সামর্থ্য বিশ্লেষণ

এই কৌশলটির সুবিধাগুলো হলঃ

  1. ডাবল টাইম ফ্রেম ডিআই ব্যবহার করে প্রবণতা নির্ণয় করা যায়, যা কিছু ভুয়া ব্রেকআউটকে ফিল্টার করতে পারে।

  2. এটিআর ডায়নামিক ট্র্যাকিং স্টপ লস, যা লাভের সর্বোচ্চ সুরক্ষা দেয় এবং খুব ছোট স্টপ লস এড়াতে পারে।

  3. সময়মতো ক্ষতি বন্ধ করুন, একক ক্ষতি নিয়ন্ত্রণ করুন।

  4. ট্রেডিং ট্রেন্ডের উপর ভিত্তি করে, ট্রেডিং সুযোগ ক্রমাগত ধরা যায়।

  5. নিয়মগুলি পরিষ্কার এবং সহজেই বোঝা যায়, যা রিয়েল-ডিস্কে ব্যবহার করা সহজ।

ঝুঁকি ও সমাধান

এই কৌশলটি নিম্নলিখিত ঝুঁকিগুলিও বহন করেঃ

  1. ডিআই সূচকটি পিছিয়ে আছে, সম্ভবত প্রবেশের সময়টি মিস করেছে। প্যারামিটারগুলি যথাযথভাবে অনুকূলিতকরণ করা যেতে পারে, বা অন্যান্য সূচকগুলির সাথে মিলিতভাবে বিচার করা যেতে পারে।

  2. ডাবল টাইম ফ্রেম সিদ্ধান্তে আপ এবং ডাউন প্রবাহের পার্থক্য থাকতে পারে। টাইম ফ্রেম যাচাইকরণ সংকেত যুক্ত করা যেতে পারে।

  3. স্টপ লস অত্যধিক তীব্র হতে পারে, যার ফলে খুব বেশি ট্রেডিং হতে পারে। এটিআর গুণকগুলি যথাযথভাবে শিথিল করা যেতে পারে।

  4. ঘন ঘন ক্রয়-বিক্রয় ঘটতে পারে। ফিল্টারিং কন্ডিশন যুক্ত করে লেনদেনের ঘনত্ব কমাতে পারে।

  5. প্যারামিটার অপ্টিমাইজেশান ঐতিহাসিক তথ্য উপর নির্ভর করে, বাস্তব ডিভাইসে অপ্টিমাইজেশান থাকতে পারে। প্যারামিটার রুক্ষতা সতর্কতার সাথে মূল্যায়ন করা উচিত।

অপ্টিমাইজেশান দিক

এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যায়ঃ

  1. ডিআই গণনা প্যারামিটারগুলিকে অনুকূলিত করুন, সর্বোত্তম প্যারামিটার সমন্বয় খুঁজুন।

  2. অন্যান্য সূচক ফিল্টার যোগ করুন, যেমন MACD, KDJ ইত্যাদি।

  3. অপ্টিমাইজড স্টপ স্ট্র্যাটেজি, আরো বাজার অবস্থার সাথে সামঞ্জস্যপূর্ণ।

  4. “অন্তত, এই ধরনের ঘটনা ঘটতে পারে না।

  5. বিভিন্ন জাতের প্যারামিটারগুলির শক্তিবৃদ্ধি পরীক্ষা করা এবং অভিযোজনশীলতা বাড়ানো।

  6. মেশিন লার্নিং উপাদান যুক্ত করুন এবং ঐতিহাসিক তথ্য ব্যবহার করে বিচারক মডেল প্রশিক্ষণ দিন।

সারসংক্ষেপ

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

কৌশল সোর্স কোড
/*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