وسائل لوڈ ہو رہے ہیں... لوڈنگ...

کوانٹیٹیو اشارے پر مبنی بٹ کوائن ٹریڈنگ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-26 11:06:12
ٹیگز:

img

جائزہ

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

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

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

  2. آر ایس آئی اشارے کے ساتھ مل کر ایک موافقت پذیر اتار چڑھاؤ کی حد ٹریڈنگ سگنل پیدا کرنے کے لئے overbought اور oversold زون کا تعین کرتی ہے۔ ڈپلیکیٹ سگنل کی تصدیق کے لئے پیرامیٹرز کے دو سیٹ بھی مرتب کیے گئے ہیں۔

  3. حجم آسکیلیٹر غلط بریک آؤٹ سے بچنے کے لیے خرید و فروخت کی رفتار کا تعین کرتا ہے۔

  4. سٹاپ نقصان / منافع حاصل کرنے کے تناسب کو پہلے سے مقرر کریں تاکہ اسٹاپ نقصان کو پہلے سے مقرر کیا جاسکے اور خطرے کے انتظام کے لئے منافع کی سطح حاصل کی جاسکے۔

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

  1. ہل وکر تیزی سے رجحان کی تبدیلیوں کو پکڑ سکتا ہے، اور بولنگر بینڈ غلط سگنل کو کم کرنے میں مدد کرسکتے ہیں.

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

  3. حجم آسکیلیٹر رجحانات اور اشارے کے اشاروں کے ساتھ مل کر ناقص تجارت سے بچتا ہے۔

  4. پہلے سے مقرر سٹاپ نقصان اور منافع لینے کے طریقوں کو خود کار طریقے سے واحد منافع اور نقصان کو کنٹرول اور مؤثر طریقے سے مجموعی طور پر خطرے کو منظم کر سکتے ہیں.

خطرے کا تجزیہ

  1. پیرامیٹر کی غلط ترتیبات کا نتیجہ بہت زیادہ تجارتی تعدد یا سگنل کی کارکردگی میں خرابی کا باعث بن سکتا ہے۔

  2. اچانک مارکیٹ کے واقعات کی وجہ سے قیمتوں میں شدید اتار چڑھاؤ ہوسکتا ہے ، جس کے نتیجے میں اسٹاپ نقصان اور بڑے نقصانات کو متحرک کیا جاسکتا ہے۔

  3. جب تجارت کی قسم کو دوسرے سککوں میں تبدیل کیا جاتا ہے تو ، پیرامیٹرز کو دوبارہ جانچنے اور بہتر بنانے کی ضرورت ہوتی ہے۔

  4. اگر حجم کے اعداد و شمار غائب ہیں، حجم Oscillator ناکام ہو جائے گا.

اصلاح کی ہدایات

  1. زیادہ سے زیادہ RSI پیرامیٹر کے مجموعے کو ٹیسٹ کریں تاکہ زیادہ سے زیادہ پیرامیٹرز کو تلاش کیا جا سکے.

  2. سگنل کی درستگی کو بہتر بنانے کے لئے آر ایس آئی کو دیگر اشارے جیسے ایم اے سی ڈی اور کے ڈی کے ساتھ جوڑنے کی کوشش کریں۔

  3. ماڈل پیشن گوئی ماڈیول شامل کریں اور مارکیٹ کی سمت کا فیصلہ کرنے کے لئے مشین لرننگ کا استعمال کریں.

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

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

خلاصہ

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


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


// © maxencetajet

//@version=5
strategy("Strategy Crypto", overlay=true, initial_capital=1000, default_qty_type=strategy.fixed, default_qty_value=0.5, slippage=25)

src1 = input.source(close, title="Source")
target_stop_ratio = input.float(title='Risk/Reward', defval=1.5, minval=0.5, maxval=100)

startDate = input.int(title='Start Date', defval=1, minval=1, maxval=31, group="beginning Backtest")
startMonth = input.int(title='Start Month', defval=5, minval=1, maxval=12, group="beginning Backtest")
startYear = input.int(title='Start Year', defval=2022, minval=2000, maxval=2100, group="beginning Backtest")

inDateRange = time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)

swingHighV = input.int(7, title="Swing High", group="number of past candles")
swingLowV = input.int(7, title="Swing Low", group="number of past candles")

//Hull Suite

modeSwitch = input.string("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"], group="Hull Suite")
length = input(60, title="Length", group="Hull Suite")
lengthMult = input(3, title="Length multiplier", group="Hull Suite")

HMA(_src1, _length) =>
    ta.wma(2 * ta.wma(_src1, _length / 2) - ta.wma(_src1, _length), math.round(math.sqrt(_length)))

