عام حمایت / مزاحمت پر مبنی ریورس ٹریڈنگ کی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-10-30 11:23:25
ٹیگز:

img

جائزہ

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

حکمت عملی منطق

  1. عام حمایت/مقاومت کے ساتھ حجم کی بنیاد پر تیزی/گرفتاری عوامل کی نشاندہی کرنا

    • کلاسیکی S/R سطحوں کی نشاندہی کرنے کے لئے موم بتی کے نمونوں کا استعمال کرتے ہوئے، اہم حجم کی طرف سے فلٹر

    • عام S / R کلاسیکی نمونوں کے مقابلے میں بہتر کوریج ہے

    • عام حمایت کے اشاروں کو توڑنے کا طویل عنصر، عام مزاحمت کے اشاروں کو توڑنے کا مختصر عنصر

  2. ریورس ٹریڈنگ

    • فیکٹر سگنل ٹرگر جب ریورس پوزیشن لے لو

    • اگر پہلے سے ہی پوزیشن میں، کم یا پیچھے کی پوزیشن شامل کریں

  3. منافع کے ہدف کی سطح کا تعین

    • اے ٹی آر پر مبنی سٹاپ نقصان مقرر کریں

    • 1R، 2R، 3R کی طرح متعدد منافع کی سطح مقرر کریں

    • مختلف اہداف کو حاصل کرنے پر جزوی منافع

فوائد

  • مناسب درمیانی مدت کی تبدیلیوں کو پکڑو

    ایس/آر بریکآؤٹس کچھ قابل اعتماد کے ساتھ مضبوط ریورس سگنل پیش کرتے ہیں، جو درمیانی مدت کی ریورسز کو پکڑنے کے قابل ہیں

  • تیز منافع، چھوٹی واپسی

    سٹاپ نقصان اور ایک سے زیادہ منافع کے اہداف مقرر کر کے، فوری فوائد حاصل کر سکتے ہیں اور drawdowns محدود

  • اہم ادارہ جاتی رقم اور اتار چڑھاؤ کے ساتھ اسٹاک کے لئے مناسب

    یہ حکمت عملی حجم پر انحصار کرتی ہے ، جس میں بڑی ادارہ جاتی شرکت کی ضرورت ہوتی ہے۔ منافع کمانے کے لئے اتار چڑھاؤ کی بھی ضرورت ہوتی ہے

خطرات

  • رینج سے منسلک مارکیٹ میں پھنس جانا

    مخالف سمت میں بار بار اسٹاپ نقصان سے باہر نکلنے اور دوبارہ داخل ہونے سے وپساؤز کا نتیجہ نکل سکتا ہے

  • معاونت/مقاومت کی خرابی

    عام S / R مکمل طور پر قابل اعتماد نہیں ہے، کچھ ناکامی موجود ہیں

  • ایک طرفہ ہولڈنگ کا خطرہ

    خالص الٹ منطق بڑے رجحانات کے مواقع کھو سکتی ہے

  • خطرے کا انتظام:

    • لوز فیکٹر حالات، ہر بریک آؤٹ پر الٹ نہیں

    • دیگر فلٹرز شامل کریں مثلاً قیمت/مقدار میں فرق

    • ٹریپس کو کم کرنے کے لئے سٹاپ نقصان کی حکمت عملی کو بہتر بنائیں

بہتری کی ہدایات

  • ایس / آر پیرامیٹرز کو بہتر بنائیں

    عام S / R کی ترتیبات کو ٹویک کرکے زیادہ قابل اعتماد عوامل تلاش کریں

  • منافع کے حصول کو بہتر بنائیں

    زیادہ منافع کی سطح شامل کریں، یا غیر مقررہ اہداف کا استعمال کریں

  • سٹاپ نقصان کو بہتر بنائیں

    ATR پیرامیٹرز کو ایڈجسٹ کریں یا غیر ضروری رکاوٹوں کو کم کرنے کے لئے اسٹاپ نقصان کو روکنے کے لئے استعمال کریں

  • رجحان اور دیگر عوامل کو شامل کریں

    بڑے رجحان تنازعات سے بچنے کے لئے چلتی اوسط جیسے رجحان فلٹرز شامل کریں؛ دیگر معاون عوامل بھی شامل کریں

