ڈبل موونگ ایوریج کراس اوور ڈائنامک سٹاپ پرافٹ اور سٹاپ لوس مقداری حکمت عملی

EMA SMA
تخلیق کی تاریخ: 2024-12-11 11:23:54 آخر میں ترمیم کریں: 2024-12-11 11:23:54
کاپی: 0 کلکس کی تعداد: 441
1
پر توجہ دیں
1617
پیروکار

ڈبل موونگ ایوریج کراس اوور ڈائنامک سٹاپ پرافٹ اور سٹاپ لوس مقداری حکمت عملی

جائزہ

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

حکمت عملی کا اصول

اس حکمت عملی کی بنیادی منطق یہ ہے کہ رجحان میں تبدیلیوں کی نشاندہی کی جائے۔ اس کی نگرانی 20 دوروں اور 50 دوروں کے اشاریہ حرکت پذیر اوسط ((EMA) کے کراسنگ کے ذریعے کی جاتی ہے۔ جب تیز رفتار EMA اوپر کی طرف سے سست رفتار EMA کو عبور کرتا ہے تو ، نظام ایک سے زیادہ سگنل پیدا کرتا ہے۔ ہر پوزیشن کھولنے کے بعد ، نظام خود بخود اسٹاپ قیمت ((داخلہ قیمت کا 1.3 گنا) اور اسٹاپ نقصان کی قیمت ((داخلہ قیمت کا 0.95 گنا) پر مبنی ہوتا ہے۔ اس متحرک اسٹاپ نقصان کا ڈیزائن حکمت عملی کی لچک کو بڑھانے کے لئے مختلف مارکیٹ کے حالات کے مطابق موافقت کے قابل بناتا ہے۔

اسٹریٹجک فوائد

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

اسٹریٹجک رسک

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

حکمت عملی کی اصلاح کی سمت

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

خلاصہ کریں۔

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

حکمت عملی کا ماخذ کوڈ
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 1d
basePeriod: 1d
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/
// © Pineify

//======================================================================//
//                    ____  _            _  __                          //
//                   |  _ \(_)_ __   ___(_)/ _|_   _                    //
//                   | |_) | | '_ \ / _ \ | |_| | | |                   //
//                   |  __/| | | | |  __/ |  _| |_| |                   //
//                   |_|   |_|_| |_|\___|_|_|  \__, |                   //
//                                             |___/                    //
//======================================================================//

//@version=5
strategy(title="TQQQ EMA Strategy", overlay=true)

//#region —————————————————————————————————————————————————— Common Dependence

p_comm_time_range_to_unix_time(string time_range, int date_time = time, string timezone = syminfo.timezone) =>
    int start_unix_time = na
    int end_unix_time = na
    int start_time_hour = na
    int start_time_minute = na
    int end_time_hour = na
    int end_time_minute = na
    if str.length(time_range) == 11
        // Format: hh:mm-hh:mm
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 3, 5)))
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 6, 8)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 9, 11)))
    else if str.length(time_range) == 9
        // Format: hhmm-hhmm
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 2, 4)))
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 5, 7)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 7, 9)))
    start_unix_time := timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), start_time_hour, start_time_minute, 0)
    end_unix_time := timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), end_time_hour, end_time_minute, 0)
    [start_unix_time, end_unix_time]

p_comm_time_range_to_start_unix_time(string time_range, int date_time = time, string timezone = syminfo.timezone) =>
    int start_time_hour = na
    int start_time_minute = na
    if str.length(time_range) == 11
        // Format: hh:mm-hh:mm
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 3, 5)))
    else if str.length(time_range) == 9
        // Format: hhmm-hhmm
        start_time_hour := math.floor(str.tonumber(str.substring(time_range, 0, 2)))
        start_time_minute := math.floor(str.tonumber(str.substring(time_range, 2, 4)))
    timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), start_time_hour, start_time_minute, 0)

p_comm_time_range_to_end_unix_time(string time_range, int date_time = time, string timezone = syminfo.timezone) =>
    int end_time_hour = na
    int end_time_minute = na
    if str.length(time_range) == 11
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 6, 8)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 9, 11)))
    else if str.length(time_range) == 9
        end_time_hour := math.floor(str.tonumber(str.substring(time_range, 5, 7)))
        end_time_minute := math.floor(str.tonumber(str.substring(time_range, 7, 9)))
    timestamp(timezone, year(date_time, timezone), month(date_time, timezone), dayofmonth(date_time, timezone), end_time_hour, end_time_minute, 0)

p_comm_timeframe_to_seconds(simple string tf) =>
    float seconds = 0
    tf_lower = str.lower(tf)
    value = str.tonumber(str.substring(tf_lower, 0, str.length(tf_lower) - 1))
    if str.endswith(tf_lower, 's')
        seconds := value
    else if str.endswith(tf_lower, 'd')
        seconds := value * 86400
    else if str.endswith(tf_lower, 'w')
        seconds := value * 604800
    else if str.endswith(tf_lower, 'm')
        seconds := value * 2592000
    else
        seconds := str.tonumber(tf_lower) * 60
    seconds