EHMA(_src1, _length) =>
    ta.ema(2 * ta.ema(_src1, _length / 2) - ta.ema(_src1, _length), math.round(math.sqrt(_length)))

THMA(_src1, _length) =>
    ta.wma(ta.wma(_src1, _length / 3) * 3 - ta.wma(_src1, _length / 2) - ta.wma(_src1, _length), _length)

Mode(modeSwitch, src1, len) =>
    modeSwitch == 'Hma' ? HMA(src1, len) : modeSwitch == 'Ehma' ? EHMA(src1, len) : modeSwitch == 'Thma' ? THMA(src1, len / 2) : na

_hull = Mode(modeSwitch, src1, int(length * lengthMult))
HULL = _hull
MHULL = HULL[0]
SHULL = HULL[2]

hullColor = HULL > HULL[2] ? #00ff00 : #ff0000

Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=1, transp=50)
Fi2 = plot(SHULL, title='SHULL', color=hullColor, linewidth=1, transp=50)
fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=40)

//QQE MOD

RSI_Period = input(6, title='RSI Length', group="QQE MOD")
SF = input(5, title='RSI Smoothing', group="QQE MOD")
QQE = input(3, title='Fast QQE Factor', group="QQE MOD")
ThreshHold = input(3, title='Thresh-hold', group="QQE MOD")

src = input(close, title='RSI Source', group="QQE MOD")

Wilders_Period = RSI_Period * 2 - 1

Rsi = ta.rsi(src, RSI_Period)
RsiMa = ta.ema(Rsi, SF)
AtrRsi = math.abs(RsiMa[1] - RsiMa)
MaAtrRsi = ta.ema(AtrRsi, Wilders_Period)
dar = ta.ema(MaAtrRsi, Wilders_Period) * QQE

longband = 0.0
shortband = 0.0
trend = 0

DeltaFastAtrRsi = dar
RSIndex = RsiMa
newshortband = RSIndex + DeltaFastAtrRsi
newlongband = RSIndex - DeltaFastAtrRsi
longband := RSIndex[1] > longband[1] and RSIndex > longband[1] ? math.max(longband[1], newlongband) : newlongband
shortband := RSIndex[1] < shortband[1] and RSIndex < shortband[1] ? math.min(shortband[1], newshortband) : newshortband
cross_1 = ta.cross(longband[1], RSIndex)
trend := ta.cross(RSIndex, shortband[1]) ? 1 : cross_1 ? -1 : nz(trend[1], 1)
FastAtrRsiTL = trend == 1 ? longband : shortband

length1 = input.int(50, minval=1, title='Bollinger Length', group="QQE MOD")
mult = input.float(0.35, minval=0.001, maxval=5, step=0.1, title='BB Multiplier', group="QQE MOD")
basis = ta.sma(FastAtrRsiTL - 50, length1)
dev = mult * ta.stdev(FastAtrRsiTL - 50, length1)
upper = basis + dev
lower = basis - dev
color_bar = RsiMa - 50 > upper ? #00c3ff : RsiMa - 50 < lower ? #ff0062 : color.gray

QQEzlong = 0
QQEzlong := nz(QQEzlong[1])
QQEzshort = 0
QQEzshort := nz(QQEzshort[1])
QQEzlong := RSIndex >= 50 ? QQEzlong + 1 : 0
QQEzshort := RSIndex < 50 ? QQEzshort + 1 : 0

RSI_Period2 = input(6, title='RSI Length', group="QQE MOD")
SF2 = input(5, title='RSI Smoothing', group="QQE MOD")
QQE2 = input(1.61, title='Fast QQE2 Factor', group="QQE MOD")
ThreshHold2 = input(3, title='Thresh-hold', group="QQE MOD")

src2 = input(close, title='RSI Source', group="QQE MOD")

Wilders_Period2 = RSI_Period2 * 2 - 1

Rsi2 = ta.rsi(src2, RSI_Period2)
RsiMa2 = ta.ema(Rsi2, SF2)
AtrRsi2 = math.abs(RsiMa2[1] - RsiMa2)
MaAtrRsi2 = ta.ema(AtrRsi2, Wilders_Period2)
dar2 = ta.ema(MaAtrRsi2, Wilders_Period2) * QQE2
longband2 = 0.0
shortband2 = 0.0
trend2 = 0

