یہ حکمت عملی طویل اور مختصر تجارت دونوں کو نافذ کرنے کے لئے حرکت پذیر اوسط اور متحرک لفافہ لائنوں پر مبنی ہے۔ یہ پوزیشنوں کو قائم کرنے کے لئے لفافے کی لائنوں سے باہر قیمت کے وقفوں کا سراغ لگاتا ہے اور جب قیمت بنیادی حرکت پذیر اوسط سے نیچے ہوجاتی ہے تو پوزیشنیں بند کردیتی ہے۔ یہ حکمت عملی واضح رجحانات کے ساتھ اسٹاک اور کریپٹو کرنسیوں کے لئے اچھی طرح کام کرتی ہے۔
سب سے پہلے ، اس حکمت عملی میں صارف کے ذریعہ طے شدہ حرکت پذیر اوسط کی قسم اور لمبائی کی بنیاد پر بیس لائن حرکت پذیر اوسط کا حساب لگایا جاتا ہے۔ عام حرکت پذیر اوسط میں ایس ایم اے ، ای ایم اے وغیرہ شامل ہیں۔
اس کے بعد ، یہ صارف کی وضاحت کردہ فیصد پیرامیٹرز کی بنیاد پر اوپری اور نچلی لفافے کی لائنوں کا حساب لگاتا ہے۔ مثال کے طور پر ، 5٪ کا مطلب ہے جب قیمت میں 5٪ کی بنیاد پر اوسط سے زیادہ اتار چڑھاؤ ہوتا ہے۔ لفافے کی لائنوں کی تعداد کو اپنی مرضی کے مطابق بنایا جاسکتا ہے۔
اندراج کے قواعد کے بارے میں ، جب قیمت کم لفافے کی لائن سے نیچے ٹوٹ جاتی ہے تو طویل ہوجائیں ، جب قیمت اوپر لفافے کی لائن سے اوپر ٹوٹ جاتی ہے تو مختصر ہوجائیں۔ قواعد آسان اور سیدھے سیدھے ہیں۔
آخر میں ، جب قیمت بیس لائن چلتی اوسط سے نیچے گر جاتی ہے تو تمام پوزیشنیں بند کردیں۔ یہ رجحان کی پیروی کرنے کا ایک راستہ ہے۔
قابل ذکر بات یہ ہے کہ اس حکمت عملی میں جزوی پوزیشن کی تشکیل کا نفاذ کیا گیا ہے۔ اگر متعدد لفافہ لائنیں موجود ہیں تو ، دارالحکومت کو متناسب طور پر مختص کیا جائے گا۔ اس سے یکطرفہ شرطوں کے خطرے سے بچتا ہے۔
اس حکمت عملی کے سب سے بڑے فوائد:
خودکار رجحان کی پیروی۔ رجحان کی سمت کا تعین کرنے کے لئے چلتی اوسط کا استعمال ایک اچھی طرح سے قائم طریقہ ہے۔
لفافہ لائنوں کے ساتھ کچھ شور کو فلٹر کرنا ، حد سے زیادہ حساس تجارت کو روکنا۔ معقول پیرامیٹر سیٹنگ حکمت عملی کی منافع بخش صلاحیت کو بہت بہتر بنا سکتی ہے۔
جزوی پوزیشن کا قیام حکمت عملی کی لچک کو بڑھاتا ہے۔ یہاں تک کہ اگر ایک طرف ناکام ہوجاتا ہے تو ، دوسرا حصہ اچھی طرح سے چلتا رہ سکتا ہے۔ اس سے مجموعی طور پر خطرہ انعام کا تناسب بہتر ہوتا ہے۔
قابل تخصیص چلتی اوسط اور لفافہ لائن نمبر۔ اس سے مختلف مصنوعات کی بنیاد پر پیرامیٹر ٹیوننگ کے لئے لچک بڑھ جاتی ہے۔
اس حکمت عملی کے اہم خطرات:
چلتی اوسط سسٹم سنہری کراس سگنلز کے لئے حساس نہیں ہے۔ اگر کوئی واضح رجحان موجود نہیں ہے تو یہ کچھ مواقع سے محروم ہوسکتا ہے۔
بہت وسیع لفافہ لائن کی ترتیب سے تجارت کی تعدد اور سکڑنے کا خطرہ بڑھ سکتا ہے۔ بہت تنگ ترتیب سے بڑی حرکتیں نظرانداز ہوسکتی ہیں۔ توازن تلاش کرنے کے لئے مکمل جانچ کی ضرورت ہے۔
اس حکمت عملی سے ممکنہ طور پر مختلف مارکیٹوں میں زیادہ چیلنجوں کا سامنا کرنا پڑتا ہے۔ لہذا رجحان سازی کی مصنوعات کو ترجیح دی جاتی ہے۔
تجارتی منافع کے مطابق جزوی پوزیشن کی تشکیل کی حدود۔ اگر یکطرفہ شرط لگانے کی تلاش کی جاتی ہے تو ، مزید اصلاح کی ضرورت ہے۔
اس حکمت عملی کو بہتر بنانے کے لئے اہم ہدایات:
دوسرے اندراج / باہر نکلنے والے اشارے جیسے KDJ وغیرہ کے ساتھ تبدیل کریں یا متعدد اشارے کے ساتھ فلٹر شامل کریں.
اسٹاپ منافع / نقصان کا منطق شامل کریں۔ یہ کچھ منافع میں مقفل کرتا ہے اور فعال طور پر کچھ خطرات کو کم کرتا ہے۔
بہترین حرکت پذیر اوسط اور لفافے کے مجموعے کو تلاش کرنے کے لئے پیرامیٹرز کو بہتر بنائیں۔ وسیع پیمانے پر بیک ٹیسٹنگ اور اصلاح کی ضرورت ہے۔
سمارٹ پیرامیٹر ٹیوننگ کے لئے گہری سیکھنے وغیرہ کو شامل کریں۔ وقت کے ساتھ ساتھ مستقل طور پر سیکھیں اور اپ ڈیٹ کریں۔
مصنوعات اور مارکیٹ کے اختلافات پر غور کریں ، مختلف تجارتی ماحول کے مطابق متعدد پیرامیٹر سیٹ مرتب کریں۔ اس سے حکمت عملی کی مضبوطی میں بہتری آتی ہے۔
اختتام کے طور پر ، یہ متحرک لفافہ چلتی اوسط حکمت عملی ٹرینڈ ٹریڈنگ کے لئے بہت اچھی طرح سے کام کرتی ہے۔ یہ آسان ، موثر ، سمجھنے اور بہتر بنانے میں آسان ہے۔ ایک بنیادی حکمت عملی کے طور پر ، اس میں بہت زیادہ پلاسٹکٹی اور توسیع پذیری ہے۔ جب زیادہ پیچیدہ نظاموں کے ساتھ مل کر ، اسے اعلی منافع اور بہتر رسک ایڈجسٹ میٹرکس کے ل further مزید بہتر بنایا جاسکتا ہے۔ لہذا یہ مقداری تجارتی حکمت عملیوں کے لئے ایک بہترین بنیاد کی حیثیت سے کام کرتا ہے۔
/*backtest start: 2024-01-05 00:00:00 end: 2024-02-04 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Envelope Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, pyramiding = 5, commission_type=strategy.commission.percent, commission_value=0.0) // CopyRight Crypto Robot src = input(ohlc4, title="Source", group = "Base MA") ma_base_window = input.int(5, "Base Mooving Average Window", step = 1, group = "Base MA") ma_type = input.string(defval='1. SMA', options=['1. SMA', '2. PCMA', '3. EMA', '4. WMA', '5. DEMA', '6. ZLEMA', '7. HMA'], title='MA Type', group = "Base MA") envelope_1_pct = input.float(0.05, "Envelope 1", step = 0.01, group = "Envelopes") envelope_2_pct = input.float(0.10, "Envelope 2", step = 0.01, group = "Envelopes") envelope_3_pct = input.float(0.15, "Envelope 3", step = 0.01, group = "Envelopes") envelope_4_pct = input.float(0.0, "Envelope 4", step = 0.01, group = "Envelopes") envelope_5_pct = input.float(0.0, "Envelope 5", step = 0.01, group = "Envelopes") use_longs = input.bool(true, 'Long Positions') use_short = input.bool(true, 'Short Positions') total_envelope = 0 if envelope_1_pct > 0 total_envelope := total_envelope + 1 if envelope_2_pct > 0 total_envelope := total_envelope + 1 if envelope_3_pct > 0 total_envelope := total_envelope + 1 if envelope_4_pct > 0 total_envelope := total_envelope + 1 if envelope_5_pct > 0 total_envelope := total_envelope + 1 // --------------------------------------------- // -------------- INDICATORS ------------------- ma_function(MA_type, MA_length) => zlema_lag = (MA_length - 1) / 2 hma_src = MA_type == '7. HMA' ? 2 * ta.wma(src, math.floor(MA_length / 2)) - ta.wma(src, MA_length) : na MA_type == '1. SMA' ? ta.sma(src, MA_length) : MA_type == '2. PCMA' ? (ta.highest(high, MA_length) + ta.lowest(low, MA_length)) / 2 : MA_type == '3. EMA' ? ta.ema(src, MA_length) : MA_type == '4. WMA' ? ta.wma(src, MA_length) : MA_type == '5. DEMA' ? 2 * ta.ema(src, MA_length) - ta.ema(ta.ema(src, MA_length), MA_length) : MA_type == '6. ZLEMA' ? ta.ema(src + src - src[zlema_lag], MA_length) : MA_type == '7. HMA' ? ta.wma(hma_src, math.floor(math.sqrt(MA_length))) : na ma_base = ma_function(ma_type, ma_base_window) ma_high_1 = envelope_1_pct > 0 ? ma_base * (1 + envelope_1_pct) : na ma_high_2 = envelope_2_pct > 0 ? ma_base * (1 + envelope_2_pct) : na ma_high_3 = envelope_3_pct > 0 ? ma_base * (1 + envelope_3_pct) : na ma_high_4 = envelope_4_pct > 0 ? ma_base * (1 + envelope_4_pct) : na ma_high_5 = envelope_5_pct > 0 ? ma_base * (1 + envelope_5_pct) : na ma_low_1 = envelope_1_pct > 0 ? ma_base * (1 - envelope_1_pct) : na ma_low_2 = envelope_2_pct > 0 ? ma_base * (1 - envelope_2_pct) : na ma_low_3 = envelope_3_pct > 0 ? ma_base * (1 - envelope_3_pct) : na ma_low_4 = envelope_4_pct > 0 ? ma_base * (1 - envelope_4_pct) : na ma_low_5 = envelope_5_pct > 0 ? ma_base * (1 - envelope_5_pct) : na // --------------------------------------------- // --------------- STRATEGY -------------------- if use_longs if envelope_1_pct > 0 and strategy.opentrades < 1 strategy.entry('long 1', strategy.long, limit=ma_low_1, qty=(strategy.equity / ma_low_1) * (1 / total_envelope)) if envelope_2_pct > 0 and strategy.opentrades < 2 strategy.entry('long 2', strategy.long, limit=ma_low_2, qty=(strategy.equity / ma_low_2) * (1 / total_envelope)) if envelope_3_pct > 0 and strategy.opentrades < 3 strategy.entry('long 3', strategy.long, limit=ma_low_3, qty=(strategy.equity / ma_low_3) * (1 / total_envelope)) if envelope_4_pct > 0 and strategy.opentrades < 4 strategy.entry('long 4', strategy.long, limit=ma_low_4, qty=(strategy.equity / ma_low_4) * (1 / total_envelope)) if envelope_5_pct > 0 and strategy.opentrades < 5 strategy.entry('long 5', strategy.long, limit=ma_low_5, qty=(strategy.equity / ma_low_5) * (1 / total_envelope)) if use_short if envelope_1_pct > 0 and strategy.opentrades < 1 strategy.entry('short 1', strategy.short, limit=ma_high_1, qty=(strategy.equity / ma_high_1) * (1 / total_envelope)) if envelope_2_pct > 0 and strategy.opentrades < 2 strategy.entry('short 2', strategy.short, limit=ma_high_2, qty=(strategy.equity / ma_high_2) * (1 / total_envelope)) if envelope_3_pct > 0 and strategy.opentrades < 3 strategy.entry('short 3', strategy.short, limit=ma_high_3, qty=(strategy.equity / ma_high_3) * (1 / total_envelope)) if envelope_4_pct > 0 and strategy.opentrades < 4 strategy.entry('short 4', strategy.short, limit=ma_high_4, qty=(strategy.equity / ma_high_4) * (1 / total_envelope)) if envelope_5_pct > 0 and strategy.opentrades < 5 strategy.entry('short 5', strategy.short, limit=ma_high_5, qty=(strategy.equity / ma_high_5) * (1 / total_envelope)) strategy.exit('close', limit=ma_base) // --------------------------------------------- // ------------------ PLOT --------------------- ma_base_plot = plot(ma_base, title = "Base MA", color = color.orange, linewidth = 3, offset = 1) ma_high_1_plot = plot(ma_high_1, title = "MA high 1", color = color.red, offset = 1) ma_high_2_plot = plot(ma_high_2, title = "MA high 2", color = color.red, offset = 1) ma_high_3_plot = plot(ma_high_3, title = "MA high 3", color = color.red, offset = 1) ma_high_4_plot = plot(ma_high_4, title = "MA high 4", color = color.red, offset = 1) ma_high_5_plot = plot(ma_high_5, title = "MA high 5", color = color.red, offset = 1) ma_low_1_plot = plot(ma_low_1, title = "MA low 1", color = color.green, offset = 1) ma_low_2_plot = plot(ma_low_2, title = "MA low 2", color = color.green, offset = 1) ma_low_3_plot = plot(ma_low_3, title = "MA low 3", color = color.green, offset = 1) ma_low_4_plot = plot(ma_low_4, title = "MA low 4", color = color.green, offset = 1) ma_low_5_plot = plot(ma_low_5, title = "MA low 5", color = color.green, offset = 1) plot(ohlc4, color=color.purple) // use_period = input.bool(false, "Période spécifique ?", group="periode") // startDate = input.time(timestamp("01 Jan 2020"), "Date de début", group="periode") // endDate = input.time(timestamp("01 Jan 2025"), "Date de fin", group="periode") //------------------------------------------ //-------------Indicateurs------------------ // inDateRange = use_period ? ((time >= startDate) and (time < endDate)) : true // //--------------Backtest------------------- // strategy_pnl = strategy.netprofit + strategy.openprofit // bnh_strategy_pnl_pcnt = (strategy_pnl / strategy.initial_capital) * 100 // float bnh_start_bar = na // bnh_start_bar := na(bnh_start_bar[1]) or inDateRange != true? close : bnh_start_bar[1] // float bnl_buy_hold_equity = na // bnl_buy_hold_equity := inDateRange == true ? ((close - bnh_start_bar)/bnh_start_bar) * 100 : bnl_buy_hold_equity[1] // bnh_vs_diff = bnh_strategy_pnl_pcnt - bnl_buy_hold_equity // bnh_diff_color = bnh_vs_diff > 0 ? color.new(color.green, inDateRange ? 60 : 100) : color.new(color.red, inDateRange ? 60 : 100) // var Table = table.new(position.top_right, columns = 2, rows = 4, border_width = 1, bgcolor = color.black, border_color = color.gray) // table.cell(table_id = Table, column = 0, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Buy & hold profit") // table.cell(table_id = Table, column = 1, row = 0, text_color=(bnh_strategy_pnl_pcnt>bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnl_buy_hold_equity, '#.##') + ' %') // table.cell(table_id = Table, column = 0, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = "Strategy profit") // table.cell(table_id = Table, column = 1, row = 1, text_color=(bnh_strategy_pnl_pcnt<bnl_buy_hold_equity)?color.gray:color.green, text_size = size.normal, text = str.tostring(bnh_strategy_pnl_pcnt, '#.##') + ' %') // table.cell(table_id = Table, column = 0, row = 2, text_color=color.yellow, text_size = size.normal, text = "Date de début") // table.cell(table_id = Table, column = 1, row = 2, text_color=color.yellow, text_size = size.normal, text = str.format("{0,date,dd-MM-YYYY}",strategy.closedtrades.entry_time(1)))