p_custom_sources() =>
    [open, high, low, close, volume]

//#endregion —————————————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Ta Dependence


//#endregion —————————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Constants

// Input Groups
string P_GP_1      =      ""

//#endregion —————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Inputs

// Default
int p_inp_1        =      input.int(defval=20, title="Fast EMA Length", group=P_GP_1)
int p_inp_2        =      input.int(defval=50, title="Slow EMA Length", group=P_GP_1)
float p_inp_3      =      input.float(defval=1.3, title="Take Profit Price Multiplier", group=P_GP_1, step=0.01)
float p_inp_4      =      input.float(defval=0.95, title="Stop Loss Price Multiplier", group=P_GP_1, step=0.01)


//#endregion ———————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Price Data



//#endregion ———————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Indicators

p_ind_1      =      ta.ema(close, p_inp_1) // Fast EMA
p_ind_2      =      ta.ema(close, p_inp_2) // Slow EMA


//#endregion ———————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Conditions

p_cond_1      =      (ta.crossover(p_ind_1, p_ind_2))


//#endregion ———————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Strategy

// Strategy Order Variables
string p_st_name_1                       =      "Entry"
string p_st_name_2                       =      "Exit"
var float p_st_name_2_tp                 =      na
var bool p_st_name_2_tp_can_drawing      =      true
var float p_st_name_2_sl                 =      na
var bool p_st_name_2_sl_can_drawing      =      true

// Strategy Global
open_trades_number = strategy.opentrades
pre_bar_open_trades_number = na(open_trades_number[1]) ? 0 : open_trades_number[1]
var p_entry_order_id = 1
p_can_place_entry_order() =>
    strategy.equity > 0
get_entry_id_name(int current_order_id, string name) =>
    "[" + str.tostring(current_order_id) + "] " + name
is_entry_order(string order_id, string name) =>
    str.startswith(order_id, "[") and str.endswith(order_id, "] " + name)
get_open_trades_entry_ids() =>
    int p_open_trades_count = strategy.opentrades
    string[] p_entry_ids = array.new_string(0, "")
    if p_open_trades_count > 0
        for i = 0 to p_open_trades_count - 1
            array.push(p_entry_ids, strategy.opentrades.entry_id(i))
    p_entry_ids

// Entry (Entry)
if p_cond_1 and p_can_place_entry_order()
    p_st_name_1_id = get_entry_id_name(p_entry_order_id, p_st_name_1)
    p_entry_order_id := p_entry_order_id + 1
    string entry_message = ""
    strategy.entry(id=p_st_name_1_id, direction=strategy.long, alert_message=entry_message, comment=p_st_name_1_id)
    
    // TP/SL Exit (Exit)
    float p_st_name_2_limit = close * p_inp_3
    if p_st_name_2_tp_can_drawing
        p_st_name_2_tp_can_drawing := false
        p_st_name_2_tp := p_st_name_2_limit
    float p_st_name_2_stop = close * p_inp_4
    if p_st_name_2_sl_can_drawing
        p_st_name_2_sl_can_drawing := false
        p_st_name_2_sl := p_st_name_2_stop
    string p_st_name_2_alert_message = ""
    strategy.exit(id=p_st_name_1_id + "_0", from_entry=p_st_name_1_id, qty_percent=100, limit=p_st_name_2_limit, stop=p_st_name_2_stop, comment_profit=p_st_name_2 + " - TP", comment_loss=p_st_name_2 + " - SL", alert_message=p_st_name_2_alert_message)
    

if high >= p_st_name_2_tp or (pre_bar_open_trades_number > 0 and open_trades_number == 0)
    p_st_name_2_tp_can_drawing := true
    p_st_name_2_sl_can_drawing := true
    p_st_name_2_tp := na
    p_st_name_2_sl := na
plot(p_st_name_2_tp, title="Exit - TP", color=color.rgb(0, 150, 136, 0), linewidth=1, style = plot.style_circles)
if low <= p_st_name_2_sl or (pre_bar_open_trades_number > 0 and open_trades_number == 0)
    p_st_name_2_sl_can_drawing := true
    p_st_name_2_tp_can_drawing := true
    p_st_name_2_sl := na
    p_st_name_2_tp := na
plot(p_st_name_2_sl, title="Exit - SL", color=color.rgb(244, 67, 54, 0), linewidth=1, style = plot.style_circles)
//#endregion —————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Indicator Plots

// Fast EMA
plot(p_ind_1, "Fast EMA", color.rgb(33, 150, 243, 0), 1)

// Slow EMA
plot(p_ind_2, "Slow EMA", color.rgb(255, 82, 82, 0), 1)

//#endregion ————————————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Custom Plots

//#endregion —————————————————————————————————————————————————————————————


//#region —————————————————————————————————————————————————— Alert

//#endregion ——————————————————————————————————————————————————————