দোদুল্যমান কে-লাইন পরিমাণগত ট্রেডিং কৌশল


সৃষ্টির তারিখ: 2023-09-26 20:05:55 অবশেষে সংশোধন করুন: 2023-09-26 20:05:55
অনুলিপি: 1 ক্লিকের সংখ্যা: 801
1
ফোকাস
1702
অনুসারী

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি প্রথমে কাস্টম ফাংশন f_getOscilatorValues কল করে বিভিন্ন দোলক সূচকের মান পেতে, যার মধ্যে রয়েছে RSI, Stoch, MACD ইত্যাদি। তারপরে, f_getSupertrend ফাংশন দ্বারা বিলম্বিত সুপারট্রেন্ড সূচকের মান গণনা করা হয়, যা স্টপ লস ট্র্যাকিংয়ের জন্য ব্যবহৃত হয়।

সূচক গণনা করার পরে, কৌশলটি f_getBuySellStops ফাংশনটি কল করে যা সূচক মানের উপর ভিত্তি করে ইনপুট স্টপ এবং স্টপ স্টপ গণনা করে। বিশেষত, এটি এটিআর সূচকটি গণনা করে এবং এটিআরকে একটি স্টপ ফ্যাক্টর দ্বারা ইনপুট স্টপ হিসাবে গণনা করে, এটিআরকে একটি স্টপ ফ্যাক্টর দ্বারা স্টপ স্টপ হিসাবে গণনা করে। প্রবণতা বিপরীত হওয়ার সময় স্টপ এবং স্টপ স্টপগুলি সামঞ্জস্য করা হয়।

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

প্রবেশের পরে, স্টপ ট্র্যাকিং করা হয়, স্টপ ট্র্যাকিং আপ-রেল বা ডাউন-রেল হয়, whichever is closer. যখন স্টপটি ট্রিগার করা হয় তখন প্লেইন করা হয়। যখন দাম স্টপ-রোলের কাছাকাছি পৌঁছে যায়, তখন আংশিকভাবে স্টপ করা হয়।

কৌশলগত শক্তি বিশ্লেষণ

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

  1. ওসিলিয়েটর ব্যবহার করে ট্রেন্ডের দিকনির্দেশনা চিহ্নিত করা যায় এবং বাজারের সংক্ষিপ্ত লাইনের বিপরীতমুখী সুযোগকে সময়মতো ধরা যায়।

  2. বিলম্বিত ওভারট্রেন্ডিং স্টপ কৌশল প্রয়োগ করুন, আপনি ক্ষতির বিস্তার হওয়ার আগে ক্ষতির আউটপুট বন্ধ করতে পারেন, একক ক্ষতি সীমাবদ্ধ করতে পারেন।

  3. এটিআর দ্বারা গণনা করা ঝুঁকি পরিমাপের উপর ভিত্তি করে স্টপ লস এবং স্টপ পজিশনের আকারকে গতিশীলভাবে সামঞ্জস্য করা যেতে পারে।

  4. উচ্চ পর্যায়ের গড়রেখার সাথে মিলিতভাবে ফিল্টার করুন, যাতে আটকে না যায়।

  5. এটি একটি আংশিক স্টপ-অফ কৌশল যা মুনাফা চালিয়ে যেতে দেয় এবং আংশিক মুনাফা লক করে দেয়।

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

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

