দ্বৈত সমান্তরাল বিপরীত কৌশল


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

দ্বৈত সমান্তরাল বিপরীত কৌশল

ওভারভিউ

ডাবল মুভিং এভারেজ রিভার্সন কৌশল একটি সাধারণ স্বল্পমেয়াদী রিভার্সন ট্রেডিং কৌশল। এই কৌশলটি দুটি ভিন্ন প্যারামিটার সেট সমান্তরাল ব্যবহার করে ট্রেডিং সংকেত প্রেরণ করে, যখন প্রবণতা বিপরীত হয় তখন মুনাফা অর্জন করে।

কৌশল নীতি

এই কৌশলটি ট্রেডিং সিগন্যালের জন্য দুটি সমান্তরাল ব্যবহার করে। প্রথম সমান্তরাল maopening প্রবণতা দিক নির্ধারণের জন্য ব্যবহৃত হয়, দ্বিতীয় সমান্তরাল maclosing একটি ট্রেডিং সংকেত প্রেরণ করার জন্য ব্যবহৃত হয়।

যখন maopening বৃদ্ধি পায়, তখন এটি ট্রেন্ডের উত্থানের পর্যায়ে রয়েছে; যখন maopening হ্রাস পায়, তখন এটি ট্রেন্ডের পতনের পর্যায়ে রয়েছে। ম্যাকলসিংকে 1 এর চেয়ে বড় একটি ফ্যাক্টর দ্বারা গুণিত করা হয়, এটি আরও সংবেদনশীল করে তোলে, যা একটি বিপরীত সংকেত দিতে পারে।

বিশেষ করে, যখন maopening উচ্চতর হয় এবং maclosing নিচে maopening পেরিয়ে যায়, তখন ট্রেন্ড রিভার্স দেখায়, তখন কৌশলটি খালি হয়ে যায়; যখন maopening নিম্নতর হয় এবং maclosing maopening পেরিয়ে যায়, তখন ট্রেন্ড রিভার্স দেখায়, তখন কৌশলটি আরও বেশি পজিশন খোলে।

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

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

ডাবল ইভিনিউ রিভার্সনের সুবিধা হলঃ

  1. স্বল্পমেয়াদী ট্রেডিংয়ের জন্য ছোট রিট্র্যাক্ট। দুটি দ্রুত গড় লাইন ব্যবহার করে, স্বল্পমেয়াদী প্রবণতার বিপরীতটি দ্রুত ধরা যায়, ছোট রিট্র্যাক্ট।

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

  3. অনেক প্যারামিটার আছে যা অপ্টিমাইজ করা যায়। প্যারামিটার এবং ফ্যাক্টরগুলির মধ্যে দুটি গড় লাইন রয়েছে, যা অপ্টিমাইজেশনের মাধ্যমে সর্বোত্তম প্যারামিটার সমন্বয় খুঁজে পেতে পারে।

  4. এটি স্বয়ংক্রিয় ট্রেডিংয়ের জন্য উপযুক্ত। কৌশলগত লজিকটি সহজ এবং স্পষ্ট, উচ্চ কার্যকরকরণের ফ্রিকোয়েন্সি, স্বয়ংক্রিয় ট্রেডিংয়ের জন্য প্রোগ্রামিংয়ের জন্য উপযুক্ত।

  5. নিয়ন্ত্রিত ঝুঁকি, একটি ক্ষতি বন্ধ করার ব্যবস্থা রয়েছে। মোবাইল ক্ষতি বা সংখ্যাগত ক্ষতি বন্ধ করতে পারে, একক ক্ষতি নিয়ন্ত্রণ করতে পারে।

ঝুঁকি বিশ্লেষণ

কিন্তু এই দুই-এক-লাইন বিপরীতমুখী কৌশলটি কিছু ঝুঁকি নিয়ে আসেঃ

  1. ডাবল-রেগুলার ক্রস-এর পিছনে রয়েছে। রেগুলারটি নিজেই দামের পিছনে রয়েছে, ক্রস হওয়ার সময় প্রবণতাটি সম্ভবত কিছু সময়ের জন্য বিপরীত হয়েছিল।

  2. প্রবণতা বিপরীত হতে পারে, এবং খুব শীঘ্রই এটি আবার ফিরে আসতে পারে, একটি ফাঁদ তৈরি করতে পারে।

  3. প্রত্যাহার এখনও বিদ্যমান। সময়মতো বন্ধ হওয়া ক্ষতি একক ক্ষতিকে হ্রাস করতে পারে, তবে ধারাবাহিকভাবে বন্ধ হওয়া ক্ষতি আরও বেশি প্রত্যাহারের কারণ হতে পারে।

  4. ডেটা অপ্টিমাইজেশনের ঝুঁকি। অতিরিক্ত অপ্টিমাইজেশান প্যারামিটার, যা ঐতিহাসিক ডেটাতে ভাল কাজ করে কিন্তু রিয়েল-ডিস্কে খারাপ কাজ করে।