خلاصہ

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


/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 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/
// © DojiEmoji

//@version=5
strategy("Fractal Strat [KL] ", overlay=true, pyramiding=1, initial_capital=1000000000)
var string ENUM_LONG = "Long"
var string GROUP_ENTRY = "Entry"
var string GROUP_TSL = "Stop loss"
var string GROUP_TREND = "Trend prediction"
var string GROUP_ORDER = "Order size and Profit taking"

// backtest_timeframe_start = input.time(defval=timestamp("01 Apr 2000 13:30 +0000"), title="Backtest Start Time")
within_timeframe = true

// TSL: calculate the stop loss price. {
_multiple       = input(2.0, title="ATR Multiplier for trailing stop loss", group=GROUP_TSL)
ATR_TSL         = ta.atr(input(14, title="Length of ATR for trailing stop loss", group=GROUP_TSL, tooltip="Initial risk amount = atr(this length) x multiplier")) * _multiple
TSL_source      = low
TSL_line_color  = color.green
TSL_transp      = 100
var stop_loss_price = float(0)

var float initial_entry_p    = float(0)
var float risk_amt           = float(0)
var float initial_order_size = float(0)

if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_TSL
else if strategy.position_size > 0
    stop_loss_price := math.max(stop_loss_price, TSL_source - ATR_TSL)
    TSL_transp := 0

plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// } end of "TSL" block


// Order size and profit taking {
pcnt_alloc = input.int(5, title="Allocation (%) of portfolio into this security", tooltip="Size of positions is based on this % of undrawn capital. This is fixed throughout the backtest period.", minval=0, maxval=100, group=GROUP_ORDER) / 100

// Taking profits at user defined target levels relative to risked amount (i.e 1R, 2R, 3R)
var bool  tp_mode = input(true, title="Take profit and different levels", group=GROUP_ORDER)
var float FIRST_LVL_PROFIT = input.float(1, title="First level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking first level profit at 1R means taking profits at $11", group=GROUP_ORDER)
var float SECOND_LVL_PROFIT = input.float(2, title="Second level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking second level profit at 2R means taking profits at $12", group=GROUP_ORDER)
var float THIRD_LVL_PROFIT = input.float(3, title="Third level profit", tooltip="Relative to risk. Example: entry at $10 and inital stop loss at $9. Taking third level profit at 3R means taking profits at $13", group=GROUP_ORDER)

// }

// Fractals {
// Modified from synapticEx's implementation: https://www.tradingview.com/script/cDCNneRP-Fractal-Support-Resistance-Fixed-Volume-2/

rel_vol_len = 6 // Relative volume is used; the middle candle has to have volume above the average (say sma over prior 6 bars)
rel_vol = ta.sma(volume, rel_vol_len)
_up = high[3]>high[4] and high[4]>high[5] and high[2]<high[3] and high[1]<high[2] and volume[3]>rel_vol[3]
_down = low[3]<low[4] and low[4]<low[5] and low[2]>low[3] and low[1]>low[2] and volume[3]>rel_vol[3]

fractal_resistance = high[3], fractal_support = low[3]   // initialize

fractal_resistance :=  _up ? high[3] : fractal_resistance[1]
fractal_support := _down ? low[3] : fractal_support[1]

plot(fractal_resistance, "fractal_resistance", color=color.new(color.red,50), linewidth=2, style=plot.style_cross, offset =-3, join=false)
plot(fractal_support, "fractal_support", color=color.new(color.lime,50), linewidth=2, style=plot.style_cross, offset=-3, join=false)
// }