এই কৌশলটির কিছু ঝুঁকিও রয়েছেঃ

  1. oscillators সূচকটি একটি বিলম্বিত সমস্যা রয়েছে, যার ফলে প্রবেশের সংকেতটি বিলম্বিত হতে পারে, প্রস্থান সংকেতটি তাড়াতাড়ি চলে যায়। সূচক প্যারামিটারগুলি সামঞ্জস্য করে বা ট্রেন্ড অনুসরণ করে সূচক সহায়ক বিচার যোগ করে অনুকূলিতকরণ করা যেতে পারে।

  2. স্টপ পয়েন্টের কাছাকাছি, এটি বিরতিতে বিরতি দেওয়া হতে পারে। স্টপ রেঞ্জটি যথাযথভাবে প্রশস্ত করা যেতে পারে, বা চ্যান্ডেলিয়ার স্টপের মতো গতিশীল স্টপ কৌশল ব্যবহার করা যেতে পারে।

  3. আংশিক বন্ধের পরে, অবশিষ্ট পজিশনটি বন্ধ হয়ে যেতে পারে। আংশিক বন্ধের অনুপাতটি হ্রাস করা যেতে পারে, পর্যাপ্ত জায়গা ছেড়ে দেওয়া যেতে পারে।

  4. তথ্য পুনরুদ্ধার করা হচ্ছে। বিভিন্ন বাজারে একাধিকবার যাচাই করা উচিত, যাতে ওভারফিল্ডিং এড়ানো যায়

  5. উচ্চ পর্যায়ের গড়ও ফিল্টার শর্ত হিসাবে ব্যর্থ হতে পারে। প্রবণতা শ্রেণিবিন্যাসের মতো পদ্ধতিগুলি বড়-চক্রের গতিপথ নির্ধারণে সহায়ক হওয়া উচিত।

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

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

  1. বিভিন্ন দোলক সূচকের প্যারামিটার সমন্বয় পরীক্ষা করুন, এমন একটি সমন্বয় নির্বাচন করুন যা একটি ভাল মানের সংকেত সরবরাহ করতে পারে, যেমন দ্রুত কে লাইনের স্টোচ সূচক ইত্যাদি।

  2. এটি একটি চলমান স্টপ হিসাবে একটি আংশিক স্টপ পরিবর্তন করার চেষ্টা করুন এবং এটিআর বা চলমান গড়ের উপর ভিত্তি করে স্টপ অবস্থান সেট করুন।

  3. উচ্চ-চক্রের গড়-রেখা ফিল্টারিং পদ্ধতির পরিবর্তে মেশিন লার্নিং অ্যালগরিদম যুক্ত করা হয়েছে, যা উচ্চ-চক্রের প্রবণতা নির্ধারণের জন্য নির্ভুলতা উন্নত করে।

  4. “অর্থনীতিতে, এই প্রবণতাটি হ্রাস করা উচিত নয়, কারণ এটি হ্রাস করা উচিত নয়।

  5. ইন্টিগ্রেশন এবং ওজন অপ্টিমাইজেশনের জন্য, বর্তমান জাতের জন্য সবচেয়ে উপযুক্ত সূচক সমন্বয় নির্বাচন করুন।

  6. মেশিন লার্নিং উইন্ড কন্ট্রোল মডিউল যোগ করা হয়েছে, স্টপ লস, স্টপ স্টপ, পজিশন ইত্যাদির গতিশীল অপ্টিমাইজেশনের জন্য।

  7. ট্রেডিং সিগন্যালের সাথে ত্রিভুজ বা ফরেক্স অ্যাবারটেজ যুক্ত করুন, ফরচার্ড এবং ক্যাশের মধ্যে মূল্যের পার্থক্য ব্যবহার করে লাভ করুন।

সারসংক্ষেপ

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