ঝুঁকি মোকাবিলার উপায়গুলো হলঃ

  1. প্যারামিটারগুলিকে অপ্টিমাইজ করুন এবং দ্রুত প্রতিক্রিয়াশীল সমান্তরাল সেটিংস খুঁজুন।

  2. অন্যান্য সূচকের সাথে একত্রিত হওয়া এড়িয়ে চলুন, যেমন ভলিউম সূচক, অস্থিরতা সূচক ইত্যাদি।

  3. ক্রমাগত ক্ষতির সম্ভাবনা কমাতে স্টপ পজিশনের সমন্বয়।

  4. একাধিক প্যারামিটার অপ্টিমাইজেশান টেস্ট, প্যারামিটার দৃঢ়তা মূল্যায়ন।

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

ডাবল ইভ্যালিউশন রিভার্স কৌশলটি নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যেতে পারেঃ

  1. বিভিন্ন ধরণের গড় পরীক্ষা করুন, আরও প্রতিক্রিয়াশীল গড় খুঁজুন। যেমন কামা, ZLEMA ইত্যাদি।

  2. গড়রেখার প্যারামিটারগুলিকে অনুকূলিত করুন এবং সর্বোত্তম দৈর্ঘ্যের সমন্বয়টি সন্ধান করুন। সাধারণত, গড়রেখার প্রভাবগুলি স্বল্প সময়ের জন্য ভাল হয়।

  3. বিভিন্ন ডেটা উত্স পরীক্ষা করুন, যেমনঃ সমাপ্তি মূল্য, গড় মূল্য, আদর্শ মূল্য ইত্যাদি।

  4. প্রবণতা ফিল্টার যুক্ত করুন, অনুপযুক্ত বিপরীত সিগন্যাল এড়াতে ৷ ডোনচিয়ান চ্যানেল ইত্যাদি ব্যবহার করা যেতে পারে ৷

  5. অন্যান্য সূচকের সাথে একত্রিতভাবে যাচাই করুন, যেমন পরিমাণ-মূল্য সূচক MACD, OBV ইত্যাদি।

  6. অ্যাকাউন্টের সর্বোচ্চ ক্ষতি, মোবাইল স্টপ লস ইত্যাদির মতো ঝুঁকি ব্যবস্থাপনা ব্যবস্থা বৃদ্ধি করা।

  7. পোর্টফোলিও অপ্টিমাইজেশান করুন এবং সর্বোত্তম সম্পদ বন্টন অনুপাত খুঁজুন।

  8. প্যারামিটারের দৃঢ়তা পরীক্ষা যোগ করা, প্যারামিটারের অপ্টিমাইজেশনের ঝুঁকি মূল্যায়ন করা।

সারসংক্ষেপ

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

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

//@version=5
strategy(title = "hamster-bot MRS 2", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 9, commission_value = 0.045, backtest_fill_limits_assumption = 1)
info_options = "Options"

on_close = input(false, title = "Entry on close", inline=info_options, group=info_options)
OFFS = input.int(0, minval = 0, maxval = 1, title = "| Offset View", inline=info_options, group=info_options)
trade_offset = input.int(0, minval = 0, maxval = 1, title = "Trade", inline=info_options, group=info_options)
use_kalman_filter = input.bool(false, title="Use Kalman filter", group=info_options)

//MA Opening
info_opening = "MA Opening"
maopeningtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_opening, group=info_opening)
maopeningsrc = input.source(ohlc4, title = "", inline=info_opening, group=info_opening)
maopeninglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_opening, group=info_opening)

//MA Closing
info_closing = "MA Closing"
maclosingtyp = input.string("SMA", title="Type", options=["SMA", "EMA", "TEMA", "DEMA", "ZLEMA", "WMA", "Hma", "Thma", "Ehma", "H", "L", "DMA"], title = "", inline=info_closing, group=info_closing)
maclosingsrc = input.source(ohlc4, title = "", inline=info_closing, group=info_closing)
maclosinglen = input.int(3, minval = 1, maxval = 200, title = "", inline=info_closing, group=info_closing)
maclosingmul = input.float(1, step = 0.005, title = "mul", inline=info_closing, group=info_closing)

long1on    = input(true, title = "", inline = "long1")
long1shift = input.float(0.96, step = 0.005, title = "Long", inline = "long1")
long1lot   = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "long1")
short1on    = input(true, title = "", inline = "short1")
short1shift = input.float(1.04, step = 0.005, title = "short", inline = "short1")
short1lot   = input.int(10, minval = 0, maxval = 10000, step = 10, title = "Lot 1", inline = "short1")
startTime = input(timestamp("01 Jan 2010 00:00 +0000"), "Start date", inline = "period")
finalTime = input(timestamp("31 Dec 2030 23:59 +0000"), "Final date", inline = "period")

HMA(_src, _length) =>  ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
EHMA(_src, _length) =>  ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
THMA(_src, _length) =>  ta.wma(ta.wma(_src,_length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)
tema(sec, length)=>
    tema1= ta.ema(sec, length)
    tema2= ta.ema(tema1, length)
    tema3= ta.ema(tema2, length)
    tema_r = 3*tema1-3*tema2+tema3
donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
ATR_func(_src, _len)=>
    atrLow = low - ta.atr(_len)
    trailAtrLow = atrLow
    trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1]
    supportHit = _src <= trailAtrLow
    trailAtrLow := supportHit ? atrLow : trailAtrLow
    trailAtrLow