DeltaFastAtrRsi2 = dar2
RSIndex2 = RsiMa2
newshortband2 = RSIndex2 + DeltaFastAtrRsi2
newlongband2 = RSIndex2 - DeltaFastAtrRsi2
longband2 := RSIndex2[1] > longband2[1] and RSIndex2 > longband2[1] ? math.max(longband2[1], newlongband2) : newlongband2
shortband2 := RSIndex2[1] < shortband2[1] and RSIndex2 < shortband2[1] ? math.min(shortband2[1], newshortband2) : newshortband2
cross_2 = ta.cross(longband2[1], RSIndex2)
trend2 := ta.cross(RSIndex2, shortband2[1]) ? 1 : cross_2 ? -1 : nz(trend2[1], 1)
FastAtrRsi2TL = trend2 == 1 ? longband2 : shortband2

QQE2zlong = 0
QQE2zlong := nz(QQE2zlong[1])
QQE2zshort = 0
QQE2zshort := nz(QQE2zshort[1])
QQE2zlong := RSIndex2 >= 50 ? QQE2zlong + 1 : 0
QQE2zshort := RSIndex2 < 50 ? QQE2zshort + 1 : 0

hcolor2 = RsiMa2 - 50 > ThreshHold2 ? color.silver : RsiMa2 - 50 < 0 - ThreshHold2 ? color.silver : na

Greenbar1 = RsiMa2 - 50 > ThreshHold2
Greenbar2 = RsiMa - 50 > upper

Redbar1 = RsiMa2 - 50 < 0 - ThreshHold2
Redbar2 = RsiMa - 50 < lower

//Volume Oscillator

var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")
shortlen = input.int(5, minval=1, title = "Short Length", group="Volume Oscillator")
longlen = input.int(10, minval=1, title = "Long Length", group="Volume Oscillator")
short = ta.ema(volume, shortlen)
long = ta.ema(volume, longlen)
osc = 100 * (short - long) / long

//strategy

enterLong   =  '    {  "message_type": "bot",  "bot_id": 4635591,  "email_token": "25byourtefcodeuufyd2-43314-ab98-bjorg224",  "delay_seconds": 1}  ' //start long deal
 
ExitLong    =  '    {  "message_type": "bot",  "bot_id": 4635591,  "email_token": "25byourtefcodeuufyd2-43314-ab98-bjorg224",  "delay_seconds": 0,  "action": "close_at_market_price"}  ' // close long deal market 
 
enterShort  =  '    {  "message_type": "bot",  "bot_id": 4635690,  "email_token": "25byourtefcodeuufyd2-43314-ab98-bjorg224",  "delay_seconds": 1}  ' // start short deal
 
ExitShort   =  '    {  "message_type": "bot",  "bot_id": 4635690,  "email_token": "25byourtefcodeuufyd2-43314-ab98-bjorg224",  "delay_seconds": 0,  "action": "close_at_market_price"}  ' // close short deal market

longcondition = close > MHULL and HULL > HULL[2] and osc > 0 and Greenbar1 and Greenbar2 and not Greenbar1[1] and not Greenbar2[1]
shortcondition = close < SHULL and HULL < HULL[2] and osc > 0 and Redbar1 and Redbar2 and not Redbar1[1] and not Redbar2[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

risk_long := risk_long[1]
risk_short := risk_short[1]

swingHigh = ta.highest(high, swingHighV)
swingLow = ta.lowest(low, swingLowV)

if strategy.position_size == 0 and longcondition and inDateRange
    risk_long := (close - swingLow) / close
    strategy.entry("long", strategy.long, comment="Buy", alert_message=enterLong)
    
if strategy.position_size == 0 and shortcondition and inDateRange
    risk_short := (swingHigh - close) / close       
    strategy.entry("short", strategy.short, comment="Sell", alert_message=enterShort)
    
if strategy.position_size > 0

    stopLoss := strategy.position_avg_price * (1 - risk_long)
    takeProfit := strategy.position_avg_price * (1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("long exit", "long", stop = stopLoss, limit = takeProfit, alert_message=ExitLong)
    
if strategy.position_size < 0

    stopLoss := strategy.position_avg_price * (1 + risk_short)
    takeProfit := strategy.position_avg_price * (1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("short exit", "short", stop = stopLoss, limit = takeProfit, alert_message=ExitShort)

p_ep = plot(entry_price, color=color.new(color.white, 0), linewidth=2, style=plot.style_linebr, title='entry price')
p_sl = plot(stopLoss, color=color.new(color.red, 0), linewidth=2, style=plot.style_linebr, title='stopLoss')
p_tp = plot(takeProfit, color=color.new(color.green, 0), linewidth=2, style=plot.style_linebr, title='takeProfit')
fill(p_sl, p_ep, color.new(color.red, transp=85))
fill(p_tp, p_ep, color.new(color.green, transp=85))


مزید