کوانٹیٹیو اشارے کے بولش اور بیرش سگنلز پر مبنی دو طرفہ تجارتی حکمت عملی

مصنف:چاؤ ژانگ، تاریخ: 2023-12-13 17:30:13
ٹیگز:

img

جائزہ

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

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

  1. اوپری اور نچلی قیمت چینلز کا تعین کرنے کے لئے ڈونچین قیمت چینل اشارے کا استعمال کریں۔ اوپری چینل کی حساب سب سے زیادہ قیمت اور نچلی چینل کی سب سے کم قیمت سے کی جاتی ہے۔

  2. او بی وی مقداری اشارے اور ای ایم اے اشارے کا استعمال کرتے ہوئے او بی وی آسکیلیٹر بنائیں تاکہ تیزی اور کمی کی طاقت کا تعین کیا جاسکے۔ آسکیلیٹر کی قیمت 0 سے زیادہ ہونے سے ظاہر ہوتا ہے کہ تیزی کی طاقت کمی کی طاقت سے زیادہ ہے اور اس کے برعکس اگر 0 سے کم ہو تو۔

  3. ایک لمبا سگنل اس وقت پیدا ہوتا ہے جب قیمت اوپری چینل کو توڑتی ہے اور آسکیلیٹر 0 سے زیادہ ہوتا ہے۔ ایک مختصر سگنل اس وقت پیدا ہوتا ہے جب قیمت نچلے چینل کو توڑتی ہے اور آسکیلیٹر 0 سے کم ہوتا ہے۔

  4. جب قیمتیں نچلے چینل میں واپس آئیں تو طویل پوزیشنیں بند کریں۔ جب قیمتیں اوپری چینل میں واپس آئیں تو مختصر پوزیشنیں بند کریں۔

حکمت عملی کے فوائد

  1. رجحانات کا تعین کرنے کے لئے قیمتوں کے چینلز کا استعمال اتار چڑھاؤ کی منڈیوں سے گمراہ ہونے سے بچتا ہے۔

  2. تیزی اور کمی کی طاقت کا اندازہ کرنے کے لئے مقداری اشارے شامل کرنے سے یہ یقینی بنتا ہے کہ تجارت کی سمت مارکیٹ کی طاقت کے مطابق ہو۔

  3. دو طرفہ تجارت کو اپنانے سے منافع ملتا ہے چاہے مارکیٹ بڑھتی ہو یا گرتی ہو۔

  4. سٹاپ نقصان کی حکمت عملیوں کا تعین مؤثر طریقے سے خطرات کا انتظام کرتا ہے۔

اسٹریٹجی کے خطرات

  1. قیمتوں کے چینلز کی ناقص پیرامیٹرز کی ترتیب سے چینلز بہت زیادہ لچکدار یا تنگ ہوسکتے ہیں ، تجارتی مواقع سے محروم ہوسکتے ہیں یا غلط سگنل پیدا ہوسکتے ہیں۔

  2. اشارے کے پیرامیٹرز کی غلط ترتیبات بھی تاخیر یا قبل از وقت سگنل کی پیداوار کا باعث بن سکتی ہیں۔

  3. واقعات سے اچانک غیر معمولی غیر مستحکم حرکتیں نقصانات کی قیادت کرنے والے سٹاپ نقصانات کو متحرک کرسکتی ہیں۔

  4. دو طرفہ تجارت کے لئے ایک ساتھ ساتھ طویل اور مختصر پوزیشنوں کا انتظام کرنا ضروری ہے جس سے کام کرنا مشکل ہو جاتا ہے۔

حکمت عملی کی اصلاح کے لئے ہدایات

  1. بہترین مجموعے تلاش کرنے کے لئے قیمت چینل پیرامیٹرز کو بہتر بنائیں.

  2. او بی وی آسکیلیٹر پیرامیٹرز کو جانچنے اور بہتر بنانے کے لئے تاکہ تیزی سے بڑھتی ہوئی / کمی کی طاقت کے بروقت اور درست فیصلے کو یقینی بنایا جاسکے۔

  3. سگنل کی درستگی کو بہتر بنانے کے لئے دیگر اشارے جیسے ایم اے سی ڈی، کے ڈی وغیرہ کو شامل کرنے پر غور کریں۔

  4. مختلف سٹاپ نقصان کے طریقوں کا تجربہ کریں، جیسے ٹریکنگ سٹاپ، فی صد سٹاپ وغیرہ۔

  5. مختلف مصنوعات کا تجربہ کریں تاکہ یہ معلوم ہو سکے کہ کون سی حکمت عملی بہترین ہے۔

