
اس مضمون میں ایک الگورتھم ٹریڈنگ حکمت عملی کا تعارف کیا گیا ہے جس میں منافع کے مواقع کی نشاندہی کرنے اور قیمتوں کو منتقل کرنے والی اوسط کے ساتھ کراس کرنے کے لئے داخلے کے اشارے کے طور پر استعمال کیا جاتا ہے۔ اس حکمت عملی میں قیمتوں کے تکنیکی تجزیہ اور رجحانات کی پیروی کرنے کے طریقوں کو یکجا کیا گیا ہے جس کا مقصد منافع کو جمع کرنا اور رجحانات کو تبدیل کرنا ہے۔
اس حکمت عملی کا بنیادی منطق دو غیر متعلقہ اشارے کے امتزاج پر مبنی ہے:
نگلنے کی شکل: دو K لائنوں کا ایک الٹ ماڈل ، جس میں دوسری K لائن کی ہستی نے پہلی K لائن کی ہستی کو مکمل طور پر نگل لیا ، اس کا استعمال الٹ کے مواقع کی نشاندہی کرنے کے لئے کیا جاتا ہے۔
قیمت اور چلتی اوسط کی کراسنگ: جب قیمت چلتی اوسط کے نیچے سے اوپر کی طرف سے کراسنگ حرکت پذیری اوسط کو توڑتی ہے تو ، خریدنے کا اشارہ پیدا ہوتا ہے۔ جب قیمت چلتی اوسط کے اوپر سے نیچے کی طرف سے کراسنگ حرکت پذیری اوسط کو توڑتی ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔
جب مارکیٹ میں ممکنہ تبدیلی کا اندازہ لگانے کے لئے پیٹرن کا استعمال کیا جاتا ہے تو ، قیمتوں کے ساتھ چلنے والی اوسط کی کراسنگ کو فلٹر سگنل کے طور پر استعمال کیا جاتا ہے جس میں تبدیلی کا تعین کیا جاتا ہے ، اس سے منافع کمانے کے امکانات میں اضافہ ہوتا ہے۔
خاص طور پر ، اس حکمت عملی میں تین قسم کے نگلنے کی شکلوں کا سراغ لگایا جاتا ہے: کثیر سر نگلنا ، خالی سر نگلنا ، اور بغیر کسی شیڈول کے نگلنا۔ اس کے بعد ، اسٹیلنگ اور الٹ جانے کے امکانات کا اندازہ لگایا جاتا ہے۔ پھر قیمتوں کے ساتھ چلتی اوسط کے گولڈ فورک اور ڈیڈ فورک سگنل کو فلٹر کرنے کے بعد ، آخر کار پوزیشن کھولنے کا فیصلہ کیا جاتا ہے۔
اس حکمت عملی کا سب سے بڑا فائدہ یہ ہے کہ غیر متعلقہ اشارے کے امتزاج کا استعمال فیصلہ سازی کی تاثیر کو بڑھانے کے لئے کیا جاتا ہے۔ پیٹرن کو نگلنے سے مارکیٹ میں ردوبدل کے وقت اور امکان کا اندازہ لگایا جاتا ہے۔ اور قیمتوں اور منتقل اوسطوں کے ساتھ کراس ردوبدل کی سمت اور طاقت کی توثیق کی جاتی ہے۔ دونوں ایک دوسرے کی توثیق کرتے ہیں ، جس سے غلط سگنل کی وجہ سے ہونے والے تجارتی نقصان کو مؤثر طریقے سے کم کیا جاسکتا ہے۔
ایک اور فائدہ یہ ہے کہ پیرامیٹرز کی ترتیب میں لچکدار ہے۔ صارف اپنی حکمت عملی کو بہتر بنانے کے لئے خود ہی پیرامیٹرز ترتیب دے سکتا ہے جیسے کہ منتقل اوسط کی مدت ، اسٹاپ نقصان کی حد وغیرہ۔
اگرچہ متعدد اشارے استعمال کرنے سے فیصلہ سازی میں بہتری آتی ہے ، اس حکمت عملی میں غلط سگنل کا خطرہ موجود ہے۔ گھونٹنے والی شکل 100 فیصد قابل اعتماد الٹ سگنل نہیں ہے ، اور قیمتوں اور چلتی اوسط کے ساتھ کراسنگ کی بھی ناکامی ہوسکتی ہے۔ یہ سب کچھ آگے کی پوزیشن کھونے کا سبب بن سکتا ہے۔
اس کے علاوہ ، زیادہ تر تکنیکی تجزیہ کی حکمت عملیوں کی طرح ، یہ حکمت عملی بھی مارکیٹ میں اثر انداز نہیں ہوتی ہے جو قیمتوں میں اتار چڑھاؤ جیسے تصادم کی صورت حال کو ختم کرتی ہے۔ مسلسل اتار چڑھاؤ سے اسٹاپ نقصان ہوسکتا ہے یا منافع کی گنجائش کو کم کیا جاسکتا ہے۔
خطرے پر قابو پانے کے لئے ، موزوں طور پر چلتی اوسط پیرامیٹرز کو ایڈجسٹ کیا جاسکتا ہے ، تاکہ نقصان کی روک تھام کو بہتر بنایا جاسکے۔ رجحانات اور زلزلے کی شناخت کے دیگر اشارے کے ساتھ مل کر ، متحرک ایڈجسٹمنٹ حکمت عملی میں شرکت کی سطح پر بھی غور کیا جاسکتا ہے۔
اس حکمت عملی کو مندرجہ ذیل طریقوں سے بہتر بنایا جاسکتا ہے:
زیادہ اقسام کی حرکت پذیری اوسط کی جانچ کرنا ، بہترین پیرامیٹرز کا مجموعہ تلاش کرنا۔ جیسے وزنی حرکت پذیری اوسط ، حرکت پذیری اوسط کا تسلسل ہموار کرنا وغیرہ۔
رجحانات کی پیمائش کرنے والے اشارے کو بڑھانا ، اتار چڑھاؤ کی صورتحال سے بچنے کے لئے۔ مثال کے طور پر ، ADX ، برن بینڈ وغیرہ۔
نقصان کو روکنے کے طریقوں کو بہتر بنانے کے لئے ، نقصان کو روکنے کے اثر کو بہتر بنائیں۔
مشین لرننگ کے طریقوں کو K لائن کی شکل کا تعین کرنے میں اضافہ کریں اور نگلنے کی شناخت کی درستگی کو بہتر بنائیں۔
خود کار طریقے سے پیرامیٹرز کو بہتر بنانے کے لئے شامل کریں، پیرامیٹرز کو خود کو اپنانے کے لئے.
اس حکمت عملی میں قیمت اور حرکت پذیری اوسط کے ساتھ کراس کی توثیق کی گئی ہے۔ یہ ایک تکنیکی تجزیہ کی حکمت عملی ہے۔ اس کی خوبی یہ ہے کہ اشارے ایک دوسرے کے ساتھ ملتے ہیں ، پیرامیٹرز لچکدار ہیں۔ اس کی خرابی یہ ہے کہ اب بھی جھوٹے سگنل کا خطرہ ہے ، اور یہ ہنگامہ خیز حالات کے لئے کمزور ہے۔ اس حکمت عملی کی تاثیر کو مزید بڑھایا جاسکتا ہے جس میں حرکت پذیری اوسط پیرامیٹرز ، اسٹاپ نقصانات ، رجحانات کے فیصلے شامل کرنے جیسے طریقوں کو بہتر بنایا جاسکتا ہے۔
/*backtest
start: 2023-12-30 00:00:00
end: 2024-01-29 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//@author=Daveatt
StrategyName = "BEST Engulfing + MA"
ShortStrategyName = "BEST Engulfing + MA"
strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true)
includeEngulfing = true
includeMA = true
source_ma = input(title="Source Price vs MA", type=input.source, defval=close)
typeofMA = input(title="Type of MA", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "KMA", "TMA", "HullMA", "DEMA", "TEMA"])
length_ma = input(32, title = "MA Length", type=input.integer)
// ---------- Candle components and states
GreenCandle = close > open
RedCandle = close < open
NoBody = close==open
Body = abs(close-open)
// bullish conditions
isBullishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
isBullishEngulfing2 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) <= min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
// bearish conditions
isBearishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
isBearishEngulfing2 = max(close[1],open[1]) >= max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
// consolidation of conditions
isBullishEngulfing = isBullishEngulfing1 or isBullishEngulfing2
isBearishEngulfing = isBearishEngulfing1 or isBearishEngulfing2
//isBullishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
//isBearishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
Engulf_curr = 0 - barssince(isBearishEngulfing) + barssince(isBullishEngulfing)
Engulf_Buy = Engulf_curr < 0 ? 1 : 0
Engulf_Sell = Engulf_curr > 0 ? 1 : 0
// Price vs MM
smma(src, len) =>
smma = 0.0
smma := na(smma[1]) ? sma(src, len) : (smma[1] * (len - 1) + src) / len
smma
ma(smoothing, src, length) =>
if smoothing == "RMA"
rma(src, length)
else
if smoothing == "SMA"
sma(src, length)
else
if smoothing == "EMA"
ema(src, length)
else
if smoothing == "WMA"
wma(src, length)
else
if smoothing == "VWMA"
vwma(src, length)
else
if smoothing == "SMMA"
smma(src, length)
else
if smoothing == "HullMA"
wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
else
if smoothing == "LSMA"
src
else
if smoothing == "KMA"
xPrice = src
xvnoise = abs(xPrice - xPrice[1])
nfastend = 0.666
nslowend = 0.0645
nsignal = abs(xPrice - xPrice[length])
nnoise = sum(xvnoise, length)
nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2)
nAMA = 0.0
nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1]))
nAMA
else
if smoothing == "TMA"
sma(sma(close, length), length)
else
if smoothing == "DEMA"
2 * src - ema(src, length)
else
if smoothing == "TEMA"
3 * (src - ema(src, length)) + ema(ema(src, length), length)
else
src
MA = ma(typeofMA, source_ma, length_ma)
plot(MA, color=#006400FF, title="MA breakout", linewidth=3)
macrossover = crossover (source_ma, MA)
macrossunder = crossunder(source_ma, MA)
since_ma_buy = barssince(macrossover)
since_ma_sell = barssince(macrossunder)
macross_curr = 0 - since_ma_sell + since_ma_buy
bullish_MA_cond = macross_curr < 0 ? 1 : 0
bearish_MA_cond = macross_curr > 0 ? 1 : 0
posUp = (Engulf_Buy ? 1 : 0) + (bullish_MA_cond ? 1 : 0)
posDn = (Engulf_Sell ? 1 : 0) + (bearish_MA_cond ? 1 : 0)
conditionUP = posUp == 2 and posUp[1] < 2
conditionDN = posDn == 2 and posDn[1] < 2
sinceUP = barssince(conditionUP)
sinceDN = barssince(conditionDN)
// primary-first signal of the trend
nUP = crossunder(sinceUP,sinceDN)
nDN = crossover(sinceUP,sinceDN)
// and the following secondary signals
// save of the primary signal
sinceNUP = barssince(nUP)
sinceNDN = barssince(nDN)
buy_trend = sinceNDN > sinceNUP
sell_trend = sinceNDN < sinceNUP
// engulfing by
barcolor(nUP ? color.orange : na, title="Bullish condition")
barcolor(nDN ? color.yellow : na, title="Bearish condition")
isLong = nUP
isShort = nDN
long_entry_price = valuewhen(nUP, close, 0)
short_entry_price = valuewhen(nDN, close, 0)
longClose = close[1] < MA
shortClose = close[1] > MA
///////////////////////////////////////////////
//* Backtesting Period Selector | Component *//
///////////////////////////////////////////////
StartYear = input(2017, "Backtest Start Year",minval=1980)
StartMonth = input(1, "Backtest Start Month",minval=1,maxval=12)
StartDay = input(1, "Backtest Start Day",minval=1,maxval=31)
testPeriodStart = timestamp(StartYear,StartMonth,StartDay,0,0)
StopYear = input(2020, "Backtest Stop Year",minval=1980)
StopMonth = input(12, "Backtest Stop Month",minval=1,maxval=12)
StopDay = input(31, "Backtest Stop Day",minval=1,maxval=31)
testPeriodStop = timestamp(StopYear,StopMonth,StopDay,0,0)
testPeriod() => true
//////////////////////////
//* Profit Component *//
//////////////////////////
input_tp_pips = input(600, "Backtest Profit Goal (in USD)",minval=0)
input_sl_pips = input(300, "Backtest STOP Goal (in USD)",minval=0)
tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips
sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips
long_TP_exit = buy_trend and high >= tp
short_TP_exit = sell_trend and low <= tp
plot(tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue)
plot(sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red)
if testPeriod()
strategy.entry("Long", 1, when=isLong)
strategy.close("Long", when=longClose )
strategy.exit("XL","Long", limit=tp, when=buy_trend, stop=sl)
if testPeriod()
strategy.entry("Short", 0, when=isShort)
strategy.close("Short", when=shortClose )
strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)