दोहरी चलती औसत क्रॉस टाइमफ्रेम ट्रेडिंग रणनीति

लेखक:चाओझांग, दिनांकः 2024-02-04 15:03:41
टैगः

img

अवलोकन

यह रणनीति दो अलग-अलग समय सीमाओं में दो अलग-अलग प्रकार के चलती औसत की गणना करके खरीद और बिक्री संकेत उत्पन्न करती है। यह विभिन्न चलती औसत और समय सीमा संयोजनों के साथ प्रयोग करने के लिए एक बहुत अच्छी सैंडबॉक्स रणनीति है।

रणनीति तर्क

यह रणनीति दो चलती औसत, एक तेजी से चलती औसत और एक धीमी गति से चलती औसत का उपयोग करती है। तेजी से चलती औसत की समय सीमा चार्ट समय सीमा से अधिक या बराबर होनी चाहिए। जब तेजी से चलती औसत धीमी गति से चलती औसत से ऊपर पार करती है, तो एक खरीद संकेत उत्पन्न होता है। जब तेजी से चलती औसत धीमी गति से चलती औसत से नीचे पार करती है, तो एक बिक्री संकेत उत्पन्न होता है।

उपयोगकर्ता विभिन्न प्रकार के मूविंग एवरेज जैसे एसएमए, ईएमए, कामा आदि में से चुन सकते हैं, और समय सीमा अलग हो सकती है। यह इष्टतम मापदंडों को खोजने के लिए विभिन्न संयोजनों के साथ प्रयोग करने की अनुमति देता है।

लाभ विश्लेषण

इस रणनीति का सबसे बड़ा लाभ यह है कि यह सर्वोत्तम पैरामीटर सेटिंग्स खोजने के लिए विभिन्न संयोजनों के साथ प्रयोग करने के लिए मापदंडों के आसान समायोजन की अनुमति देता है।

उपयोगकर्ता दो चलती औसत के प्रकार, लंबाई, समय सीमा को स्वतंत्र रूप से चुन सकते हैं। सिस्टम वास्तविक समय में परिणामों की गणना और प्रदर्शित करता है। यह विभिन्न पैरामीटर संयोजनों के साथ रणनीतियों का परीक्षण करने की तुलना में बहुत आसान है।

इसके अलावा, अंतर्निहित स्टॉप लॉस/टेक प्रॉफिट कार्यक्षमता जोखिम को कम करने और लाभप्रदता बढ़ाने में मदद करती है।

जोखिम विश्लेषण

इस रणनीति का सबसे बड़ा जोखिम यह है कि अनुचित पैरामीटर सेटिंग्स के परिणामस्वरूप बहुत बार ट्रेडिंग सिग्नल हो सकते हैं, जिससे ट्रेडिंग लागत और फिसलने के नुकसान बढ़ सकते हैं।

इसके अलावा, दोहरी चलती औसत स्वयं झूठे संकेत देने की प्रवृत्ति रखते हैं। यदि मापदंडों को सही ढंग से नहीं चुना जाता है, तो खरीद / बिक्री संकेत विश्वसनीय नहीं हो सकते हैं।

इन जोखिमों को मापदंडों को अनुकूलित करके और अन्य संकेतकों के साथ जोड़कर कम किया जा सकता है।

अनुकूलन दिशाएँ

दोहरी चलती औसत के ऊपर खरीदने/बेचने के संकेतों को फ़िल्टर करने के लिए आरएसआई जैसे अन्य संकेतकों को जोड़ने पर विचार करें। इससे झूठे संकेतों को कम करने में मदद मिल सकती है।

चलती औसत के मापदंडों को सर्वोत्तम संयोजन खोजने के लिए प्रशिक्षण के माध्यम से भी अनुकूलित किया जा सकता है। मापदंडों को गतिशील रूप से अनुकूलित करने के लिए मशीन लर्निंग विधियों का भी उपयोग किया जा सकता है।

निष्कर्ष

यह दोहरी चलती औसत के साथ प्रयोग करने के लिए एक उत्कृष्ट सैंडबॉक्स है। इसका सबसे बड़ा लाभ सबसे अच्छी ट्रेडिंग रणनीति खोजने के लिए विभिन्न पैरामीटर संयोजनों का तेजी से पुनरावृत्ति है। बेशक अनुचित पैरामीटर सेटिंग्स के जोखिम भी हैं, जिन्हें फ़िल्टरिंग संकेतक जोड़कर कम किया जा सकता है। इस रणनीति के आगे के अनुकूलन से संभावित रूप से और भी बेहतर ट्रेडिंग प्रदर्शन हो सकता है।