خلاصہ

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


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 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/
// © ahancock

//@version=4
strategy(
     title = "Hancock - Filtered Volume OBV OSC [Strategy]",
     initial_capital = 1000,
     overlay = false,
     commission_type = strategy.commission.percent,
     commission_value= 0.075)

// Inputs
source = input(close, title = "Source", type = input.source)

use_volume_filter     = input(true, title = "Use Volume Filter", type = input.bool)
vol_filter_length     = input(20, title = "Volume Filter - Length", type = input.integer, minval = 1)
vol_filter_multiplier = input(1.2, title = "Volume Filter - Multiplier", type = input.float, minval = 0.1, step = 0.1)

use_osc    = input(true, title = "Use Oscillator", type = input.bool)
osc_length = input(40, title = "Oscillator - Signal Length", type = input.integer, minval = 1)

channel_length = input(65, title = "Channel - Slow Length", minval = 5, maxval = 200, step = 5)
channel_percent = input(70, title = "Channel - Fast Length Percent", minval = 5, maxval = 100, step = 5)

trade_both = "Both", trade_long = "Long", trade_short = "Short"
trade_direction       = input("Both", title = "Trade - Direction", options = [trade_both, trade_long, trade_short])
trade_leverage        = input(2, title = "Trade - Leverage", type = input.integer, minval = 1, maxval = 100)
trade_stop            = input(7.5, title = "Trade - Stop Loss %", type = input.float, minval = 0.5, step = 0.5, maxval = 100)
trade_trail_threshold = input(5, title = "Trade - Trail Stop Threshold %", type = input.float, minval = 0.5, step = 0.5, maxval = 100)
trade_trail           = input(5, title = "Trade - Trail Stop Minimum %", type = input.float, minval = 0.5, step = 0.5, maxval = 100)
trade_risk            = input(100, title = "Trade - Risk %", type = input.integer, step = 1, minval = 1, maxval = 100)

test_year   = input(2019, "Test - Year", type = input.integer, minval = 1970, maxval = 2222) 
test_month  = input(01, "Test - Month", type = input.integer, minval = 1, maxval = 12)
test_day    = input(01, "Test - Day", type = input.integer,  minval = 1, maxval = 31)

// Functions
get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)

get_obv(values, filter_length, filter_multiplier, use_filter, osc_length, use_osc) => 
    threshold = abs(avg(volume, filter_length) - (stdev(volume, filter_length) * filter_multiplier))

    obv = 0.0
    if (use_filter and volume < threshold)
        obv := nz(obv[1])
    else
        obv :=  nz(obv[1]) + sign(change(values)) * volume
        
    use_osc ? (obv - ema(obv, osc_length)) : obv

get_dc(high_values, low_values, length) =>

    top = highest(high_values, length)
    bot = lowest(low_values, length)
    mid = bot + ((top - bot) / 2)
    
    [top, mid, bot]

get_dcs(high_values, low_values, length, length_percent) => 
    
    slow_length = length
    fast_length = slow_length * length_percent / 100

    [slow_top, slow_mid, slow_bot] = 
         get_dc(high_values, low_values, slow_length)
         
    [fast_top, fast_mid, fast_bot] = 
         get_dc(high_values, low_values, fast_length)
    
    [slow_top, slow_mid, slow_bot, fast_top, fast_mid, fast_bot]

// Strategy
obv = get_obv(
         source, 
         vol_filter_length, 
         vol_filter_multiplier, 
         use_volume_filter,
         osc_length,
         use_osc)

[slow_top_price, _, slow_bot_price, fast_top_price, _, fast_bot_price] = 
     get_dcs(high, low, channel_length, channel_percent)

[slow_top_obv, _, slow_bot_obv, fast_top_obv, _, fast_bot_obv] = 
     get_dcs(obv, obv, channel_length, channel_percent)

enter_long_price  = high > slow_top_price[1]
exit_long_price   = low  < fast_bot_price[1]
enter_short_price = low  < slow_bot_price[1]
exit_short_price  = high > fast_top_price[1]

