স্টোকাস্টিক মুভিং এভারেজ কৌশল

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

img

সারসংক্ষেপ

এই কৌশলটি এক্সপোনেনশিয়াল মুভিং এভারেজ (ইএমএ) কে স্টোকাস্টিক দোলকের সাথে ট্রেন্ড অনুসরণ এবং ধারাবাহিকতার পদ্ধতিতে একত্রিত করে, কিছু দুর্দান্ত কার্যকারিতা সহ। আমি এই কৌশলটি বিশেষত আল্টকয়েন ট্রেডিংয়ের জন্য ডিজাইন করেছি, তবে এটি বিটকয়েন নিজেই এবং কিছু ফরেক্স জোড়ায় ঠিক ততটাই ভাল কাজ করে।

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

কৌশল একটি ট্রেডিং সংকেত আনলক করার জন্য 4 বাধ্যতামূলক শর্ত আছে। নীচে একটি দীর্ঘ বাণিজ্য জন্য এই শর্তগুলি খুঁজুন (শর্ট জন্য সঠিক বিপরীত উপায় বৃত্তাকার কাজ করে)

  • ফাস্ট ইএমএ ধীর ইএমএ এর চেয়ে বেশি হতে হবে
  • স্টোকাস্টিক K% লাইনটি অবশ্যই ওভারকোপ টেরিটরিতে থাকতে হবে
  • স্টোকাস্টিক K% লাইন স্টোকাস্টিক D% লাইন অতিক্রম করতে হবে
  • ধীর EMA এবং দ্রুত EMA এর মধ্যে বন্ধের মূল্য একবার সব শর্ত সত্য হলে, পরবর্তী মোমবাতি খোলার সময় একটি ট্রেড শুরু হবে।

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

এই কৌশলটি EMA এবং Stochastic এর সুবিধাগুলিকে একত্রিত করে ট্রেন্ডের সূচনা এবং ধারাবাহিকতা কার্যকরভাবে ক্যাপচার করতে, মাঝারি এবং দীর্ঘমেয়াদী অপারেশনের জন্য উপযুক্ত। একই সময়ে, কৌশলটি ব্যবহারকারীদের জন্য তাদের ট্রেডিং স্টাইল এবং বাজারের বৈশিষ্ট্যগুলির উপর ভিত্তি করে সামঞ্জস্য করার জন্য অনেকগুলি কাস্টমাইজযোগ্য পরামিতি সরবরাহ করে।

এই কৌশলটির সুবিধাগুলির মধ্যে রয়েছেঃ

  1. ইএমএ ক্রসিংগুলি প্রবণতার দিক নির্ধারণ করে এবং সংকেতের স্থিতিশীলতা এবং নির্ভরযোগ্যতা বাড়ায়
  2. স্টোকাস্টিক বিচারকরা বিপরীতমুখী সুযোগ খুঁজে পেতে অতিরিক্ত ক্রয় এবং অতিরিক্ত বিক্রয় স্তর
  3. দুটি সূচককে একত্রিত করে, এটিতে প্রবণতা অনুসরণ এবং গড় বিপরীত উভয়ই রয়েছে
  4. ATR স্বয়ংক্রিয়ভাবে স্টপ লস দূরত্ব গণনা করে, বাজারের অস্থিরতার উপর ভিত্তি করে স্টপগুলি সামঞ্জস্য করে
  5. বিভিন্ন ব্যবহারকারীর চাহিদা মেটাতে ঝুঁকি পুরস্কার অনুপাত কাস্টমাইজযোগ্য
  6. ব্যবহারকারীদের বাজারের উপর ভিত্তি করে সামঞ্জস্য করার জন্য একাধিক কাস্টমাইজযোগ্য পরামিতি সরবরাহ করে

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

এই কৌশলটির প্রধান ঝুঁকিগুলি নিম্নলিখিত থেকে আসেঃ

  1. ইএমএ ক্রসিংয়ে মিথ্যা বিরতি থাকতে পারে, যার ফলে ভুল সংকেত তৈরি হয়
  2. স্টোকাস্টিক নিজেই বিলম্বিত বৈশিষ্ট্য আছে, মূল্য বিপরীত জন্য সেরা সময় মিস করতে পারেন
  3. একটি একক কৌশল সর্বদা পরিবর্তিত বাজারের পরিবেশে পুরোপুরি অভিযোজিত হতে পারে না

