اس حکمت عملی کا نام RSI_OTT-TP/SL ہے۔ یہ حکمت عملی آر ایس آئی اشارے اور او ٹی ٹی لہر کے ذریعہ ٹریڈنگ سگنل کے فیصلے کو جوڑتی ہے ، یہ رجحان سے باخبر رہنے کی حکمت عملی ہے۔ حکمت عملی آر ایس آئی اشارے کے ذریعہ مارکیٹ کے رجحان کی سمت کا تعین کرتی ہے ، اور او ٹی ٹی لہر کے ذریعہ مخصوص داخلے کے مقامات کی نشاندہی کرتی ہے۔ حکمت عملی صارف کو اسٹاپ نقصان کا تناسب ترتیب دینے کی بھی اجازت دیتی ہے ، جو منافع کو لاک کرنے یا نقصان سے بچنے کے لئے خود بخود اسٹاپ نقصان کو روک سکتی ہے۔
اس حکمت عملی میں رجحانات اور انٹری پوائنٹس کا اندازہ لگانے کے لئے RSI اور OTT دونوں اشارے استعمال کیے گئے ہیں۔
آر ایس آئی کا استعمال مجموعی رجحان کی سمت کا تعین کرنے کے لئے کیا جاتا ہے۔ آر ایس آئی اشارے سے ظاہر ہوتا ہے کہ مارکیٹ زیادہ خرید یا زیادہ فروخت ہے ، آر ایس آئی کے اوپر سے گزرنے والا اوور سیل علاقہ اوور خرید سگنل ہے ، اور نیچے سے گزرنے والا اوور سیل علاقہ اوور سیل علاقہ ہے۔ اس حکمت عملی میں ڈیفالٹ آر ایس آئی کی لمبائی 6 ہے ، اوور خرید لائن 50 ہے ، اور اوور سیل علاقہ 50 ہے۔
او ٹی ٹی لہر کا استعمال انٹری پوائنٹس کی تلاش کے لئے کیا جاتا ہے۔ یہ ایک لہر کی لہر ہے جو اتار چڑھاؤ کے اشارے وی اے آر کی بنیاد پر تشکیل دی گئی ہے۔ جب قیمت نیچے سے او ٹی ٹی نیچے کی ٹریک کو توڑتی ہے تو اس کے لئے زیادہ سگنل لگائیں۔ جب قیمت اوپر سے نیچے سے او ٹی ٹی اوور ٹریک کو توڑتی ہے تو اس کے لئے خالی سگنل لگائیں۔
رجحانات کا تعین کرنے اور داخلہ پوائنٹس کی تصدیق کرنے کے بعد ، یہ حکمت عملی او ٹی ٹی بینڈ کو توڑنے کے بعد زیادہ یا کم پوزیشنیں کھولتی ہے۔
اسٹاپ اسٹاپ نقصان میں ایک ان پٹ باکس ہوتا ہے جس کو صارف خود ترتیب دے سکتا ہے۔ جب اسٹاپ یا اسٹاپ نقصان کی قیمت ٹرگر ہوتی ہے تو حکمت عملی خود بخود خالی ہوجاتی ہے۔
اس حکمت عملی میں صرف زیادہ ، صرف خالی یا دو طرفہ تجارت کی بھی اجازت ہے۔
آر ایس آئی اور او ٹی ٹی بینڈ کے ساتھ مل کر ، رجحانات کا درست اندازہ لگانے کی شرط پر اعلی امکانات کے داخلے کے مقامات تلاش کیے جاسکتے ہیں۔
او ٹی ٹی بینڈ متحرک اشارے کا استعمال کرتا ہے ، جس میں قیمت کے اتار چڑھاؤ کے لئے بہت زیادہ حساسیت ہے ، جس سے ٹرن آؤٹ پوائنٹس کو پہلے سے ہی پتہ چل سکتا ہے۔
اسٹریٹجی اسٹاپ اسٹاپ نقصان کی خصوصیت پیش کرتی ہے ، جس سے منافع کو لاک کیا جاسکتا ہے ، یا نقصان میں توسیع سے پہلے نقصان کو روک سکتا ہے ، جو خطرے پر قابو پانے میں مددگار ہے۔
کوڈ کی ساخت واضح ہے، مکمل طور پر تشریح کی گئی ہے، اور اسے سمجھنے اور ترمیم کرنے میں آسانی ہے۔
حکمت عملی کے پیرامیٹرز کو انٹرفیس کے ذریعے مختلف مارکیٹ کے حالات کے مطابق لچکدار طریقے سے ایڈجسٹ کیا جاسکتا ہے۔
RSI اشارے میں تاخیر کا مسئلہ ہے ، اور اس سے رجحان کی تبدیلی سے محروم ہوسکتا ہے ، جس سے غیر ضروری نقصانات کا سبب بنتا ہے۔
او ٹی ٹی بینڈ میں بھی غلط سگنل پیدا ہوسکتے ہیں ، جس کی تصدیق کے لائن فارمیٹ کے ساتھ کرنے کی سفارش کی جاتی ہے۔
اسٹاپ نقصان کی غلط ترتیب حکمت عملی کی کارکردگی کو بھی متاثر کرتی ہے ، جس میں مختلف اقسام کے لئے پیرامیٹرز کو ایڈجسٹ کرنے کی ضرورت ہوتی ہے۔
حکمت عملی صرف ایک پرجاتیوں کی بازیافت پر مبنی ہے ، جس میں مختلف پرجاتیوں کے پیرامیٹرز کو الگ سے بہتر بنانے کی ضرورت ہے۔
پیمائش کے لئے وقت کی کھڑکی مختصر ہے اور اس حکمت عملی کی تاثیر کی مکمل تصدیق ممکن نہیں ہے۔ پیمائش کے دورانیے کو بڑھانے کی سفارش کی گئی ہے۔
دوسرے اشارے ، جیسے MACD ، KD ، وغیرہ کو شامل کرنے کے لئے فلٹرنگ پر غور کیا جاسکتا ہے ، تاکہ داخلے میں غلط اطلاعات کو کم کیا جاسکے۔
اسٹاپ نقصان کی شدت کو متحرک طور پر اتار چڑھاؤ پر مبنی طریقہ کار کے ذریعہ ایڈجسٹ کیا جاسکتا ہے۔
مختلف اقسام کے پیرامیٹرز کو بہتر بنانے اور پیرامیٹرز کے انتخاب کے معیار کو تیار کرنے کے لئے مطالعہ کیا جاسکتا ہے۔
متحرک طور پر حکمت عملی کے پیرامیٹرز کو بہتر بنانے کے لئے مشین لرننگ کے طریقوں کو آزمائیں۔
قیمتوں کی تصدیق میں شامل کیا جاسکتا ہے ، تاکہ جھوٹی توڑ سے بچا جاسکے۔
اس کے بجائے ایک سادہ تناسب سٹاپ کے طور پر ایک سٹاپ کے طور پر MA پار کرنے کے لئے غور کیا جا سکتا ہے.
یہ حکمت عملی مجموعی طور پر ایک عام رجحان کی پیروی کرنے والی حکمت عملی ہے۔ یہ پہلے آر ایس آئی کے ذریعہ رجحان کی سمت کا تعین کرتی ہے ، پھر او ٹی ٹی بینڈ کی مدد سے مخصوص اندراج کے وقت کا تعین کرتی ہے ، اور آخر میں منافع کو روکنے اور خطرے کو کنٹرول کرنے کے لئے اسٹاپ نقصانات کا تعین کرتی ہے۔ اس حکمت عملی کی خوبی یہ ہے کہ اشارے کا مجموعہ آسان اور موثر ہے ، اور اس کی پیمائش کی کارکردگی بھی بہتر ہے۔ لیکن کچھ مسائل بھی موجود ہیں۔ جیسے کہ آر ایس آئی کی تاخیر ، بینڈ کی غلط اطلاع ، وغیرہ۔ اس کے لئے ہمیں پیرامیٹرز کو احتیاط سے بہتر بنانے کی ضرورت ہے جب ہم اسے ریئل اسٹیٹ پر لاگو کرتے ہیں ، اور دیگر تکنیکی اشارے کو بھی شامل کیا جاسکتا ہے۔ اس طرح حکمت عملی کی استحکام میں اضافہ ہوتا ہے۔ اگر اس کو مستقل طور پر بہتر اور جانچ پڑتال کی جاسکتی ہے تو ، یہ حکمت عملی ایک بہت ہی عملی رجحان کی پیروی کرنے والی حکمت عملی کا نمونہ بن سکتی ہے۔
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 2h
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/
// © BigCoinHunter
//@version=5
strategy(title="RSI_OTT-TP/SL", overlay=true,
pyramiding=0, default_qty_type=strategy.percent_of_equity,
default_qty_value=100, initial_capital=1000,
currency=currency.USD, commission_value=0.05,
commission_type=strategy.commission.percent,
process_orders_on_close=true)
//----------- get the user inputs --------------
//---------- RSI -------------
price = input(close, title="Source")
RSIlength = input.int(defval=6,title="RSI Length")
RSIoverSold = input.int(defval=50, title="RSI OverSold", minval=1)
RSIoverBought = input.int(defval=50, title="RSI OverBought", minval=1)
//------- OTT Bands ----------------
src = close
length=input.int(defval=1, title="OTT Period", minval=1)
percent=input.float(defval=5, title="OTT Percent", step=0.1, minval=0.001)
mav = input.string(title="OTT MA Type", defval="VAR", options=["SMA", "EMA", "WMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF"])
ottUpperPercent = input.float(title="OTT Upper Line Coeff", defval=0.01, minval = 0.001, step=0.001)
ottLowerPercent = input.float(title="OTT Lower Line Coeff", defval=0.01, minval = 0.001, step=0.001)
Var_Func(src,length)=>
valpha=2/(length+1)
vud1=src>src[1] ? src-src[1] : 0
vdd1=src<src[1] ? src[1]-src : 0
vUD=math.sum(vud1,9)
vDD=math.sum(vdd1,9)
vCMO=nz((vUD-vDD)/(vUD+vDD))
VAR=0.0
VAR:=nz(valpha*math.abs(vCMO)*src)+(1-valpha*math.abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
Wwma_Func(src,length)=>
wwalpha = 1/ length
WWMA = 0.0
WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
zxLag = length/2==math.round(length/2) ? length/2 : (length - 1) / 2
zxEMAData = (src + (src - src[zxLag]))
ZLEMA = ta.ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
lrc = ta.linreg(src, length, 0)
lrc1 = ta.linreg(src,length,1)
lrs = (lrc-lrc1)
TSF = ta.linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
getMA(src, length) =>
ma = 0.0
if mav == "SMA"
ma := ta.sma(src, length)
ma
if mav == "EMA"
ma := ta.ema(src, length)
ma
if mav == "WMA"
ma := ta.wma(src, length)
ma
if mav == "TMA"
ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
ma
if mav == "VAR"
ma := VAR
ma
if mav == "WWMA"
ma := WWMA
ma
if mav == "ZLEMA"
ma := ZLEMA
ma
if mav == "TSF"
ma := TSF
ma
ma
MAvg=getMA(src, length)
fark=MAvg*percent*0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir==1 ? longStop: shortStop
OTT=MAvg>MT ? MT*(200+percent)/200 : MT*(200-percent)/200
light_green=#08ff12
light_red=#fe0808
OTTupper = nz(OTT[2])*(1+ottUpperPercent)
OTTlower = nz(OTT[2])*(1-ottLowerPercent)
p1 = plot(OTTupper, color=light_green, linewidth=1, title="OTT UPPER")
p2 = plot(nz(OTT[2]), color=color.new(color.yellow,0), linewidth=1, title="OTT MIDDLE")
p3 = plot(OTTlower, color=light_red, linewidth=1, title="OTT LOWER")
fill(plot1=p1, plot2=p3, title="OTT Background", color=color.new(color.aqua,90), fillgaps=false, editable=true)
buyEntry = ta.crossover(src, OTTlower)
sellEntry = ta.crossunder(src, OTTupper)
//---------- input TP/SL ---------------
tp = input.float(title="Take Profit:", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
sl = input.float(title="Stop Loss: ", defval=0.0, minval=0.0, maxval=100.0, step=0.1) * 0.01
isEntryLong = input.bool(defval=true, title= 'Long Entry', inline="11")
isEntryShort = input.bool(defval=true, title='Short Entry', inline="11")
//---------- backtest range setup ------------
fromDay = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input.int(defval = 2021, title = "From Year", minval = 2010)
toDay = input.int(defval = 30, title = "To Day", minval = 1, maxval = 31)
toMonth = input.int(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input.int(defval = 2022, title = "To Year", minval = 2010)
//------------ time interval setup -----------
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(toYear, toMonth, toDay, 23, 59) // backtest finish window
window() => true // create function "within window of time"
//------- define the global variables ------
var bool long = true
var bool stoppedOutLong = false
var bool stoppedOutShort = false
//--------- Colors ---------------
//TrendColor = RSIoverBought and (price[1] > BBupper and price < BBupper) and BBbasis < BBbasis[1] ? color.red : RSIoverSold and (price[1] < BBlower and price > BBlower) and BBbasis > BBbasis[1] ? color.green : na
//bgcolor(switch2?(color.new(TrendColor,50)):na)
//--------- calculate the input/output points -----------
longProfitPrice = strategy.position_avg_price * (1 + tp) // tp -> take profit percentage
longStopPrice = strategy.position_avg_price * (1 - sl) // sl -> stop loss percentage
shortProfitPrice = strategy.position_avg_price * (1 - tp)
shortStopPrice = strategy.position_avg_price * (1 + sl)
//---------- RSI + Bollinger Bands Strategy -------------
vrsi = ta.rsi(price, RSIlength)
rsiCrossOver = ta.crossover(vrsi, RSIoverSold)
rsiCrossUnder = ta.crossunder(vrsi, RSIoverBought)
OTTCrossOver = ta.crossover(src, OTTlower)
OTTCrossUnder = ta.crossunder(src, OTTupper)
if (not na(vrsi))
if rsiCrossOver and OTTCrossOver
long := true
if rsiCrossUnder and OTTCrossUnder
long := false
//------- define the global variables ------
buySignall = false
sellSignall = false
//------------------- determine buy and sell points ---------------------
buySignall := window() and long and (not stoppedOutLong)
sellSignall := window() and (not long) and (not stoppedOutShort)
//---------- execute the strategy -----------------
if(isEntryLong and isEntryShort)
if long
strategy.entry("LONG", strategy.long, when = buySignall, comment = "ENTER LONG")
stoppedOutLong := true
stoppedOutShort := false
else
strategy.entry("SHORT", strategy.short, when = sellSignall, comment = "ENTER SHORT")
stoppedOutLong := false
stoppedOutShort := true
else if(isEntryLong)
strategy.entry("LONG", strategy.long, when = buySignall)
strategy.close("LONG", when = sellSignall)
if long
stoppedOutLong := true
else
stoppedOutLong := false
else if(isEntryShort)
strategy.entry("SHORT", strategy.short, when = sellSignall)
strategy.close("SHORT", when = buySignall)
if not long
stoppedOutShort := true
else
stoppedOutShort := false
//----------------- take profit and stop loss -----------------
if(tp>0.0 and sl>0.0)
if ( strategy.position_size > 0 )
strategy.exit(id="LONG", limit=longProfitPrice, stop=longStopPrice, comment="Long TP/SL Trigger")
else if ( strategy.position_size < 0 )
strategy.exit(id="SHORT", limit=shortProfitPrice, stop=shortStopPrice, comment="Short TP/SL Trigger")
else if(tp>0.0)
if ( strategy.position_size > 0 )
strategy.exit(id="LONG", limit=longProfitPrice, comment="Long TP Trigger")
else if ( strategy.position_size < 0 )
strategy.exit(id="SHORT", limit=shortProfitPrice, comment="Short TP Trigger")
else if(sl>0.0)
if ( strategy.position_size > 0 )
strategy.exit(id="LONG", stop=longStopPrice, comment="Long SL Trigger")
else if ( strategy.position_size < 0 )
strategy.exit(id="SHORT", stop=shortStopPrice, comment="Short SL Trigger")