ডুয়াল ট্র্যাক রিভার্সাল কৌশল


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

ডুয়াল ট্র্যাক রিভার্সাল কৌশল

ওভারভিউ

ডাবল রেল ট্র্যাকিং বিপরীতমুখী কৌশল হল একটি বিপরীতমুখী ট্রেডিং কৌশল যা বুলিন বেল্ট, কেল্টনার চ্যানেল এবং গতিশীলতার সূচকগুলিকে একত্রিত করে। এই কৌশলটি বুলিন বেল্ট এবং কেল্টনার চ্যানেলের সমন্বিত বিচারের মাধ্যমে দামের সংকোচনের অঞ্চলে প্রবেশের সময়কে চিহ্নিত করে; এবং গতিশীলতার সূচকগুলির সাথে মিলিত দামের বিপরীত সংকেতগুলি বিচার করে, ট্রেডিং প্রবেশ এবং প্রস্থান সংকেত গঠন করে।

কৌশল নীতি

  1. বুলিন বেল্টের মধ্য, উপরের এবং নীচের রেলের গণনা

    • SMA-এর কাছাকাছি
    • উপরের এবং নীচের ট্র্যাকটি হল মধ্যম ট্র্যাকের স্ট্যান্ডার্ড ডিফারেনশিয়াল, যোগ এবং বিয়োগ করা একটি সামঞ্জস্যযোগ্য গুণক
  2. কেল্টনার ট্র্যাকের মধ্যম, উপরের এবং নিচের রেলের গণনা

    • SMA-এর কাছাকাছি
    • উপরের এবং নীচের ট্র্যাকটি হল মধ্যম ট্র্যাকের ATR যোগ এবং বিয়োগ একটি সামঞ্জস্যযোগ্য গুণক
  3. কেল্টনার চ্যানেলের ভিতরে বুলিন বেল্ট রয়েছে কিনা তা নির্ধারণ করা

    • যখন বুলিনের উপরের রেলটি কেল্টনার উপরের রেলের চেয়ে কম এবং বুলিনের নিচের রেলটি কেল্টনার নিচের রেলের চেয়ে বেশি, তখন সংকোচনের মধ্যে রয়েছে বলে মনে করা হয়
    • বিপরীতভাবে, সংক্ষেপিত নয়
  4. বুলিন বেন্ড এবং কেল্টনার খালের মধ্যবর্তী বিন্দুতে ক্লোজ এবং লিনিয়ার রিটার্ন স্কেলেন্টের গণনা

    • val > 0 মানে ক্লোজ বাড়ছে, val < 0 মানে ক্লোজ কমছে
  5. ROC এবং EMA এর ঘনিষ্ঠ পরিবর্তনের হার গণনা করুন

    • পরিবর্তনের মাত্রা নির্ধারণ করুন
    • ট্রেন্ডিংয়ের মধ্যে থাকলে, প্রান্তিক মান অতিক্রম করলে
  6. কম্প্রেশনের সময়, যখন val > 0 এবং পরিবর্তন হার থ্রেশহোল্ডে পৌঁছায় তখন অতিরিক্ত করুন

    • পরিবর্তে খালি
  7. স্টপ লস এবং স্টপ কন্ডিশন সেট করুন

কৌশলগত সুবিধা

  1. ডাবল রেল সিস্টেমের সাথে মিলিত, বিপরীত দিকের সময় নির্ধারণের জন্য উচ্চতর নির্ভুলতা

  2. লাইন রিগ্রেশন এবং পরিবর্তনের হার বিচারক যুক্ত করুন, মিথ্যা রিভার্সাল সংকেত এড়ান

  3. বিভিন্ন জাতের জন্য অপ্টিমাইজ করার জন্য নমনীয় প্যারামিটার সেটিং

  4. স্টপ লস স্টপ কৌশল ব্যবহার করে একক লেনদেনের ঝুঁকি কার্যকরভাবে নিয়ন্ত্রণ করা যায়

  5. রিটার্নিং ডেটা যথেষ্ট, কৌশল কার্যকরতা যাচাই করা যায়

কৌশলগত ঝুঁকি ও সমাধান

  1. দ্বৈত রেল সংক্ষেপণ কার্যকরভাবে বিপরীত হতে পারে না

    • অপ্টিমাইজেশান প্যারামিটার, কঠোর দ্বৈত রেল সংকোচনের শর্ত
  2. ভুয়া ব্রেকিংয়ের ফলে ভুল সংকেত পাওয়া যায়

    • লিনিয়ার রিগ্রেশন বিচারক যুক্ত করুন এবং প্রবণতা নির্দেশ করুন
  3. স্টপ লস সেটিং খুব হালকা, একক ক্ষতি খুব বেশি

    • স্টপ লস পয়েন্ট অপ্টিমাইজ করুন, একক ক্ষতি কঠোরভাবে নিয়ন্ত্রণ করুন
  4. টেস্ট চক্র Datenichinhalt

    • দীর্ঘমেয়াদী কার্যকারিতা যাচাই করার জন্য আরও পুনরাবৃত্তি চক্র যুক্ত করুন

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

  1. আরও জাতের জন্য প্যারামিটার সেটিং অপ্টিমাইজ করা হয়েছে

  2. মেশিন লার্নিংয়ের সাহায্যে সিদ্ধান্ত গ্রহণের জন্য প্রতিরোধের মূল পয়েন্টগুলি যুক্ত করুন

  3. ট্রেডিং ভলিউমের পরিবর্তনের সাথে ব্রেকথ্রু সত্যতা

  4. ট্রেন্ডের ধারাবাহিকতা নির্ধারণের জন্য সময়সীমার বিশ্লেষণ যুক্ত করা হয়েছে

  5. স্টপ লস স্টপ কৌশল অপ্টিমাইজ করুন, গতিশীল ট্র্যাকিং বাস্তবায়ন করুন

সারসংক্ষেপ

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

কৌশল সোর্স কোড
/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Credit for the initial Squeeze Momentum code to LazyBear, rate of change code is from Kiasaki
strategy("Squeeze X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2012, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// Squeeeeze ///////////////
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(22, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)")
 
// Calculate BB
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

///////////// Rate Of Change ///////////// 
roclength = input(30, minval=1), pcntChange = input(7, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = val > 0 and isMoving()
short = val < 0 and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

sl_inp = input(100.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution ///////////////
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
/////////////// Plotting ///////////////
bcolor = iff(val > 0, iff(val > nz(val[1]), color.lime, color.green), iff(val < nz(val[1]), color.red, color.maroon))
plot(val, color=bcolor, linewidth=4)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)
hline(0, color = color.white)