উপরের ঝুঁকিগুলি হ্রাস করার জন্য, আমরা নিম্নলিখিত ব্যবস্থা গ্রহণ করতে পারিঃ

  1. খুব বেশি মিথ্যা সংকেত এড়ানোর জন্য EMA সময়ের পরামিতিগুলি সামঞ্জস্য করুন
  2. নির্ভরযোগ্য সংকেত নিশ্চিত করার জন্য প্রবণতা এবং সমর্থন স্তরগুলি বিচার করার জন্য আরও সূচক অন্তর্ভুক্ত করুন
  3. ট্রেডিং প্রতি ঝুঁকি এক্সপোজার নিয়ন্ত্রণ করার জন্য স্পষ্ট অর্থ ব্যবস্থাপনা কৌশল নির্ধারণ করুন
  4. সংমিশ্রণ কৌশল গ্রহণ করুন যাতে বিভিন্ন কৌশল সংকেত যাচাই করতে পারে এবং স্থিতিশীলতা উন্নত করতে পারে

অপ্টিমাইজেশান নির্দেশাবলী

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

  1. ভোল্টেবিলিটি ভিত্তিক পজিশন অ্যাডজাস্টমেন্ট মডিউল যোগ করুন। ভোল্টেবিলিটি বেড়ে গেলে আকার হ্রাস করুন এবং শান্ত হলে বৃদ্ধি করুন।
  2. উদাহরণস্বরূপ, দৈনিক বা সাপ্তাহিক প্রবণতা একত্রিত করে, বিপরীত প্রবণতা অপারেশন এড়ানোর জন্য উচ্চতর সময়সীমার প্রবণতার বিচার যোগ করুন।
  3. সিগন্যাল জেনারেশনে সহায়তা করার জন্য মেশিন লার্নিং মডেল যুক্ত করুন। ঐতিহাসিক তথ্যের উপর ভিত্তি করে ট্রেন শ্রেণীবিভাগ মডেল।
  4. স্টপ এবং আকারকে আরও বুদ্ধিমান করার জন্য অর্থ পরিচালনার মডিউলগুলি অপ্টিমাইজ করুন।

সিদ্ধান্ত

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


