
یہ حکمت عملی ایک ٹرینڈ ٹریکنگ اسٹاپ نقصان کی حکمت عملی ہے جو ڈاکٹر جان ایہلرز کے ٹرینڈ لچکدار آسکیلیٹر (Trend Flex Oscillator, TFO) اور اوسط حقیقی اتار چڑھاؤ کی حد (Average True Range, ATR) اشارے پر مبنی ہے۔ یہ کثیر مارکیٹوں پر لاگو ہوتا ہے ، اور جب قیمتوں میں اوورسوڈ کے بعد الٹ جاتا ہے تو کثیر پوزیشن کھولی جاتی ہے۔ یہ عام طور پر کچھ دن میں پوزیشن کو صاف کردیتا ہے ، جب تک کہ یہ ایک ریچھ کی مارکیٹ میں پکڑا نہ جائے ، اس صورت میں یہ پوزیشن پر قائم رہتا ہے۔ یہ حکمت عملی ترتیب دینے کے قابل پیرامیٹرز کو ایک سادہ واپسی کے ذریعہ ایڈجسٹ کرتی ہے ، لیکن اس کے نتائج پر مکمل اعتماد نہیں کرنا چاہئے۔
اس حکمت عملی میں TFO اور ATR دونوں اشارے شامل ہیں ، خریدنے کے لئے موزوں پوزیشنوں پر زیادہ پوزیشنیں اور فروخت کے لئے موزوں پوزیشنوں پر کم پوزیشنیں۔
خریدنے کی شرائط: جب TFO کسی حد سے کم ہو (((یہ ضرورت سے زیادہ خالی ہے) ، اور اوپر کی K لائن کی TFO قیمت موجودہ K لائن سے کم ہے (((یہ TFO الٹ پلٹ ہے) ، اور ATR طے شدہ اتار چڑھاؤ کی حد سے زیادہ ہے (((یہ مارکیٹ میں اتار چڑھاؤ میں اضافہ ہے) ، ان تینوں شرائط کو پورا کرنے پر زیادہ پوزیشن کھولی جائے گی۔
صفائی کی پوزیشن کی شرائط: جب ٹی ایف او کسی حد سے زیادہ ہو (یعنی حد سے زیادہ سر) ، اور اے ٹی آر مقررہ حد سے زیادہ ہو تو ، تمام زیادہ پوزیشنوں کو صاف کریں۔ اس کے علاوہ ، اس حکمت عملی میں ٹریکنگ اسٹاپ نقصان بھی ہے ، اور جب قیمت مقررہ ٹریکنگ اسٹاپ نقصان کی قیمت سے نیچے آجائے تو ، تمام زیادہ پوزیشنوں کو بھی صاف کردیا جائے گا۔ صارفین کو اختیار ہے کہ حکمت عملی کو اشارے کے اشارے کے مطابق صاف کیا جائے ، یا صرف قیمت کی صفائی کے مطابق بند کیا جائے۔
اس حکمت عملی میں ایک ہی وقت میں زیادہ سے زیادہ 15 کثیر پوزیشنیں کھولی جاسکتی ہیں۔ اس کی پیرامیٹرز کو ایڈجسٹ کیا جاسکتا ہے ، جو مختلف ٹائم پیریڈ کے لئے موزوں ہے۔
رجحانات اور اتار چڑھاؤ کے ساتھ مل کر مارکیٹ کی سمت کا فیصلہ کرنا ، نسبتا مستحکم ہے۔ ٹی ایف او رجحانات کو توڑنے کے ابتدائی اشارے پر قبضہ کرسکتا ہے ، اے ٹی آر مارکیٹ میں اتار چڑھاؤ میں اضافے کے وقت کو پکڑ سکتا ہے۔
ایڈجسٹ خرید و فروخت پیرامیٹرز اور سٹاپ نقصان پیرامیٹرز، آپریشنل لچکدار. صارفین کو مارکیٹ کے مطابق پیرامیٹرز کو ایڈجسٹ کرنے کے لئے، زیادہ سے زیادہ اصلاح کے لئے.
بلٹ میں سٹاپ نقصان کی خصوصیت ہے جو انتہائی حالات میں ہونے والے نقصان کو کم کرتی ہے۔ سٹاپ نقصان کی حکمت عملی کوانٹم ٹریڈنگ کا ایک بہت اہم حصہ ہے۔
اضافی پوزیشن کھولنے اور کچھ پوزیشنوں کو صاف کرنے کی حمایت کرتا ہے ، جس سے پوزیشن بڑھا کر منافع میں اضافہ کیا جاسکتا ہے۔
اس حکمت عملی میں صرف زیادہ کام کیا جاتا ہے ، کوئی خالی جگہ نہیں لی جاتی ہے ، اور گرتی ہوئی مارکیٹوں میں منافع نہیں ملتا ہے۔ اگر یہ ایک خوفناک ریچھ کی مارکیٹ میں ہوتا ہے تو ، اس سے بہت زیادہ نقصان ہوسکتا ہے۔
پیرامیٹرز کی غلط ترتیب سے زیادہ تجارت یا کم فروخت ہوسکتی ہے۔ بہترین پیرامیٹرز کا مجموعہ تلاش کرنے کے لئے بار بار جانچ کی ضرورت ہے۔
انتہائی حالات میں ، اسٹاپ نقصان غیر موثر ہوسکتا ہے ، جس سے بڑے نقصانات کو روکا نہیں جاسکتا ہے۔ یہ ایک ایسا مسئلہ ہے جس کا سامنا تمام اسٹاپ نقصان کی حکمت عملیوں کو ہوسکتا ہے۔
اس کے علاوہ ، یہ بھی کہا گیا ہے کہ اس کے نتیجے میں ، اس کی قیمتوں میں کمی واقع ہوگی ، اور اس کے نتیجے میں اس کی قیمتوں میں کمی واقع ہوگی۔
فروخت کی شرائط میں متحرک اسٹاپ لائن کو شامل کرنے پر غور کیا جاسکتا ہے تاکہ حکمت عملی کو بروقت اسٹاپ نقصان پہنچایا جاسکے اور نیچے جانے والے خطرے کو مؤثر طریقے سے کنٹرول کیا جاسکے۔
خالی کرنے کا طریقہ کار بڑھایا جاسکتا ہے ، ٹی ایف او کے الٹ جانے پر اور اے ٹی آر کافی بڑے ہونے پر خالی پوزیشن کھولنے کے لئے ، تاکہ حکمت عملی کو خالی مارکیٹوں پر لاگو کیا جاسکے۔
مزید فلٹرنگ شرائط شامل کی جاسکتی ہیں ، جیسے ٹرانزیکشن میں تبدیلی ، حکمت عملی پر غیر معمولی رویے کے اثرات کو کم کرنا۔
بہترین دورانیہ اور پیرامیٹرز کے مجموعے کو تلاش کرنے کے لئے مختلف وقت کی مدت کے لئے پیرامیٹرز کی ترتیب اور نتائج کی جانچ کی جا سکتی ہے.
اس حکمت عملی میں رجحان تجزیہ اور اتار چڑھاؤ کی نگرانی کے فوائد کو مربوط کیا گیا ہے ، جس میں ٹی ایف او اور اے ٹی آر کے اشارے کے مجموعے کے ذریعہ مارکیٹ کی سمت کا فیصلہ کیا گیا ہے۔ اس میں اضافی پوزیشن کھولنے ، جزوی طور پر بند پوزیشن ، اور متحرک نقصان کو روکنے جیسے میکانزم ہیں ، جو منافع کو بڑھا سکتے ہیں اور خطرہ کو کنٹرول کرسکتے ہیں ، جو کثیر جہتی حالات کے لئے موزوں ہیں۔ اس میں توسیع پذیر اصلاح کی گنجائش بھی ہے ، جس میں مزید اشارے فلٹرنگ اور پیرامیٹر ایڈجسٹمنٹ کو شامل کرکے حکمت عملی کی کارکردگی کو مزید بہتر بنایا جاسکتا ہے۔ بنیادی طور پر ایک مقداری حکمت عملی کی بنیادی فنکشنل ضروریات کو پورا کرنا ، گہری تحقیق اور اطلاق کے قابل ہے۔
/*backtest
start: 2022-11-27 00:00:00
end: 2023-12-03 00:00:00
period: 1d
basePeriod: 1h
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/
// © Chart0bserver
//
// Open Source attributions:
// portions © allanster (date window code)
// portions © Dr. John Ehlers (Trend Flex Oscillator)
//
// READ THIS CAREFULLY!!! ----------------//
// This code is provided for educational purposes only. The results of this strategy should not be considered investment advice.
// The user of this script acknolwedges that it can cause serious financial loss when used as a trading tool
// This strategy has a bias for HODL (Holds on to Losses) meaning that it provides NO STOP LOSS protection!
// Also note that the default behavior is designed for up to 15 open long orders, and executes one order to close them all at once.
// Opening a long position is predicated on The Trend Flex Oscillator (TFO) rising after being oversold, and ATR above a certain volatility threshold.
// Closing a long is handled either by TFO showing overbought while above a certain ATR level, or the Trailing Stop Loss. Pick one or both.
// If the strategy is allowed to sell before a Trailing Stop Loss is triggered, you can set a "must exceed %". Do not mistake this for a stop loss.
// Short positions are not supported in this version. Back-testing should NEVER be considered an accurate representation of actual trading results.
//@version=5
strategy('TFO + ATR Strategy with Trailing Stop Loss', 'TFO ATR Trailing Stop Loss', overlay=true, pyramiding=15, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=150000, currency='USD', commission_type=strategy.commission.percent, commission_value=0.5)
strategy.risk.allow_entry_in(strategy.direction.long) // There will be no short entries, only exits from long.
// -----------------------------------------------------------------------------------------------------------//
// Back-testing Date Range code ----------------------------------------------------------------------------//
// ---------------------------------------------------------------------------------------------------------//
fromMonth = input.int(defval=9, title='From Month', minval=1, maxval=12, group='Back-Testing Start Date')
fromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, group='Back-Testing Start Date')
fromYear = input.int(defval=2021, title='From Year', minval=1970, group='Back-Testing Start Date')
thruMonth = 1 //input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12, group="Back-Testing Date Range")
thruDay = 1 //input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31, group="Back-Testing Date Range")
thruYear = 2112 //input(defval = 2112, title = "Thru Year", type = input.integer, minval = 1970, group="Back-Testing Date Range")
// === FUNCTION EXAMPLE ===
start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window
finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window
window() => // create function "within window of time
time >= start and time <= finish ? true : false
// Date range code -----//
// -----------------------------------------------------------------------------------------------------------//
// ATR Indicator Code --------------------------------------------------------------------------------------//
// ---------------------------------------------------------------------------------------------------------//
length = 18 //input(title="ATR Length", defval=18, minval=1)
Period = 18 //input(18,title="ATR EMA Period")
basicEMA = ta.ema(close, length)
ATR_Function = ta.ema(ta.tr(true), length)
EMA_ATR = ta.ema(ATR_Function, Period)
ATR = ta.ema(ta.tr(true), length)
ATR_diff = ATR - EMA_ATR
volatility = 100 * ATR_diff / EMA_ATR // measure of spread between ATR and EMA
volatilityAVG = math.round((volatility + volatility[1] + volatility[2]) / 3)
buyVolatility = input.int(3, 'Min Volatility for Buy', minval=-20, maxval=20, step=1, group='Average True Range')
sellVolatility = input.int(13, 'Min Volatility for Sell', minval=-10, maxval=20, step=1, group='Average True Range')
useAvgVolatility = input.bool(defval=false, title='Average the Volatility over 3 bars', group='Average True Range')
// End of ATR ------------/
// -----------------------------------------------------------------------------------------------------------//
// TFO Indicator code --------------------------------------------------------------------------------------//
// ---------------------------------------------------------------------------------------------------------//
trendflex(Series, PeriodSS, PeriodTrendFlex, PeriodEMA) =>
var SQRT2xPI = math.sqrt(8.0) * math.asin(1.0) // 4.44288293815 Constant
alpha = SQRT2xPI / PeriodSS
beta = math.exp(-alpha)
gamma = -beta * beta
delta = 2.0 * beta * math.cos(alpha)
float superSmooth = na
superSmooth := (1.0 - delta - gamma) * (Series + nz(Series[1])) * 0.5 + delta * nz(superSmooth[1]) + gamma * nz(superSmooth[2])
E = 0.0
for i = 1 to PeriodTrendFlex by 1
E += superSmooth - nz(superSmooth[i])
E
epsilon = E / PeriodTrendFlex
zeta = 2.0 / (PeriodEMA + 1.0)
float EMA = na
EMA := zeta * epsilon * epsilon + (1.0 - zeta) * nz(EMA[1])
return_1 = EMA == 0.0 ? 0.0 : epsilon / math.sqrt(EMA)
return_1
upperLevel = input.float(1.2, 'TFO Upper Level', minval=0.1, maxval=2.0, step=0.1, group='Trend Flex Ocillator')
lowerLevel = input.float(-0.9, 'TFO Lower Level', minval=-2.0, maxval=-0.1, step=0.1, group='Trend Flex Ocillator')
periodTrendFlex = input.int(14, 'TrendFlex Period', minval=2, group='Trend Flex Ocillator')
useSuperSmootherOveride = true //input( true, "Apply SuperSmoother Override Below*", input.bool, group="Trend Flex Ocillator")
periodSuperSmoother = 8.0 //input(8.0, "SuperSmoother Period*", input.float , minval=4.0, step=0.5, group="Trend Flex Ocillator")
postSmooth = 33 //input(33.0, "Post Smooth Period**", input.float , minval=1.0, step=0.5, group="Trend Flex Ocillator")
trendFlexOscillator = trendflex(close, periodSuperSmoother, periodTrendFlex, postSmooth)
// End of TFO -------------//
// -----------------------------------------------------------------------------------------------------------//
// HODL Don't sell if losing n% ---------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------------------//
sellOnStrategy = input.bool(defval=true, title='Allow Stategy to close positions', group='Selling Conditions')
doHoldLoss = true // input(defval = true, title = "Strategy can sell for a loss", type = input.bool, group="Selling Conditions")
holdLoss = input.int(defval=0, title='Value (%) must exceed ', minval=-25, maxval=10, step=1, group='Selling Conditions')
totalInvest = strategy.position_avg_price * strategy.position_size
openProfitPerc = strategy.openprofit / totalInvest
bool acceptableROI = openProfitPerc * 100 > holdLoss
// -----------------------//
// -----------------------------------------------------------------------------------------------------------//
// Buying and Selling conditions -------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------------------//
if useAvgVolatility
volatility := volatilityAVG
volatility
tfoBuy = trendFlexOscillator < lowerLevel and trendFlexOscillator[1] < trendFlexOscillator // Always make a purchase if TFO is in this lowest range
atrBuy = volatility > buyVolatility
tfoSell = ta.crossunder(trendFlexOscillator, upperLevel)
consensusBuy = tfoBuy and atrBuy
consensusSell = tfoSell and volatility > sellVolatility
if doHoldLoss
consensusSell := consensusSell and acceptableROI
consensusSell
// --------------------//
// -----------------------------------------------------------------------------------------------------------//
// Tracing & Debugging --------------------------------------------------------------------------------------//
// ---------------------------------------------------------------------------------------------------------//
plotchar(strategy.opentrades, 'Number of open trades', ' ', location.top)
plotarrow(100 * openProfitPerc, 'Profit on open longs', color.new(color.green, 75), color.new(color.red, 75))
// plotchar(strategy.position_size, "Shares on hand", " ", location.top)
// plotchar(totalInvest, "Total Invested", " ", location.top)
// plotarrow(strategy.openprofit, "Open profit dollar amount", color.new(color.green,100), color.new(color.red, 100))
// plotarrow(strategy.netprofit, "Net profit for session", color.new(color.green,100), color.new(color.red, 100))
// plotchar(acceptableROI, "Acceptable ROI", " ", location.top)
// plotarrow(volatility, "ATR volatility value", color.new(color.green,75), color.new(color.red, 75))
// plotchar(strategy.position_avg_price, "Avgerage price of holdings", " ", location.top)
// plotchar(volatilityAVG, "AVG volatility", " ", location.top)
// plotchar(fiveBarsVal, "change in 5bars", " ", location.top)
// plotchar(crossingUp, "crossingUp", "x", location.belowbar, textcolor=color.white)
// plotchar(crossingDown, "crossingDn", "x", location.abovebar, textcolor=color.white)
// plotchar(strategy.closedtrades, "closedtrades", " ", location.top)
// plotchar(strategy.wintrades, "wintrades", " ", location.top)
// plotchar(strategy.losstrades, "losstrades", " ", location.top)
// plotchar(close, "close", " ", location.top)
//--------------------//
// -----------------------------------------------------------------------------------------------------------//
// Trade Alert Execution ------------------------------------------------------------------------------------//
// ---------------------------------------------------------------------------------------------------------//
strategy.entry('long', strategy.long, when=window() and consensusBuy, comment='long')
if sellOnStrategy
strategy.close('long', when=window() and consensusSell, qty_percent=100, comment='Strat')
// -----------------------------------------------------------------------------------------------------------//
// Trailing Stop Loss logic -------------------------------------------------------------------------------- //
// ---------------------------------------------------------------------------------------------------------//
useTrailStop = input.bool(defval=true, title='Set Trailing Stop Loss on avg positon value', group='Selling Conditions')
arm = input.float(defval=15, title='Trailing Stop Arms At (%)', minval=1, maxval=30, step=1, group='Selling Conditions') * 0.01
trail = input.float(defval=2, title='Trailing Stop Loss (%)', minval=0.25, maxval=9, step=0.25, group='Selling Conditions') * 0.1
longStopPrice = 0.0
stopLossPrice = 0.0
if strategy.position_size > 0
longStopPrice := strategy.position_avg_price * (1 + arm)
stopLossPrice := strategy.position_avg_price * ((100 - math.abs(holdLoss)) / 100) // for use with 'stop' in strategy.exit
stopLossPrice
else
longStopPrice := close
longStopPrice
// If you want to hide the Trailing Stop Loss threshold (green line), comment this out
plot(longStopPrice, 'Arm Trail Stop at', color.new(color.green, 60), linewidth=2)
if strategy.position_size > 0 and useTrailStop
strategy.exit('exit', 'long', when=window(), qty_percent=100, trail_price=longStopPrice, trail_offset=trail * close / syminfo.mintick, comment='Trail')
//-----------------------------------------------------------------------------------------------------------//