ایکشن زون اے ٹی آر ریورس آرڈر کوانٹ حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-11-24 15:55:36
ٹیگز:

img

جائزہ

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

اصول

  1. طویل اور مختصر سگنلز کا حساب لگانے کے لئے تیز ای ایم اے اور سست ای ایم اے کا استعمال کریں۔ سست ای ایم اے سے اوپر تیز ای ایم اے تیزی سے ہے ، دوسری صورت میں bearish ہے۔
  2. جب کوئی پوزیشن نہ ہو، تو گولڈن کراس پر طویل اور مردہ کراس پر مختصر جائیں۔
  3. جب پہلے سے ہی پوزیشن ہے، اگر الٹ سگنل آتا ہے، تو یہ پہلے موجودہ پوزیشن کو بند کرے گا، پھر مخالف سمت میں ایک نئی پوزیشن کھولے گا.
  4. اسٹاپ نقصان اور منافع لینے کی قیمتوں کا حساب لگانے کے لئے اے ٹی آر اشارے کا استعمال کریں۔ اسٹاپ نقصان کی قیمت کو اے ٹی آر چینل کی بنیاد پر ایڈجسٹ کیا جائے گا تاکہ اسٹاپ نقصان کا خطرہ کم ہو۔
  5. جب قیمت اوور بک یا اوور سیل زون میں داخل ہوتی ہے تو ، اس میں پھنسنے سے بچنے کے لئے اسٹاپ نقصان کی قیمت کو آخری بار کی سب سے زیادہ یا کم قیمت پر ایڈجسٹ کیا جائے گا۔

فوائد

  1. ایکشن زون اور اے ٹی آر کو یکجا کرنے سے رجحانات کے دوران رجحان کے ساتھ پوزیشنیں کھولی جاسکتی ہیں اور اسٹاپ نقصان مقرر کیا جاسکتا ہے اور بروقت منافع حاصل کیا جاسکتا ہے۔
  2. ریورس آرڈر کی فعالیت کو نافذ کرنے سے قیمتوں کے الٹ جانے پر تیزی سے سمت تبدیل ہوسکتی ہے ، اعلی منافع کے لئے دو طرفہ قیمتوں میں اتار چڑھاؤ کا مکمل استعمال ہوتا ہے۔
  3. اے ٹی آر سٹاپ نقصان میکانزم مؤثر طریقے سے ایک سٹاپ نقصان کے خطرے کو کنٹرول کر سکتے ہیں اور مجموعی طور پر اعلی جیت کی شرح حاصل کر سکتے ہیں.
  4. غیر متوقع واقعات کی طرف سے پھنس جانے سے بچنے کے لئے overbought اور oversold فیصلوں کے ساتھ مل کر.

خطرات اور حل

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

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

  1. بہترین پیرامیٹر مجموعہ تلاش کرنے کے لئے پیرامیٹر کی ترتیبات کو بہتر بنائیں.
  2. سگنل کے معیار کو بہتر بنانے کے لئے فلٹر میں معاون تکنیکی اشارے شامل کریں۔
  3. اکاؤنٹ کے کل اثاثوں کے ساتھ پوزیشن کے سائز کو منسلک کرنے کے لئے کیپٹل مینجمنٹ ماڈیولز شامل کریں.
  4. مزید معلومات کے ساتھ حکمت عملی کی کارکردگی کو بہتر بنانے کے لئے کراس ٹائم فریم تجزیہ شامل کریں.

خلاصہ

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


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
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/
// © fenirlix

//@version=5
// Strategy parameter incl. position size, commission and initial capital
strategy("ACTIONZONE-ATR REVERSEORDER STRATEGY", "ACTIONZONEATR-REVERSEORDER", overlay=true
     )

// User Input Variable
fastMaInput     = input.int(12, "Fast MA Period", minval=2, step=1)
slowMaInput     = input.int(26, "Fast MA Period", minval=2, step=1)

atrLengthInput  = input.int(14, "ATR length", minval=2,step=1)
atrInnerMultInput = input.float(1, "atr inner multiplier", minval=0.1, step=0.1)
atrMidMultInput = input.float(2, "atr inner multiplier", minval=0.1, step=0.1) //***** MOST OF RISK MANAGEMENT LOGIC BASE ON THIS INPUT *****//
atrOuterMultInput = input.float(3, "atr inner multiplier", minval=0.1, step=0.1)

// Backtesting Date range
startYearInput      = input.int(2021, "Start Year", minval=1900, maxval=2100, step=1)
startMonthInput     = input.int(12, "Start Month", minval=1, maxval=12, step=1)
startDateInput      = input.int(1, "Start Day", minval=1, maxval=31, step=1)
setEndRangeInput    = input.bool(false, "Using Specific End Test Date") //Set specific End date or use present(end of candle) data
endYearInput        = input.int(2022, "End Year", minval=1900, maxval=2100, step=1)
endMonthInput       = input.int(1, "End Month", minval=1, maxval=12, step=1)
endDateInput        = input.int(31, "End Day", minval=1, maxval=31, step=1)

startDate = timestamp(syminfo.timezone, startYearInput, startMonthInput, startDateInput)
endDate = timestamp(syminfo.timezone, endYearInput, endMonthInput, endDateInput)
inDateRange = time >= startDate //Set backtest date range to present data
if setEndRangeInput
    inDateRange and time <= endDate //set backtest date range to specific date

