ওসিলেটর মোমবাতি গতিশীল ট্রেডিং কৌশল

লেখক:চাওঝাং, তারিখঃ ২০২৩-০৯-২৬ ২০ঃ০৫ঃ৫৫
ট্যাগঃ

সারসংক্ষেপ

এটি একটি গতি-ভিত্তিক কৌশল যা ট্রেডিং সিগন্যাল তৈরির জন্য আরএসআই, স্টক, এমএসিডি এর মতো দোলক সূচক ব্যবহার করে। মূল ধারণাটি হ'ল সূচকগুলি ব্যবহার করে যখন দাম দোল করে এবং সূচক সংকেতগুলির ভিত্তিতে ট্রেড প্রবেশ করে তখন প্রবণতার দিকটি সনাক্ত করা। কৌশলটি স্টপ লসের জন্য বিলম্বিত সুপারট্রেন্ডও ব্যবহার করে।

কৌশলগত যুক্তি

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

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

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

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

সুবিধা বিশ্লেষণ

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

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

  2. বিলম্বিত সুপারট্রেন্ড স্টপ লস প্রয়োগ করা হ্রাস বাড়ার আগে বন্ধ করতে পারে, একক বাণিজ্য ক্ষতি সীমাবদ্ধ করে।

  3. ডায়নামিক এটিআর-এর ভিত্তিতে স্টপ লস এবং মুনাফার লক্ষ্যমাত্রা গণনা করা পজিশনের আকারকে সামঞ্জস্য করতে সাহায্য করে।

  4. উচ্চতর সময়সীমার চলমান গড়ের সাথে ফিল্টারিং সংহতকরণের ফাঁদে পড়া এড়ায়।

  5. আংশিক মুনাফা গ্রহণের ফলে মুনাফা চলতে থাকে।

  6. কোয়ান্টাম ট্রেডিংয়ের জন্য লজিকটি সহজ এবং সহজেই বোঝা যায়।

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

এই কৌশলটির কিছু ঝুঁকি অন্তর্ভুক্তঃ

  1. দোলকগুলির বিলম্বিত সমস্যা থাকতে পারে, যার ফলে বিলম্বিত প্রবেশ এবং অকাল প্রস্থান সংকেত হতে পারে। এটি প্যারামিটারগুলি অনুকূলিতকরণ বা প্রবণতা অনুসরণকারী সূচক যুক্ত করে উন্নত করা যেতে পারে।

  2. স্টপ লস ব্যাপ্তি বাড়ানো বা চ্যান্ডেলিয়ারের মতো গতিশীল স্টপ ব্যবহার করা যেতে পারে।

  3. আংশিক মুনাফা গ্রহণের পর অবশিষ্ট পজিশন বন্ধ করা যেতে পারে। আংশিক মুনাফা অনুপাত হ্রাস করা যেতে পারে।

  4. ব্যাকটেস্ট ওভারফিট ঝুঁকি। কৌশলটি বিভিন্ন বাজারে বৈধ করা উচিত।

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

উন্নতির নির্দেশাবলী

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

  1. ওসিলেটর প্যারামিটারগুলির বিভিন্ন সমন্বয় পরীক্ষা করুন এবং গুণমানের সংকেত সরবরাহ করে এমনগুলি সন্ধান করুন।

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

  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)

আরো