/*backtest
start: 2023-01-28 00:00:00
end: 2024-02-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License https://creativecommons.org/licenses/by-sa/4.0/
// © dman103
// A moving averages SandBox strategy where you can experiment using two different moving averages (like KAMA, ALMA, HMA, JMA, VAMA and more) on different time frames to generate BUY and SELL signals, when they cross.
// Great sandbox for experimenting with different moving averages and different time frames.
//
// == How to use ==
// We select two types of moving averages on two different time frames:
//
// First is the FAST moving average that should be at the same time frame or higher.
// Second is the SLOW moving average that should be on the same time frame or higher.
// When FAST moving average cross over the SLOW moving average we have a BUY signal (for LONG)
// When FAST moving average cross under the SLOW moving average we have a SELL signal (for SHORT)


// WARNING: Using a lower time frame than your chart time frame will result in unrealistic results in your backtesting and bar replay.
// == NOTES ==
// You can select BOTH, LONG, SHORT or NONE in the strategy settings.
// You can also enable Stop Loss and Take Profit.
// More sandboxes to come, Follow to get notified.
// Can also act as indicator by settings 'What trades should be taken' to 'NONE'

//@version=4
strategy("Multi MA MTF SandBox Strategy","Multi MA SandBox",overlay=true)
tradeType = input("LONG", title="What trades should be taken:", options=["LONG", "SHORT", "BOTH", "NONE"])
fast_title = input(true,     title='---------------- Fast Moving Average (BLUE)----------------', type=input.bool)
ma_select1 = input(title="First Slow moving average", defval="EMA", options=["SMA", "EMA", "WMA", "HMA", "JMA", "KAMA", "TMA", "VAMA", "SMMA", "DEMA" , "VMA", "WWMA", "EMA_NO_LAG", "TSF","ALMA"])
resma_fast = input(title="First Time Frame", type=input.resolution, defval="")
lenma_fast = input(title="First MA Length", type=input.integer, defval=6)
slow_title = input(true,     title='---------------- Slow Moving Average (YELLOW)----------------', type=input.bool)
ma_select2 = input(title="Second Fast moving average", defval="JMA", options=["SMA", "EMA", "WMA", "HMA", "JMA", "KAMA", "TMA", "VAMA", "SMMA", "DEMA" , "VMA", "WWMA", "EMA_NO_LAG", "TSF","ALMA"])
resma_slow = input(title="Second time frame", type=input.resolution, defval="")
lenma_slow = input(title="Second MA length", type=input.integer, defval=14)

settings = input(true,     title='---------------- Other Settings ----------------', type=input.bool)
lineWidth = input(2,title="Line Width")
colorTransparency=input(50,title="Color Transparency",step=10,minval=0,maxval=100)
color_fast=input(color.blue,type=input.color)
color_slow=input(color.yellow,type=input.color)
fillColor = input(title="Fill Color", type=input.bool, defval=true)
IndicatorSettings = input(true,     title='---------------- Indicators Settings ----------------', type=input.bool)
offset=input(title="Alma Offset (only for ALMA)",defval=0.85, step=0.05)
volatility_lookback =input(title="Volatility lookback (only for VAMA)",defval=12)
i_fastAlpha = input(1.25,"KAMA's alpha (only for KAMA)", minval=1,step=0.25)
fastAlpha = 2.0 / (i_fastAlpha + 1)
slowAlpha = 2.0 / (31)
///////Moving Averages
MA_selector(src, length,ma_select) =>
    ma = 0.0
    if ma_select == "SMA"
        ma := sma(src, length)
        ma

    if ma_select == "EMA"
        ma := ema(src, length)
        ma

    if ma_select == "WMA"
        ma := wma(src, length)
        ma
    if ma_select == "HMA"
        ma := hma(src,length)
        ma
    if ma_select == "JMA"
        beta = 0.45*(length-1)/(0.45*(length-1)+2)
        alpha = beta
        tmp0 = 0.0, tmp1 = 0.0, tmp2 = 0.0, tmp3 = 0.0, tmp4 = 0.0
        tmp0 := (1-alpha)*src + alpha*nz(tmp0[1])
        tmp1 := (src - tmp0[0])*(1-beta) + beta*nz(tmp1[1])
        tmp2 := tmp0[0] + tmp1[0]
        tmp3 := (tmp2[0] - nz(tmp4[1]))*((1-alpha)*(1-alpha)) + (alpha*alpha)*nz(tmp3[1])
        tmp4 := nz(tmp4[1]) + tmp3[0]
        ma := tmp4
        ma
    if ma_select == "KAMA"
        momentum = abs(change(src, length))
        volatility = sum(abs(change(src)), length)
        efficiencyRatio = volatility != 0 ? momentum / volatility : 0
        smoothingConstant = pow((efficiencyRatio * (fastAlpha - slowAlpha)) + slowAlpha, 2)
        var kama = 0.0
        kama := nz(kama[1], src) + smoothingConstant * (src - nz(kama[1], src))
        ma:=kama
        ma
    if ma_select == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if ma_select == "VMA"
        valpha=2/(length+1)
        vud1=src>src[1] ? src-src[1] : 0
        vdd1=src<src[1] ? src[1]-src : 0
        vUD=sum(vud1,9)
        vDD=sum(vdd1,9)
        vCMO=nz((vUD-vDD)/(vUD+vDD))
        VAR=0.0
        VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
        ma := VAR
        ma

    if ma_select == "WWMA"
        wwalpha = 1/ length
        WWMA = 0.0
        WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
        ma := WWMA
        ma

    if ma_select == "EMA_NO_LAG"
        EMA1= ema(src,length)
        EMA2= ema(EMA1,length)
        Difference= EMA1 - EMA2
        ma := EMA1 + Difference
        ma

    if ma_select == "TSF"
        lrc = linreg(src, length, 0)
        lrc1 = linreg(src,length,1)
        lrs = (lrc-lrc1)
        TSF = linreg(src, length, 0)+lrs
        ma := TSF
        ma
        
    if ma_select =="VAMA" // Volatility Adjusted from @fractured
        mid=ema(src,length)
        dev=src-mid
        vol_up=highest(dev,volatility_lookback)
        vol_down=lowest(dev,volatility_lookback)
        ma := mid+avg(vol_up,vol_down)
        ma
    if ma_select == "SMMA"
        smma = float (0.0)
        smaval=sma(src, length)
        smma := na(smma[1]) ? smaval : (smma[1] * (length - 1) + src) / length
        ma := smma
    
    if ma_select == "DEMA"
        e1 = ema(src, length)
        e2 = ema(e1, length)
        ma := 2 * e1 - e2
        ma
    if ma_select == "ALMA"
        ma := alma(src, length,offset, 6)
        ma
    ma

// Calculate EMA
ma_fast = MA_selector(close, lenma_fast,ma_select1)
ma_slow = MA_selector(close, lenma_slow,ma_select2)

maFastStep = security(syminfo.tickerid, resma_fast, ma_fast)
maSlowStep = security(syminfo.tickerid, resma_slow, ma_slow)

ma1_plot=plot(maFastStep, color=color_fast,linewidth=lineWidth,transp=colorTransparency)
ma2_plot=plot(maSlowStep, color=color_slow,linewidth=lineWidth,transp=colorTransparency)
colors=ma_fast>ma_slow ? color.green : color.red
fill(ma1_plot,ma2_plot, color=fillColor? colors: na,transp=colorTransparency+15)

closeStatus = strategy.openprofit > 0 ? "win" : "lose"
////////Long Rules
long = crossover(maFastStep,maSlowStep) and (tradeType == "LONG" or tradeType == "BOTH")
longClose =crossunder(maFastStep,maSlowStep)//and falling(maSlowStep,1) 
///////Short Rules
short =crossunder(maFastStep,maSlowStep) and (tradeType == "SHORT" or tradeType == "BOTH")
shortClose =  crossover(maFastStep,maSlowStep)


longShape= crossover(maFastStep,maSlowStep) and tradeType == "NONE"
shortShape = crossunder(maFastStep,maSlowStep) and tradeType == "NONE"
plotshape(longShape, style=shape.triangleup,location=location.belowbar, color=color.lime,size=size.small)
plotshape(shortShape,style=shape.triangledown,location=location.abovebar, color=color.red,size=size.small)
// === Stop LOSS ===
useStopLoss = input(false, title='----- Add Stop Loss / Take profit -----', type=input.bool)

sl_inp = input(2.5, title='Stop Loss %', type=input.float, step=0.1)/100
tp_inp = input(5, title='Take Profit %', type=input.float, step=0.1)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
if (long)
    strategy.entry("long", strategy.long)
if (short)
    strategy.entry("short", strategy.short)
    
strategy.close ("long", when = longClose, comment=closeStatus) 
strategy.close ("short", when = shortClose, comment=closeStatus) 

if (useStopLoss)
    strategy.exit("Stop Loss/Profit Long","long", stop=stop_level, limit=take_level,comment =closeStatus )
    strategy.exit("Stop Loss/Profit Short","short", stop=stop_level_short, limit=take_level_short, comment = closeStatus)


अधिक