f_dema(src, len)=>
    EMA1 = ta.ema(src, len)
    EMA2 = ta.ema(EMA1, len)
    DEMA = (2*EMA1)-EMA2
f_zlema(src, period) =>
    lag = math.round((period - 1) / 2)
    ema_data = src + (src - src[lag])
    zl= ta.ema(ema_data, period)
f_kalman_filter(src) =>
    float value1= na
    float value2 = na
    value1 := 0.2 * (src - src[1]) + 0.8 * nz(value1[1])
    value2 := 0.1 * (ta.tr) + 0.8 * nz(value2[1])
    lambda = math.abs(value1 / value2)
    alpha = (-math.pow(lambda, 2) + math.sqrt(math.pow(lambda, 4) + 16 * math.pow(lambda, 2)))/8
    value3 = float(na)
    value3 := alpha * src + (1 - alpha) * nz(value3[1])
//SWITCH
ma_func(modeSwitch, src, len, use_k_f=true) =>
      modeSwitch == "SMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.sma(src, len))  : ta.sma(src, len) :
      modeSwitch == "RMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.rma(src, len))  : ta.rma(src, len) :
      modeSwitch == "EMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.ema(src, len))  : ta.ema(src, len) :
      modeSwitch == "TEMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(tema(src, len))    : tema(src, len):
      modeSwitch == "DEMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(f_dema(src, len))  : f_dema(src, len):
      modeSwitch == "ZLEMA" ? use_kalman_filter and use_k_f ? f_kalman_filter(f_zlema(src, len)) : f_zlema(src, len):
      modeSwitch == "WMA"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.wma(src, len))  : ta.wma(src, len):
      modeSwitch == "VWMA"  ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.vwma(src, len)) : ta.vwma(src, len):
      modeSwitch == "Hma"   ? use_kalman_filter and use_k_f ? f_kalman_filter(HMA(src, len))     : HMA(src, len):
      modeSwitch == "Ehma"  ? use_kalman_filter and use_k_f ? f_kalman_filter(EHMA(src, len))    : EHMA(src, len):
      modeSwitch == "Thma"  ? use_kalman_filter and use_k_f ? f_kalman_filter(THMA(src, len/2))  : THMA(src, len/2):
      modeSwitch == "ATR"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ATR_func(src, len)): ATR_func(src, len) :
      modeSwitch == "L"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.lowest(len)): ta.lowest(len) :
      modeSwitch == "H"   ? use_kalman_filter and use_k_f ? f_kalman_filter(ta.highest(len)): ta.highest(len) :
      modeSwitch == "DMA"   ? donchian(len) : na

//Var
sum = 0.0
maopening = 0.0
maclosing = 0.0
os = maopeningsrc
cs = maclosingsrc
pos = strategy.position_size
p = 0.0
p := pos == 0 ? (strategy.equity / 100) / close : p[1]
truetime = true
loss = 0.0
maxloss = 0.0
equity = 0.0

//MA Opening
maopening := ma_func(maopeningtyp, maopeningsrc, maopeninglen)

//MA Closing
maclosing := ma_func(maclosingtyp, maclosingsrc, maclosinglen) * maclosingmul

long1 = long1on == false ? 0 : long1shift == 0 ? 0 : long1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * long1shift
short1 = short1on == false ? 0 : short1shift == 0 ? 0 : short1lot == 0 ? 0 : maopening == 0 ? 0 : maopening * short1shift
//Colors
maopeningcol = maopening == 0 ? na : color.blue
maclosingcol = maclosing == 0 ? na : color.fuchsia
long1col = long1 == 0 ? na : color.green
short1col = short1 == 0 ? na : color.red
//Lines
plot(maopening, offset = OFFS, color = maopeningcol)
plot(maclosing, offset = OFFS, color = maclosingcol)
long1line = long1 == 0 ? close : long1
short1line = short1 == 0 ? close : short1
plot(long1line, offset = OFFS, color = long1col)
plot(short1line, offset = OFFS, color = short1col)

//Lots
lotlong1 = p * long1lot
lotshort1 = p * short1lot

//Entry
if maopening > 0 and maclosing > 0 and truetime
    //Long
    sum := 0
    strategy.entry("L", strategy.long, lotlong1, limit = on_close ? na : long1, when = long1 > 0 and pos <= sum and (on_close ? close <= long1[trade_offset] : true))
    sum := lotlong1

    //Short
    sum := 0
    pos := -1 * pos
    strategy.entry("S", strategy.short, lotshort1, limit = on_close ? na : short1, when = short1 > 0 and pos <= sum and (on_close ? close >= short1[trade_offset] : true))
    sum := lotshort1

strategy.exit("Exit", na, limit = maclosing)
if time > finalTime
    strategy.close_all()