// minimum position hold period (to get rid of false signal in sideway trend)
minHoldInput = input.int(8, 'Minimum position Hold Limit', minval=1, maxval=365, step=1) // Set Minimum Position Hold

var bool reverseToLong = false // Assign reverse order operator
var bool reverseToShort = false // Assign reverse order operator

// Indicator Declaration
fastEma = ta.ema(close, fastMaInput)
slowEma = ta.ema(close, slowMaInput)
atr = ta.atr(atrLengthInput)

// Declare trend of asset
isBullish = fastEma > slowEma
isBearish = fastEma <= slowEma

// Record position hold length, to limit minimum hold period(candle)
var int hold_length = 0
if strategy.opentrades > 0 or strategy.opentrades < 0
    hold_length := hold_length + 1
else
    hold_length := 0

// create permanent variable of stop price
var float longStopPrice = na
var float shortStopPrice = na
    
// Chart-Indicator COLOR declaration
REDBEAR     = color.new(color.red, 80)
GREENBULL   = color.new(color.green, 80)

greenLong = isBullish and close > fastEma
yellowLong = isBullish and close < fastEma
blueShort = isBearish and close > fastEma
redShort = isBearish and close < fastEma

// assign oversold, overbought condition(in this case, price over middle atr plus/minus fastEma)
overBand = high[1] > fastEma + (2*atr)
underBand = low[1] < fastEma - (2*atr)

// Strategy

// Main Entry Condition
goLong = isBullish and isBullish[1] == 0
goShort = isBearish and isBearish[1] == 0

inPosition = strategy.position_size != 0
minHoldPeriod = hold_length > minHoldInput ? true : false

// Entry Condition
if not inPosition and inDateRange and barstate.isconfirmed == true //compute after close of the bar to avoid repainting
    if goLong or reverseToLong // Long if longcondition or reverse order receive.
        strategy.entry('long', strategy.long)
        longStopPrice := fastEma - (atr * 2) // Set stop loss price
        reverseToLong := false // Reset reverse order status
    
    else if goShort or reverseToShort
        strategy.entry('short', strategy.short)
        shortStopPrice := fastEma + (atr * 2)
        reverseToShort := false
// Take profit and Set Higher Stop 
if inPosition and minHoldPeriod and barstate.isconfirmed == true // check if we're in position and pass minimum hold period, confirm no repainting
    if strategy.position_size > 0
        // if exit position by Sellcondition(which is the same as ShortCondition), Exit Long position and make Short order(by set reverse order to true)
        strategy.close('long', when=goShort, comment='exitLong(' + str.tostring(hold_length) + ')')
        reverseToShort := true
        if overBand //If overbought condition met, set Stop price to LAST LOW, and not reverse any position
            longStopPrice := low[1]
            reverseToShort := false
    else if strategy.position_size < 0
        strategy.close('short', when=goLong, comment='exitShort(' + str.tostring(hold_length) + ')')
        reverseToLong := true
        if underBand
            shortStopPrice := high[1]
            reverseToLong := false
// Stop Loss and Set calculate stop loss using Atr Channel
if inPosition 
    if strategy.position_size > 0
        if fastEma - (atr * atrMidMultInput) > longStopPrice // set long stop price to the higher of latest long stop price and ATR lower channel
            longStopPrice := fastEma - (atr * atrMidMultInput)
        strategy.exit('Long Stop atr ', 'long', stop=longStopPrice)
    else if strategy.position_size < 0
        if fastEma + (atr * atrMidMultInput) < shortStopPrice
            shortStopPrice := fastEma + (atr * atrMidMultInput)
        strategy.exit('Short Stop atr ', 'short', stop=shortStopPrice)

// Plotting
fastLine = plot(fastEma, title='fast ema line', linewidth=1, color=isBullish ? color.green : color.red)
slowLine = plot(slowEma, title='slow ema line', linewidth=2, color= isBullish? color.green : color.red)
atrUpperLine1 = plot(fastEma + (atr * atrInnerMultInput), title='ATR Upperline1', color=color.new(color.black,85))
atrLowerLine1 = plot(fastEma - (atr * atrInnerMultInput), title='ATR Lowerline1', color=color.new(color.black,85))
atrUpperLine2 = plot(fastEma + (atr * atrMidMultInput), title='ATR Upperline2', color=color.new(color.black,75))
atrLowerLine2 = plot(fastEma - (atr * atrMidMultInput), title='ATR Lowerline2', color=color.new(color.black,75))
atrUpperLine3 = plot(fastEma + (atr * atrOuterMultInput), title='ATR Upperline3', color=color.new(color.black,50))
atrLowerLine3 = plot(fastEma - (atr * atrOuterMultInput), title='ATR Lowerline3', color=color.new(color.black,50))

plot(longStopPrice, color=strategy.position_size > 0 ? color.red : na, linewidth=2)
plot(shortStopPrice, color=strategy.position_size < 0 ? color.red : na, linewidth=2)

//  Filling
fill(fastLine, slowLine, color=isBullish ? GREENBULL : REDBEAR)
fill(atrUpperLine3, atrLowerLine3, color=inPosition and (minHoldInput - hold_length > 0) ? color.new(color.blue,90): na)

barColor = switch
    greenLong => color.green
    yellowLong =>  color.yellow
    blueShort => color.blue
    redShort => color.red
    => color.black
barcolor(color=barColor)

// Fill background to distinguish inactive time(Zulu time)
nightTime = time(timeframe.period, "1500-0100") ? color.new(color.black, 95): na
bgcolor(nightTime)


مزید