এমএ মোমবাতি এবং সুপারট্রেন্ডের উপর ভিত্তি করে ট্রেন্ড অনুসরণকারী কৌশল

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

এই কৌশলটির নাম ট্রেন্ড ফলোিং স্ট্র্যাটেজি বেসড অন এমএ মোমবাতি এবং সুপারট্রেন্ড। এটি ট্রেন্ড মোমবাতি নির্মাণের জন্য চলমান গড় ব্যবহার করে এবং ট্রেন্ড ফলোিংয়ের জন্য ট্রেডিং সংকেত তৈরির জন্য সুপারট্রেন্ড প্রক্রিয়া অন্তর্ভুক্ত করে।

বিশেষ করে, ট্রেডিং লজিক হলঃ

  1. প্রবণতা মোমবাতি গ্রাফ করার জন্য চলমান গড়ের সাহায্যে ওপেন, হাই, লো এবং ক্লোজ প্রাইস গণনা করুন।

  2. দীর্ঘ এবং সংক্ষিপ্ত স্টপ বের করার জন্য ট্রেন্ড মোমবাতিগুলিতে সুপার ট্রেন্ড কৌশল প্রয়োগ করুন।

  3. যখন দাম লং স্টপের উপরে যায়, তখন ক্রয় সংকেত উৎপন্ন হয়। যখন দাম শর্ট স্টপের নিচে যায়, তখন বিক্রয় সংকেত উৎপন্ন হয়।

  4. পরিসীমা-সীমাবদ্ধ বাজারে অত্যধিক অবৈধ সংকেত এড়ানোর জন্য উচ্চতর সময়সীমার বার্ষিক উচ্চ / নিম্ন মূল্য অন্তর্ভুক্ত করুন।

  5. যখন সুপারট্রেন্ড বিপরীত হয়, তখন স্টপ লস দিয়ে পজিশন বন্ধ হয়ে যায়।

এই কৌশলটির সুবিধা হ'ল একাধিক প্রযুক্তিগত সূচককে একীভূত করা নির্ভুলতা উন্নত করে। তবে চলমান গড় এবং সুপারট্রেন্ডের জন্য পরামিতিগুলির অপ্টিমাইজেশান প্রয়োজন। স্টপ লসও অপরিহার্য।

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


/*backtest
start: 2023-01-01 00:00:00
end: 2023-04-14 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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("MA Candles Supertrend Strategy", shorttitle="MACSTS", overlay=true, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)

MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
LoopbackBars = input(20, step=10)

AtrMAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(30, step=10)
AtrMult = input(1)
adoptiveWicks = false // does not work
wicks = input(true)

dThreshold = input(0.2, step=0.1, maxval=1)
rThreshold = input(0.7, step=0.1, maxval=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 = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = true
strategy.risk.allow_entry_in(tradeDirection)

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_secureSecurity(_symbol, _res, _src, _offset) => security(_symbol, _res, _src[_offset], lookahead = barmerge.lookahead_on)

f_getYearlyHighLowCondition()=>
    yhighrange = f_secureSecurity(syminfo.tickerid, '12M', high, 1) 
    ylowrange = f_secureSecurity(syminfo.tickerid, '12M', low, 1)
    yearlyHighCondition = close > yhighrange*(1-dThreshold) or close > ylowrange*(1+rThreshold)
    yearlyLowCondition = close < ylowrange*(1+dThreshold) or close < yhighrange*(1-rThreshold)
    [yearlyHighCondition, yearlyLowCondition]


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

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

    [dir, longStop, shortStop]

oOpen = f_getMovingAverage(open, MAType, LoopbackBars)
oClose = f_getMovingAverage(close, MAType, LoopbackBars)
oHigh = f_getMovingAverage(high, MAType, LoopbackBars)
oLow = f_getMovingAverage(low, MAType, LoopbackBars)

colorByPreviousClose = false
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)

[yearlyHighCondition, yearlyLowCondition] =  f_getYearlyHighLowCondition()
[dir, longStop, shortStop] = f_getSupertrend(oOpen, oClose, oHigh, oLow, AtrMAType, AtrLength, AtrMult, wicks)
trailingStop = dir == 1? longStop : shortStop
trendColor = dir == 1? color.green: color.red
plot(trailingStop, title="TrailingStop", color=trendColor, linewidth=2, style=plot.style_linebr)

longCondition = close > shortStop and dir == 1 and yearlyHighCondition
shortCondition = close < longStop and dir == -1 and yearlyLowCondition

exitLongCondition = dir == -1
exitShortCondition = dir == 1

strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Long", strategy.long, when=longCondition, oca_name="oca_buy")
strategy.close("Long", when=exitLongCondition)
strategy.entry("Short", strategy.short, when=shortCondition, oca_name="oca_sell")
strategy.close("Short", when=exitShortCondition)


আরো