اوسیلیٹر موم بتیاں رفتار ٹریڈنگ کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-09-26 20:05:55
ٹیگز:

جائزہ

یہ ایک رفتار پر مبنی حکمت عملی ہے جو ٹریڈنگ سگنل پیدا کرنے کے لئے آئسولیٹر اشارے جیسے آر ایس آئی ، اسٹاک ، ایم اے سی ڈی کا استعمال کرتی ہے۔ بنیادی خیال یہ ہے کہ اشارے کا استعمال کرتے ہوئے جب قیمت میں آئسولیشن ہوتی ہے تو رجحان کی سمت کی نشاندہی کی جائے اور اشارے کے اشاروں کی بنیاد پر تجارت کی جائے۔ یہ حکمت عملی اسٹاپ نقصان کے لئے تاخیر سے سپر ٹرینڈ کا بھی استعمال کرتی ہے۔

حکمت عملی منطق

حکمت عملی پہلے اپنی مرضی کے مطابق فنکشن f_getOscilatorValues کو کال کرتی ہے تاکہ RSI ، اسٹاک ، MACD وغیرہ سمیت مختلف آسکیلیٹر اشارے کی اقدار حاصل کی جاسکیں۔ پھر یہ اسٹاپ نقصان کو ٹریک کرنے کے لئے f_getSupertrend کے ساتھ تاخیر سے سپر ٹرینڈ اقدار کا حساب لگاتا ہے۔

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

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

داخل ہونے کے بعد ، اسٹاپ نقصان کو اوپری / نچلے بینڈ کے پیچھے کیا جاتا ہے جو بھی قریب ہے۔ جب اسٹاپ نقصان کو متحرک کیا جاتا ہے تو ، پوزیشن بند کردی جاتی ہے۔ جب قیمت منافع کے ہدف تک پہنچ جاتی ہے تو ، جزوی منافع لیا جاتا ہے۔

فوائد کا تجزیہ

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

  1. رجحان کی سمت کی نشاندہی کرنے کے لئے اوسیلیٹرز کا استعمال کرتے ہوئے قلیل مدتی الٹ کے مواقع کو بروقت پکڑ سکتا ہے۔

  2. تاخیر سے سپر ٹرینڈ سٹاپ نقصان کا اطلاق نقصان میں اضافہ ہونے سے پہلے روک سکتا ہے، ایک ہی تجارت کے نقصان کو محدود کرتا ہے.

  3. متحرک اے ٹی آر پر مبنی سٹاپ نقصان اور منافع کا ہدف کا حساب لگانے سے پوزیشن سائزنگ کو ایڈجسٹ کرنے میں مدد ملتی ہے۔

  4. زیادہ وقت کے فریم کے ساتھ فلٹرنگ چلتی اوسط میں پھنس جانے سے بچتی ہے.

  5. جزوی منافع لینے سے منافع چلتا ہے جبکہ کچھ منافع کو مقفل کرتا ہے۔

  6. منطق کوانٹم ٹریڈنگ شروع کرنے والوں کے لیے سادہ اور سمجھنے میں آسان ہے۔

خطرے کا تجزیہ

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

  1. آسکیلیٹرز میں تاخیر کے مسائل ہوسکتے ہیں ، جس کی وجہ سے تاخیر سے داخل ہونے اور قبل از وقت باہر نکلنے کے سگنل پیدا ہوسکتے ہیں۔ پیرامیٹرز کو بہتر بنانے یا رجحان کی پیروی کرنے والے اشارے شامل کرکے اس میں بہتری لائی جاسکتی ہے۔

  2. تنگ سٹاپ نقصان مارا جا سکتا ہے۔ سٹاپ نقصان کی حد کو وسیع کیا جا سکتا ہے یا چانڈیلیئر جیسے متحرک اسٹاپ استعمال کیے جا سکتے ہیں۔

  3. جزوی منافع لینے کے بعد باقی پوزیشن کو روک دیا جاسکتا ہے۔ جزوی منافع کا تناسب کم کیا جاسکتا ہے۔

  4. بیک ٹیسٹ اوور فٹنس کا خطرہ۔ اسٹریٹجی کو مختلف مارکیٹوں میں درست کیا جانا چاہئے۔

  5. اعلی ٹائم فریم چلتی اوسط فلٹر کی ناکامی۔ رجحان کی درجہ بندی کے طریقوں کو ایک ساتھ استعمال کیا جانا چاہئے۔

بہتری کی ہدایات

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

  1. oscillator پیرامیٹرز کے مختلف مجموعے کی جانچ کریں اور ان لوگوں کو تلاش کریں جو معیار کے سگنل فراہم کرتے ہیں.

  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)

مزید