/*backtest
start: 2023-11-18 00:00:00
end: 2023-12-18 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/
// © LucasVivien

// Since this Strategy may have its stop loss hit within the opening candle, consider turning on 'Recalculate : After Order is filled' in the strategy settings, in the "Properties" tabs

//@version=5
strategy("Stochastic Moving Average", shorttitle="Stoch. EMA", overlay=true, default_qty_type= strategy.cash, initial_capital=10000, default_qty_value=100)

//==============================================================================
//==============================   USER INPUT   ================================
//==============================================================================

var g_tradeSetup = "     Trade Setup"
activateLongs  = input.bool (title="Long Trades"        , defval=true                                       , inline="A1", group=g_tradeSetup, tooltip="")
activateShorts = input.bool (title="Short Trades"       , defval=true                                       , inline="A1", group=g_tradeSetup, tooltip="")
rr             = input.float(title="Risk : Reward"      , defval=1   , minval=0, maxval=100       , step=0.1, inline=""  , group=g_tradeSetup, tooltip="")
RiskEquity     = input.bool (title="Risk = % Equity    ", defval=false                                      , inline="A2", group=g_tradeSetup, tooltip="Set stop loss size as a percentage of 'Initial Capital' -> Strategy Parameter -> Properties tab (Low liquidity markets will affect will prevent to get an exact amount du to gaps)")
riskPrctEqui   = input.float(title=""                   , defval=1   , minval=0, maxval=100       , step=0.1, inline="A2", group=g_tradeSetup, tooltip="")
RiskUSD        = input.bool (title="Risk = $ Amount   " , defval=false                                      , inline="A3", group=g_tradeSetup, tooltip="Set stop loss size as a fixed Base currency amount (Low liquidity markets will affect will prevent to get an exact amount du to gaps)")
riskUSD        = input.float(title=""                   , defval=1000, minval=0, maxval=1000000000, step=100, inline="A3", group=g_tradeSetup, tooltip="")

var g_stopLoss = "     Stop Loss"
atrMult = input.float(title="ATR Multiplier", defval=1 , minval=0, maxval=100 , step=0.1, tooltip="", inline="", group=g_stopLoss)
atrLen  = input.int  (title="ATR Lookback"  , defval=14, minval=0, maxval=1000, step=1  , tooltip="", inline="", group=g_stopLoss)

var g_stochastic = "     Stochastic"
Klen            = input.int  (title="K%"                   , defval=14, minval=0, maxval=1000, step=1, inline="S2", group=g_stochastic, tooltip="")
Dlen            = input.int  (title=" D%"                  , defval=3 , minval=0, maxval=1000, step=1, inline="S2", group=g_stochastic, tooltip="")
OBstochLvl      = input.int  (title="OB"                   , defval=80, minval=0, maxval=100 , step=1, inline="S1", group=g_stochastic, tooltip="")
OSstochLvl      = input.int  (title=" OS"                  , defval=20, minval=0, maxval=100 , step=1, inline="S1", group=g_stochastic, tooltip="")
OBOSlookback    = input.int  (title="Stoch. OB/OS lookback", defval=0 , minval=0, maxval=100 , step=1, inline=""  , group=g_stochastic, tooltip="This option allow to look 'x' bars back for a value of the Stochastic K line to be overbought or oversold when detecting an entry signal (if 0, looks only at current bar. if 1, looks at current and previous and so on)")
OBOSlookbackAll = input.bool (title="All must be OB/OS"    , defval=false                            , inline=""  , group=g_stochastic, tooltip="If turned on, all bars within the Stochastic K line lookback period must be overbought or oversold to return a true signal")
entryColor      = input.color(title="   "                  , defval=#00ffff                          , inline="S3", group=g_stochastic, tooltip="")
baseColor       = input.color(title="  "                   , defval=#333333                          , inline="S3", group=g_stochastic, tooltip="Will trun to designated color when stochastic gets to opposite extrem zone of current trend / Number = transparency")
transp          = input.int  (title="   "                  , defval=50, minval=0, maxval=100, step=10, inline="S3", group=g_stochastic, tooltip="")

var g_ema = "     Exp. Moving Average"
ema1len = input.int  (title="Fast EMA     ", defval=21, minval=0, maxval=1000, step=1, inline="E1", group=g_ema, tooltip="")
ema2len = input.int  (title="Slow EMA     ", defval=50, minval=0, maxval=1000, step=1, inline="E2", group=g_ema, tooltip="")
ema1col = input.color(title="     "        , defval=#0066ff                          , inline="E1", group=g_ema, tooltip="")
ema2col = input.color(title="     "        , defval=#0000ff                          , inline="E2", group=g_ema, tooltip="")

var g_referenceMarket ="     Reference Market"
refMfilter = input.bool     (title="Reference Market Filter", defval=false            , inline="", group=g_referenceMarket)
market     = input   (title="Market"                 , defval="BTC_USDT:swap", inline="", group=g_referenceMarket)
res        = input.timeframe(title="Timeframe"              , defval="30"             , inline="", group=g_referenceMarket)
len        = input.int      (title="EMA Length"             , defval=50               , inline="", group=g_referenceMarket)


//==============================================================================
//==========================   FILTERS & SIGNALS   =============================
//==============================================================================

//------------------------------   Stochastic   --------------------------------
K = ta.stoch(close, high, low, Klen)
D = ta.sma(K, Dlen)
stochBullCross = ta.crossover(K, D)
stochBearCross = ta.crossover(D, K)
OSstoch = false
OBstoch = false
for i = 0 to OBOSlookback
    if K[i] < OSstochLvl
        OSstoch := true
    else 
        if OBOSlookbackAll
            OSstoch := false
for i = 0 to OBOSlookback
    if K[i] > OBstochLvl
        OBstoch := true
    else 
        if OBOSlookbackAll
            OBstoch := false

//----------------------------   Moving Averages   -----------------------------
ema1 = ta.ema(close, ema1len)
ema2 = ta.ema(close, ema2len)
emaBull = ema1 > ema2
emaBear = ema1 < ema2

//----------------------------   Price source   --------------------------------
bullRetraceZone = (close < ema1 and close >= ema2) 
bearRetraceZone = (close > ema1 and close <= ema2)

//---------------------------   Reference market   -----------------------------
ema      = ta.ema(close, len)
emaHTF   = request.security(market, res, ema  [barstate.isconfirmed ? 0 : 1])
closeHTF = request.security(market, res, close[barstate.isconfirmed ? 0 : 1])

bullRefMarket = (closeHTF > emaHTF or closeHTF[1] > emaHTF[1])
bearRefMarket = (closeHTF < emaHTF or closeHTF[1] < emaHTF[1])

//--------------------------   SIGNAL VALIDATION   -----------------------------
validLong  = stochBullCross and OSstoch and emaBull and bullRetraceZone 
 and activateLongs  and (refMfilter ? bullRefMarket : true) and strategy.position_size == 0
validShort = stochBearCross and OBstoch and emaBear and bearRetraceZone 
 and activateShorts and (refMfilter ? bearRefMarket : true) and strategy.position_size == 0


//==============================================================================
//===========================   STOPS & TARGETS   ==============================
//==============================================================================

SLdist      = ta.atr(atrLen) * atrMult
longSL      = close - SLdist
longSLDist  = close - longSL
longTP      = close + (longSLDist * rr)
shortSL     = close + SLdist
shortSLDist = shortSL - close
shortTP     = close - (shortSLDist * rr)
var SLsaved = 0.0
var TPsaved = 0.0
if validLong or validShort
    SLsaved := validLong ? longSL : validShort ? shortSL : na
    TPsaved := validLong ? longTP : validShort ? shortTP : na


//==============================================================================
//==========================   STRATEGY COMMANDS   =============================
//==============================================================================
 
if validLong 
    strategy.entry("Long", strategy.long, 
     qty = RiskEquity ? ((riskPrctEqui/100)*strategy.equity)/longSLDist : RiskUSD ? riskUSD/longSLDist : na)
if validShort 
    strategy.entry("Short", strategy.short, 
     qty = RiskEquity ? ((riskPrctEqui/100)*strategy.equity)/shortSLDist  : RiskUSD ? riskUSD/shortSLDist : na)

strategy.exit(id="Long Exit" , from_entry="Long" , limit=TPsaved, stop=SLsaved, when=strategy.position_size > 0)
strategy.exit(id="Short Exit", from_entry="Short", limit=TPsaved, stop=SLsaved, when=strategy.position_size < 0)


//==============================================================================
//=============================   CHART PLOTS   ================================
//==============================================================================
    
//----------------------------   Stops & Targets   -----------------------------
plot(strategy.position_size != 0 or (strategy.position_size[1] != 0 and strategy.position_size == 0) ? SLsaved : na,
 color=color.red  , style=plot.style_linebr)
plot(strategy.position_size != 0 or (strategy.position_size[1] != 0 and strategy.position_size == 0) ? TPsaved : na,
 color=color.green, style=plot.style_linebr) 

//---------------------------------   EMAs   -----------------------------------
l1 = plot(ema1, color=#0066ff, linewidth=2)
l2 = plot(ema2, color=#0000ff, linewidth=2)

//--------------------------   Stochastic gradient   ---------------------------
// fill(l1, l2, color.new(color.from_gradient(K, OSstochLvl, OBstochLvl,
//  emaBull ? entryColor : emaBear ? baseColor : na, 
//  emaBull ? baseColor  : emaBear ? entryColor : na), transp))
    
//----------------------------   Trading Signals   -----------------------------
plotshape(validLong, color=color.green, location=location.belowbar, style=shape.xcross, size=size.small)
plotshape(validShort, color=color.red , location=location.abovebar, style=shape.xcross, size=size.small)

//----------------------------   Reference Market   ----------------------------
bgcolor(bullRefMarket and refMfilter ? color.new(color.green,90) : na)
bgcolor(bearRefMarket and refMfilter ? color.new(color.red  ,90) : na)



আরো