Momentum Stochastic Smoothed Moving Average Strategy


تخلیق کی تاریخ: 2023-12-19 11:41:40 آخر میں ترمیم کریں: 2023-12-19 11:41:40
کاپی: 0 کلکس کی تعداد: 661
1
پر توجہ دیں
1621
پیروکار

Momentum Stochastic Smoothed Moving Average Strategy

جائزہ

اس حکمت عملی میں اشاریہ منتقل اوسط ((EMA) اور بے ترتیب اشارے ((Stochastic Oscillator) کا امتزاج کیا گیا ہے ، جس میں رجحانات کی پیروی اور تسلسل کا طریقہ استعمال کیا گیا ہے ، اور اس میں کچھ بہت ہی عمدہ خصوصیات ہیں۔ میں نے اس حکمت عملی کو خاص طور پر تجارت کے متبادل کے لئے ڈیزائن کیا ہے ، لیکن یہ بٹ کوائن اور کچھ غیر ملکی کرنسی کے جوڑوں کے لئے بھی کام کرتا ہے۔

حکمت عملی کا اصول

اس حکمت عملی میں ٹریڈنگ سگنل کھولنے کے لئے 4 ضروری شرائط ہیں۔ مندرجہ ذیل ایک سے زیادہ تجارت کھولنے کے لئے ضروری ہیں (بلائنڈ سگنل بالکل برعکس ہے):

  • تیز EMA سست EMA سے زیادہ ہے
  • بے ترتیب K لائنوں میں overbought علاقوں
  • ایک بے ترتیب K لائن ایک بے ترتیب D لائن کے ذریعے اوپر کی طرف
  • سست EMA اور تیز EMA کے درمیان قیمت کا اختتام

ایک بار جب تمام شرائط درست ہوجائیں تو ، اگلی K لائن کھلنے پر پوزیشن کھولی جائے گی۔

طاقت کا تجزیہ

اس حکمت عملی میں ای ایم اے اور بے ترتیب اشارے کی طاقت کا استعمال کیا گیا ہے ، جس سے رجحانات کے آغاز اور تسلسل کو مؤثر طریقے سے پکڑنے میں مدد ملتی ہے ، اور یہ وسط اور لمبی لائن آپریشن کے لئے موزوں ہے۔ اس حکمت عملی میں متعدد حسب ضرورت پیرامیٹرز مہیا کیے گئے ہیں ، جن کو صارف اپنے تجارتی انداز اور مارکیٹ کی خصوصیات کے مطابق ایڈجسٹ کرسکتا ہے۔

اس حکمت عملی کے کچھ فوائد یہ ہیں:

  1. ای ایم اے نے رجحان کی سمت کا فیصلہ کیا ، جس سے سگنل کی استحکام اور وشوسنییتا میں اضافہ ہوا
  2. بے ترتیب اشارے سے معلوم کریں کہ کیا آپ نے زیادہ خریدا ہے یا زیادہ فروخت کیا ہے اور واپسی کے مواقع تلاش کریں
  3. دو اشارے جوڑ کر ، رجحان کی پیروی اور الٹ ٹریڈنگ
  4. اے ٹی آر خود کار طریقے سے سٹاپ نقصان کی فاصلے کا حساب لگاتا ہے ، اسٹاپ نقصان مارکیٹ میں اتار چڑھاؤ کے ساتھ ایڈجسٹ ہوتا ہے
  5. مختلف صارفین کی ضروریات کو پورا کرنے کے لئے اپنی مرضی کے مطابق رسک ریٹرن تناسب
  6. صارفین کو مارکیٹ کے مطابق ایڈجسٹ کرنے کے لئے متعدد پیرامیٹرز کی تخصیص کی پیش کش

خطرے کا تجزیہ

اس حکمت عملی کے اہم خطرات میں شامل ہیں:

  1. ای ایم اے کراس فارمیشن سگنل میں جھوٹی خرابی ہوسکتی ہے ، جس سے غلط سگنل پیدا ہوتا ہے
  2. بے ترتیب اشارے خود ہی پیچھے رہ جاتے ہیں ، قیمتوں میں الٹ جانے کا بہترین وقت سے محروم ہوسکتے ہیں
  3. مارکیٹ کے بدلتے ہوئے ماحول کے لیے ایک ہی حکمت عملی کافی نہیں ہے

مندرجہ بالا خطرات کو کم کرنے کے لئے، مندرجہ ذیل اقدامات کئے جا سکتے ہیں:

  1. EMA سائیکل پیرامیٹرز کو مناسب طریقے سے ایڈجسٹ کریں تاکہ زیادہ سے زیادہ غلط سگنل پیدا نہ ہوں
  2. ٹریڈنگ سگنل کی وشوسنییتا کو یقینی بنانے کے لئے رجحانات اور معاونات کے لئے مزید اشارے شامل کریں
  3. واضح فنڈ مینجمنٹ کی حکمت عملی تیار کریں اور ہر ٹرانزیکشن کے لئے خطرے کی نالی کو کنٹرول کریں
  4. ایک جامع حکمت عملی کا استعمال کرتے ہوئے ، مختلف حکمت عملیوں سے سگنل کی توثیق کی جاسکتی ہے ، جس سے استحکام میں اضافہ ہوتا ہے

اصلاح کی سمت

اس حکمت عملی کو مزید بہتر بنانے کے لیے درج ذیل نکات پر غور کیا جا سکتا ہے:

  1. اتار چڑھاؤ پر مبنی پوزیشن ایڈجسٹمنٹ ماڈیول شامل کریں۔ جب مارکیٹ میں اتار چڑھاؤ بڑھتا ہے تو پوزیشن کو مناسب طریقے سے کم کیا جاسکتا ہے۔ جب اتار چڑھاؤ کم ہوتا ہے تو پوزیشن کو بڑھا دیا جاسکتا ہے۔
  2. بڑے پیمانے پر رجحانات کی تشخیص میں اضافہ کریں ، مخالف آپریشن سے گریز کریں۔ مثال کے طور پر ، روزانہ یا ہفتہ وار K لائن کے ساتھ رجحانات کی سمت کا فیصلہ کریں۔
  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)