// ATR diversion test {
// Hypothesis testing (2-tailed):
//
// Null hypothesis (H0) and Alternative hypothesis (Ha):
//     H0 : atr_fast equals atr_slow
//     Ha : atr_fast not equals to atr_slow; implies atr_fast is either too low or too high
len_fast    = input(5,title="Length of ATR (fast) for diversion test", group=GROUP_ENTRY)
atr_fast    = ta.atr(len_fast)
atr_slow    = ta.atr(input(50,title="Length of ATR (slow) for diversion test", group=GROUP_ENTRY, tooltip="This needs to be larger than Fast"))

// Calculate test statistic (test_stat)
std_error   = ta.stdev(ta.tr, len_fast) / math.pow(len_fast, 0.5)
test_stat = (atr_fast - atr_slow) / std_error

// Compare test_stat against critical value defined by user in settings
//critical_value = input.float(1.645,title="Critical value", tooltip="Strategy uses 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- this critical value, then H0 will be rejected.", group=GROUP_ENTRY)
conf_interval = input.string(title="Confidence Interval", defval="95%", options=["90%","95%","99%"], tooltip="Critical values of 1.645, 1.96, 2.58, for CI=90%/95%/99%, respectively; Under 2-tailed test to compare atr_fast vs atr_slow. Null hypothesis (H0) is that both should equal. Based on the computed test statistic value, if absolute value of it is +/- critical value, then H0 will be rejected.")
critical_value = conf_interval == "90%" ? 1.645 : conf_interval == "95%" ? 1.96 : 2.58
reject_H0_lefttail = test_stat < -critical_value
reject_H0_righttail = test_stat > critical_value

// } end of "ATR diversion test" block

// Entry Signals
entry_signal_long = close >= fractal_support and reject_H0_lefttail

// MAIN {
// Update the stop limit if strategy holds a position.
if strategy.position_size > 0
    strategy.exit(ENUM_LONG, comment="SL", stop=stop_loss_price)

// Entry
if within_timeframe and entry_signal_long and strategy.position_size == 0
    initial_entry_p := close
    risk_amt := ATR_TSL
    initial_order_size := math.floor(pcnt_alloc * strategy.equity / close)
    strategy.entry(ENUM_LONG, strategy.long, qty=initial_order_size)

var int TP_taken_count = 0
if tp_mode and close > strategy.position_avg_price
    if close >= initial_entry_p + THIRD_LVL_PROFIT * risk_amt and TP_taken_count == 2
        strategy.close(ENUM_LONG, comment="TP Lvl3", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    else if close >= initial_entry_p + SECOND_LVL_PROFIT * risk_amt and TP_taken_count == 1
        strategy.close(ENUM_LONG, comment="TP Lvl2", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    else if close >= initial_entry_p + FIRST_LVL_PROFIT * risk_amt and TP_taken_count == 0
        strategy.close(ENUM_LONG, comment="TP Lvl1", qty=math.floor(initial_order_size / 3))
        TP_taken_count := TP_taken_count + 1
    
// Alerts
_atr = ta.atr(14)
alert_helper(msg) =>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + str.tostring(close, "#.##") + "; atr=" + str.tostring(_atr, "#.##") + ")"
    alert(str.tostring(prefix) + str.tostring(msg) + str.tostring(suffix), alert.freq_once_per_bar)

if strategy.position_size > 0 and ta.change(strategy.position_size)
    if strategy.position_size > strategy.position_size[1]
        alert_helper("BUY")
    else if strategy.position_size < strategy.position_size[1]
        alert_helper("SELL")

// Clean up - set the variables back to default values once no longer in use
if ta.change(strategy.position_size) and strategy.position_size == 0
    TP_taken_count := 0
    initial_entry_p := float(0)
    risk_amt := float(0)
    initial_order_size := float(0)
    stop_loss_price := float(0)
// } end of MAIN block


مزید