کثیر اشارے پر مبنی قلیل مدتی رجحان کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-10-25 15:31:30
ٹیگز:

img

جائزہ

اس حکمت عملی میں تین تکنیکی اشارے مختلف جہتوں میں شامل ہیں، بشمول سپورٹ / مزاحمت کی سطح، چلتی اوسط نظام، اور آسکیلیٹر اشارے، اعلی جیت کی شرح کے لئے قلیل مدتی رجحان کی سمت کا تعین کرنے کے لئے.

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

کوڈ سب سے پہلے قیمت کی معاونت / مزاحمت کی سطحوں کا حساب لگاتا ہے ، بشمول معیاری محور پوائنٹس اور فبونیکی ریٹریکشن کی سطح ، اور انہیں چارٹ پر پلاٹ کرتا ہے۔ ان اہم سطحوں کو توڑنے سے اہم رجحان سگنل ملتے ہیں۔

اس کے بعد یہ گولڈن کراس اور ڈیتھ کراس سگنلز کے لئے حجم وزن شدہ اوسط قیمت (VWAP) اور اوسط قیمت کا حساب لگاتا ہے۔ یہ درمیانی اور طویل مدتی رجحان کے فیصلے سے تعلق رکھتا ہے۔

آخر میں ، اس نے overbought اور oversold سگنلز کے لئے اسٹوکاسٹک RSI اوسیلیٹر کا حساب لگایا۔ یہ overbought/oversold اشارے سے تعلق رکھتا ہے۔

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

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

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

اس کے علاوہ، منافع لینے کا فنکشن منافع کا ایک خاص فیصد مقفل کرنے میں مدد کرتا ہے، خطرے کے انتظام میں مدد ملتی ہے.

خطرے کا تجزیہ

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

اس کے علاوہ، اشارے کی نامناسب پیرامیٹر ٹیوننگ غلط سگنل فیصلوں کی قیادت کر سکتی ہے جس میں اصلاح کے لئے تکرار بیک ٹسٹنگ کی ضرورت ہوتی ہے.

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

بہتری کے مواقع

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

  1. بہتر درستگی کے لئے رجحان کی طاقت کا اندازہ کرنے کے لئے حجم جیسے زیادہ اشارے سگنل شامل کریں.

  2. کثیر جہتی اشارے پر تربیت دینے کے لئے مشین لرننگ ماڈل شامل کریں اور خود بخود بہترین حکمت عملی دریافت کریں۔

  3. موافقت پذیر ٹیوننگ کے لئے مختلف مصنوعات کی بنیاد پر پیرامیٹرز کو بہتر بنائیں.

  4. سٹاپ نقصان اور پوزیشن سائزنگ کو متعارف کرانے کے لئے بہتر کنٹرول کے خطرات کے لئے ڈراؤنڈ پر مبنی.

  5. تنوع کے لئے کم وابستگی والے مصنوعات تلاش کرنے کے لئے پورٹ فولیو کی اصلاح کریں۔

نتیجہ

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


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// EmperorBTC's VWAP Indicator & Strategy
//              v2.1
// 
//      coded by Bogdan Vaida

// This indicator was created after EmperorBTC's conditions on Twitter. 
// Good timeframes for it: 30', 15', 5'
// To convert from strategy to study switch the commented lines in the beginning
// and at the end of the script and vice versa.

// What this indicator does is to check if:
// o Pivot Point was crossed
// o Stoch-RSI and VWAP were crossed in current or previous candle
// o Candle (or previous candle) close is in the trend direction
// If all these are true then it will go long or short based on direction.


// FUTURE IDEAS: 
//  - Volume Expansion
//  - Candle Stick patterns

//@version=4

// 🔥Uncomment the line below for the indicator and comment the strategy lines
// study(title="EmperorBTC's VWAP Indicator", shorttitle="EMP-VWAP", overlay=true)

// 🔥 Uncomment the line below for the strategy and comment the above line
strategy(title="EmperorBTC's VWAP Strategy", shorttitle="EMP-VWAP", overlay=true, pyramiding=1)

plotAveragePriceCrossedPivotPoint = input(false, title="Plot Close Price Crossing Pivot Points?", group="Pivot Points")
plotPivotPoints = input(false, title="Plot Pivot Points?", group="Pivot Points")
pivotPointsType = input(title="Pivot Points type", defval="Fibonacci", options=["Fibonacci", "Traditional"], group="Pivot Points")

pivotPointCircleWidth = input(2, title="Width of Pivot Point circles", minval=1, group="Pivot Points")

plotVWAP = input(true, title="Plot VWAP?", group="VWAP")
plotAvgPrice = input(true, title="Plot Average Price?", group="VWAP")
plotVWAPCrossPrice = input(false, title="Plot Price Crossing VWAP?", group="VWAP")
reso = input(title="Period", type=input.resolution, defval="D", group="VWAP")
cumulativePeriod = input(14, "VWAP Cumulative Period", group="VWAP")