enter_long_obv  = obv > slow_top_obv[1] and (use_osc ? obv > 0 : true)
enter_short_obv = obv < fast_bot_obv[1] and (use_osc ? obv < 0 : true)
exit_long_obv   = obv < slow_bot_obv[1]
exit_short_obv  = obv > fast_top_obv[1]

// Trade Conditions
can_trade = true

enter_long_condition = enter_long_obv and enter_long_price
exit_long_condition  = exit_long_obv  and exit_long_price

enter_short_condition = enter_short_obv and enter_short_price 
exit_short_condition  = exit_short_obv  and exit_short_price

position_signal = 0
position_signal := 
     enter_long_condition ? 1 :
     enter_short_condition ? -1 :
     exit_long_condition or exit_short_condition ? 0 :
     position_signal[1]

// Positions
test_time   = timestamp(test_year, test_month, test_day, 0, 0)

if (time >= test_time and strategy.opentrades == 0)
    contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
    
    if (trade_direction == trade_both or trade_direction == trade_long)
        strategy.entry(
             "LONG", 
             strategy.long, 
             qty = contracts,
             when = enter_long_condition)
             
    if (trade_direction == trade_both or trade_direction == trade_short)
        strategy.entry(
             "SHORT", 
             strategy.short, 
             qty = contracts,
             when = enter_short_condition)

in_long  = strategy.position_size > 0
in_short  = strategy.position_size < 0

float long_high = na 
float short_low = na

long_high := in_long ? high >= nz(long_high[1], low) ? high : long_high[1] : na
short_low := in_short ? low <= nz(short_low[1], high) ? low : short_low[1] : na

long_change  = abs(((long_high - strategy.position_avg_price) / strategy.position_avg_price) * 100)
short_change = abs(((short_low - strategy.position_avg_price) / strategy.position_avg_price) * 100)

threshold_difference = (strategy.position_avg_price / trade_leverage) * (trade_trail_threshold / 100)

long_trail_threshold  = in_long ? strategy.position_avg_price + threshold_difference : na
short_trail_threshold = in_short ? strategy.position_avg_price - threshold_difference : na

long_trail = in_long and long_high > long_trail_threshold ? 
     long_high - (long_high / trade_leverage) * (trade_trail / 100) : na
short_trail = in_short and short_low < short_trail_threshold ? 
     short_low + (short_low / trade_leverage) * (trade_trail / 100) : na

stop_difference = (strategy.position_avg_price / trade_leverage) * (trade_stop / 100)

long_stop  = in_long ? long_high > long_trail_threshold ? long_trail : strategy.position_avg_price - stop_difference : na
short_stop = in_short ? short_low < short_trail_threshold ? short_trail : strategy.position_avg_price + stop_difference : na

strategy.exit("S/L", "LONG",
     stop = long_stop,
     qty = abs(get_round(strategy.position_size, 4)))
         
strategy.exit("S/L", "SHORT", 
     stop = short_stop, 
     qty = abs(get_round(strategy.position_size, 4)))

strategy.close_all(when = abs(change(position_signal)) > 0)

// Plots
plotshape(enter_long_condition, "Enter Long", shape.diamond, location.top, color.green)
plotshape(exit_long_condition, "Exit Long", shape.diamond, location.top, color.red)

plotshape(enter_short_condition, "Enter Short", shape.diamond, location.bottom, color.green)
plotshape(exit_short_condition, "Exit Short", shape.diamond, location.bottom, color.red)

color_green = #63b987
color_red   = #eb3d5c

hline(use_osc ? 0 : na)
plot(use_osc ? obv : na, color = color.silver, style = plot.style_area, transp = 90)
plot(obv, color = color.white, style = plot.style_line, linewidth = 2, transp = 0)

plot_slow_top = plot(slow_top_obv, color = color_green, linewidth = 2, transp = 60)
plot_slow_bot = plot(slow_bot_obv, color = color_green, linewidth = 2, transp = 60)
fill(plot_slow_top, plot_slow_bot, color = color_green, transp = 90)

plot_fast_top = plot(fast_top_obv, color = color_red, linewidth = 2, transp = 60)
plot_fast_bot = plot(fast_bot_obv, color = color_red, linewidth = 2, transp = 60)
fill(plot_fast_top, plot_fast_bot, color = color_red, transp = 90)





مزید