কৌশল সোর্স কোড
/*backtest
start: 2023-08-26 00:00:00
end: 2023-09-25 00:00:00
period: 1h
basePeriod: 15m
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Oscilator candles - strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

oscilatorType = input(title="Oscliator Type", defval="stoch", options=["rsi", "stoch", "cog", "macd", "tsi", "cci", "cmo", "mfi"])
length = input(3)
shortlength = input(3)
longlength = input(9)

showSupertrend = input(true)
AtrMAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(30, step=10)
stopMultiplier  = input(4)
targetMultiplier  = input(3)
wicks = input(true)
considerWicksForDelayByStep = input(false)
colorByPreviousClose = input(true)

useHTFPivot = input(false)
resolution = input("12M", type=input.resolution)
HTFMultiplier = input(4, title="Higher Timeframe multiplier (Used when resolution is set to Same as Symbol)", minval=2, step=1)
PivotLength = input(2, step=1)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Backtest Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "Backtest End Time", type = input.time)
inDateRange = true

f_getOscilatorValues(oscilatorType, length, shortlength, longlength)=>
    oOpen = rsi(open, length)
    oClose = rsi(close, length)
    oHigh = rsi(high, length)
    oLow = rsi(low, length)
    if(oscilatorType == "tsi")
        oOpen := tsi(open, shortlength, longlength)
        oClose := tsi(close, shortlength, longlength)
        oHigh := tsi(high, shortlength, longlength)
        oLow := tsi(low, shortlength, longlength)
    if(oscilatorType == "stoch")
        oOpen := stoch(open, longlength, shortlength, length)
        oClose := stoch(close, longlength, shortlength, length)
        oHigh := stoch(high, longlength, shortlength, length)
        oLow := stoch(low, longlength, shortlength, length)
    if(oscilatorType == "cci")
        oOpen := cci(open, length)
        oClose := cci(close, length)
        oHigh := cci(high, length)
        oLow := cci(low, length)
    if(oscilatorType == "cog")
        oOpen := cog(open, length)
        oClose := cog(close, length)
        oHigh := cog(high, length)
        oLow := cog(low, length)
    if(oscilatorType == "cmo")
        oOpen := cmo(open, length)
        oClose := cmo(close, length)
        oHigh := cmo(high, length)
        oLow := cmo(low, length)
    if(oscilatorType == "mfi")
        oOpen := mfi(open, length)
        oClose := mfi(close, length)
        oHigh := mfi(high, length)
        oLow := mfi(low, length)
    if(oscilatorType == "macd")
        [macdLineOpen, signalLineOpen, histLineOpen] = macd(open, shortlength, longlength, length)
        [macdLineClose, signalLineClose, histLineClose] = macd(close, shortlength, longlength, length)
        [macdLineHigh, signalLineHigh, histLineHigh] = macd(high, shortlength, longlength, length)
        [macdLineLow, signalLineLow, histLineLow] = macd(low, shortlength, longlength, length)
        oOpen := macdLineOpen
        oClose := macdLineClose
        oHigh := macdLineHigh
        oLow := macdLineLow
    [oOpen, oClose, oHigh, oLow]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)=>
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
    atr = averagetruerange * stopMultiplier

    longStop = oClose - atr
    longStopPrev = nz(longStop[1], longStop)
    longStop := (wicks ? oLow[1] : oClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop
    
    shortStop = oClose + atr
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := (wicks ? oHigh[1] : oClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
    
    dir = 1
    dir := nz(dir[1], dir)
    dir := dir == -1 and (wicks ? oHigh : oClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? oLow : oClose) < longStopPrev ? -1 : dir
    
    trailingStop = dir == 1? longStop : shortStop
    
    [dir, trailingStop]


f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, considerWicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)=>
    barState = 0
    source = oClose
    
    truerange = max(oHigh, oClose[1]) - min(oLow, oClose[1])
    
    atr = f_getMovingAverage(truerange, AtrMAType, AtrLength)

    buyStop = source - atr * stopMultiplier
    sellStop = source + atr * stopMultiplier
    buyStopDerived = buyStop
    sellStopDerived = sellStop
    highTarget = considerWicks ? oHigh : source
    lowTarget = considerWicks ? oLow : source
    
    highTargetDelayByStep = considerWicksForDelayByStep ? oHigh : source
    lowTargetDelayByStep = considerWicksForDelayByStep ? oLow : source
    
    barState := highTarget > sellStopDerived[1] ? 1 : lowTarget < buyStopDerived[1] ? -1 : nz(barState[1],0)
    
    buyMultiplier = (barState == 1)? stopMultiplier : targetMultiplier
    sellMultiplier = (barState == -1)? stopMultiplier : targetMultiplier
    buyStop := source - atr * buyMultiplier
    sellStop := source + atr * sellMultiplier
    buyStop := barState == 1? max(buyStop, buyStop[1]) : barState == -1? min(buyStop, buyStop[1]) : buyStop
    sellStop := barState == 1? max(sellStop, sellStop[1]) : barState == -1? min(sellStop, sellStop[1]) : sellStop
    
    buyStopDerived := buyStop
    sellStopDerived := sellStop
    
    buyStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? buyStopDerived[1] : buyStopDerived
    sellStopDerived := highTargetDelayByStep < sellStopDerived[1] and lowTargetDelayByStep > buyStopDerived[1] ? sellStopDerived[1] : sellStopDerived

    [buyStopDerived, sellStopDerived, barState]


f_secureSecurity(_symbol, _res, _src) => security(_symbol, _res, _src[1], lookahead = barmerge.lookahead_on, gaps=barmerge.gaps_off)

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"
    
f_getPivotHighLow(oOpen, oClose, oHigh, oLow, HTFMultiplier, resolution, PivotLength)=>
    derivedResolution = resolution == ""? f_multiple_resolution(HTFMultiplier) : resolution
    HTFHigh = f_secureSecurity(syminfo.tickerid, derivedResolution, oHigh)
    HTFLow = f_secureSecurity(syminfo.tickerid, derivedResolution, oLow)
    CLOSEprev = f_secureSecurity(syminfo.tickerid, derivedResolution, oClose)
    pivothi = pivothigh(HTFHigh, PivotLength, PivotLength)
    pivotlo = pivotlow(HTFLow, PivotLength, PivotLength)
    pivothi := na(pivothi)? nz(pivothi[1]) : pivothi
    pivotlo := na(pivotlo)? nz(pivotlo[1]) : pivotlo
    [pivothi, pivotlo]
    
[oOpen, oClose, oHigh, oLow] = f_getOscilatorValues(oscilatorType, length, shortlength, longlength)
[dir, trailingStop] = f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, stopMultiplier, wicks)

candleColor = colorByPreviousClose ?
                 (oClose[1] < oClose ? color.green : oClose[1] > oClose ? color.red : color.silver) : 
                 (oOpen < oClose ? color.green : oOpen > oClose ? color.red : color.silver)
plotcandle(oOpen, oHigh, oLow, oClose, 'Oscilator Candles', color = candleColor)

[buyStopDerived, sellStopDerived, barState] = f_getBuySellStops(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, wicks, considerWicksForDelayByStep, stopMultiplier, targetMultiplier)

trailingStopDerived = barState == 1? buyStopDerived : sellStopDerived

plot(showSupertrend?trailingStopDerived:na, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= barState == 1 ? color.green : color.red)

[pivotHigh, pivotLow] = f_getPivotHighLow(open, close, high, low, HTFMultiplier, resolution, PivotLength)

buyCondition = (barState == 1) and (close > pivotHigh or not useHTFPivot)
exitBuyConditin = (barState == -1)
sellCondition = (barState == -1) and (close < pivotLow or not useHTFPivot)
exitSellCondition = (barState == 1)

// strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca")
strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca")
strategy.close("Buy", when = exitBuyConditin)
strategy.close( "Sell", when = exitSellCondition)