plotStochRSICross = input(false, title="Plot StochRSI Cross?", group="StochRSI")
smoothK = input(3, "K", minval=1, group="StochRSI", inline="K&D")
smoothD = input(3, "D", minval=1, group="StochRSI", inline="K&D")
lengthRSI = input(14, "RSI Length", minval=1, group="Stochastic-RSI", inline="length")
lengthStoch = input(14, "Stochastic Length", minval=1, group="Stochastic-RSI", inline="length")
rsiSrc = input(close, title="RSI Source", group="Stochastic-RSI")

plotLong = input(true, title="Plot Long Opportunity?", group="Strategy only")
plotShort = input(true, title="Plot Short Opportunity?", group="Strategy only")
tradingDirection = input(title="Strategy trading Direction: ", defval="L&S", options=["L&S", "L", "S"], group="Strategy only")
takeProfit = input(1.0, title='Take Profit %', group="Strategy only") / 100
plotTP = input(true, title="Plot Take Profit?", group="Strategy only")
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31, group="Backtesting range", inline="Start Date")
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12, group="Backtesting range", inline="Start Date")
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100, group="Backtesting range", inline="Start Date")
endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31, group="Backtesting range", inline="End Date")
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12, group="Backtesting range", inline="End Date")
endYear = input(title="End Year", type=input.integer,
     defval=2050, minval=1800, maxval=2100, group="Backtesting range", inline="End Date")


// PivotPoint code (PVTvX by DGT has some nice code on PP)
candleHigh  = security(syminfo.tickerid,"D", high[1], lookahead=barmerge.lookahead_on)
candleLow   = security(syminfo.tickerid,"D", low[1], lookahead=barmerge.lookahead_on)
candleClose = security(syminfo.tickerid,"D", close[1], lookahead=barmerge.lookahead_on)

pivotPoint = (candleHigh+candleLow+candleClose) / 3

float resistance1 = na
float resistance2 = na
float resistance3 = na
float support1 = na
float support2 = na
float support3 = na

if pivotPointsType == "Fibonacci"
    resistance1 := pivotPoint + 0.382 * (candleHigh - candleLow)
    resistance2 := pivotPoint + 0.618 * (candleHigh - candleLow)
    resistance3 := pivotPoint + (candleHigh - candleLow)
    support1 := pivotPoint - 0.382 * (candleHigh - candleLow)
    support2 := pivotPoint - 0.618 * (candleHigh - candleLow)
    support3 := pivotPoint - (candleHigh - candleLow)
else if pivotPointsType == "Traditional"
    resistance1 := 2 * pivotPoint - candleLow
    resistance2 := pivotPoint + (candleHigh - candleLow)
    resistance3 := candleHigh + 2 * (pivotPoint - candleLow) 
    support1 := 2 * pivotPoint - candleHigh
    support2 := pivotPoint - (candleHigh - candleLow)
    support3 := candleLow - 2 * (candleHigh - pivotPoint)

plot(series = plotPivotPoints ? support1 : na, color=#ff0000, title="S1", style = plot.style_circles, linewidth = pivotPointCircleWidth)
plot(series = plotPivotPoints ? support2 : na, color=#800000, title="S2", style = plot.style_circles, linewidth = pivotPointCircleWidth)
plot(series = plotPivotPoints ? support3 : na, color=#330000, title="S3", style = plot.style_circles, linewidth = pivotPointCircleWidth)
plot(series = plotPivotPoints ? pivotPoint : na, color=#FFA500, title="PP", style = plot.style_circles, linewidth = pivotPointCircleWidth)
plot(series = plotPivotPoints ? resistance1 : na, color=#00FF00, title="R1", style = plot.style_circles, linewidth = pivotPointCircleWidth)
plot(series = plotPivotPoints ? resistance2 : na, color=#008000, title="R2", style = plot.style_circles, linewidth = pivotPointCircleWidth)
plot(series = plotPivotPoints ? resistance3 : na, color=#003300, title="R3", style = plot.style_circles, linewidth = pivotPointCircleWidth)

pivotPointCrossedUp = ((low < support3) and (close > support3)) or ((low < support2) and (close > support2)) or ((low < support1) and (close > support1)) or  ((low < pivotPoint) and (close > pivotPoint))
pivotPointCrossedDown = ((high > support3) and (close < support3)) or ((high > support2) and (close < support2)) or ((high > support1) and (close < support1)) or  ((high > pivotPoint) and (close < pivotPoint))
plotPPColor = pivotPointCrossedUp ? color.green :
     pivotPointCrossedDown ? color.red :
     na

plotshape(series = plotAveragePriceCrossedPivotPoint ? (pivotPointCrossedUp or pivotPointCrossedDown) : na, title="PP Cross", style = shape.triangleup, location=location.belowbar, color=plotPPColor, text="PP", size=size.small)

// VWAP (taken from the TV code)
// There are five steps in calculating VWAP:
//
// 1. Calculate the Typical Price for the period. [(High + Low + Close)/3)]
// 2. Multiply the Typical Price by the period Volume (Typical Price x Volume)
// 3. Create a Cumulative Total of Typical Price. Cumulative(Typical Price x Volume)
// 4. Create a Cumulative Total of Volume. Cumulative(Volume)
// 5. Divide the Cumulative Totals. 
//
// VWAP = Cumulative(Typical Price x Volume) / Cumulative(Volume)

// Emperor's Edition
t = time(reso)
debut = na(t[1]) or t > t[1]

addsource = ohlc4 * volume
addvol = volume
addsource := debut ? addsource : addsource + addsource[1]
addvol := debut ? addvol : addvol + addvol[1]
vwapValue = addsource / addvol

pVWAP = plot(series = plotVWAP ? vwapValue : na, color=color.purple, title="VWAP")
pAvgPrice = plot(series = plotAvgPrice ? ohlc4 : na, color=color.blue, title="PRICE")
fill(pVWAP, pAvgPrice, color = ohlc4 > vwapValue ? color.red : color.green, title="VWAP PRICE FILL")

vwapCrossUp = (low < vwapValue) and (vwapValue < high) and (close > open) // added green candle check
vwapCrossDown = (high > vwapValue) and (vwapValue > low) and (close < open) // added red candle check

plotVWAPColor = vwapCrossUp ? color.green :
     vwapCrossDown ? color.red :
     na
plotshape(series = plotVWAPCrossPrice ? (vwapCrossUp or vwapCrossDown) : na, title="VWAP Cross Price", style=shape.triangleup, location=location.belowbar, color=plotVWAPColor, text="VWAP", size=size.small)


// Stochastic RSI

rsi1 = rsi(rsiSrc, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

sRsiCrossUp = k[1] < d[1] and k > d
sRsiCrossDown = k[1] > d[1] and k < d

plotColor = sRsiCrossUp ? color.green :
     sRsiCrossDown ? color.red :
     na
plotshape(series = plotStochRSICross ? (sRsiCrossUp or sRsiCrossDown) : na, title="StochRSI Cross Up", style=shape.triangleup, location=location.belowbar, color=plotColor, text="StochRSI", size=size.small)

// Long Trades
sRsiCrossedUp = sRsiCrossUp or sRsiCrossUp[1]
vwapCrossedUp = vwapCrossUp or vwapCrossUp[1]
// longCond1 = (sRsiCross and vwapCross) or (sRsiCross[1] and vwapCross) or (sRsiCross and vwapCross[1])
longCond1 = (sRsiCrossedUp[1] and vwapCrossedUp[1])
longCond2 = pivotPointCrossedUp[1]
longCond3 = (close[1] > open[1]) and (close > open) // check this
longCond = longCond1 and longCond2 and longCond3
plotshape(series = plotLong ? longCond : na, title="Long", style=shape.triangleup, location=location.belowbar, color=color.green, text="Long", size=size.normal)

// Short Trades
sRsiCrossedDown = sRsiCrossDown or sRsiCrossDown[1]
vwapCrossedDown = vwapCrossDown or vwapCrossDown[1]
shortCond1 = (sRsiCrossedDown[1] and vwapCrossedDown[1])
shortCond2 = pivotPointCrossedDown[1]
shortCond3 = (close[1] < open[1]) and (close < open)
shortCond = shortCond1 and shortCond2 and shortCond3
plotshape(series = plotShort ? shortCond : na, title="Short", style=shape.triangledown, location=location.abovebar, color=color.red, text="Short", size=size.normal)

// alertcondition(condition=longCond, title="Long", message="Going long")
// alertcondition(condition=shortCond, title="Short", message="Going short")

// 🔥 Uncomment the lines below for the strategy and revert for the study
takeProfitLong     = strategy.position_avg_price * (1 + takeProfit)
takeProfitShort     = strategy.position_avg_price * (1 - takeProfit)
exitTp = ((strategy.position_size > 0) and (close > takeProfitLong)) or ((strategy.position_size < 0) and (close < takeProfitShort))
strategy.risk.allow_entry_in(tradingDirection == "L" ? strategy.direction.long : tradingDirection == "S" ? strategy.direction.short : strategy.direction.all)
plot(series = (plotTP and strategy.position_size > 0) ? takeProfitLong : na, title="TP Level",color=color.green, style=plot.style_linebr, linewidth=2)
plot(series = (plotTP and strategy.position_size < 0) ? takeProfitShort : na, title="TP Level",color=color.red, style=plot.style_linebr, linewidth=2)
inDateRange = (time >= timestamp(syminfo.timezone, startYear,
         startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
strategy.entry("VWAP", strategy.long, comment="Long", when=longCond and inDateRange)
strategy.entry("VWAP", strategy.short, comment="Short", when=shortCond and inDateRange)
strategy.close(id="VWAP", when=exitTp)
if (not inDateRange)
    strategy.close_all()

مزید