यह रणनीति डोनचेन प्राइस चैनल इंडिकेटर और दो-दिशात्मक ट्रेडिंग के लिए ओबीवी ऑसिलेटर मात्रात्मक सूचक द्वारा उत्पन्न तेजी और गिरावट संकेतों पर आधारित है। यह मूल्य चैनल सूचक का उपयोग मूल्य ब्रेकआउट और पॉलबैक का न्याय करने के लिए करता है, जो तेजी और गिरावट की ताकत निर्धारित करने के लिए मात्रात्मक संकेतकों के साथ संयुक्त है, व्यापार संकेत उत्पन्न करने के लिए।
ऊपरी और निचले मूल्य चैनलों को निर्धारित करने के लिए Donchain मूल्य चैनल संकेतक का उपयोग करें। ऊपरी चैनल की गणना उच्चतम मूल्य से और निचले चैनल की गणना सबसे कम मूल्य से की जाती है।
तेजी और मंदी की ताकत निर्धारित करने के लिए OBV मात्रात्मक संकेतक और EMA संकेतक का उपयोग करके OBV ऑसिलेटर का निर्माण करें। 0 से अधिक ऑसिलेटर मान तेजी की ताकत मंदी की ताकत से अधिक है और इसके विपरीत यदि 0 से कम है, तो संकेत देता है।
एक लंबा संकेत तब उत्पन्न होता है जब कीमत ऊपरी चैनल के माध्यम से टूटती है और ऑसिलेटर 0 से अधिक होता है; एक छोटा संकेत तब उत्पन्न होता है जब कीमत निचले चैनल के माध्यम से टूटती है और ऑसिलेटर 0 से कम होता है।
जब कीमतें निचले चैनल में वापस खींचती हैं तो लंबी पोजीशन बंद करें; जब कीमतें ऊपरी चैनल में वापस खींचती हैं तो शॉर्ट पोजीशन बंद करें।
रुझानों को निर्धारित करने के लिए मूल्य चैनलों का उपयोग करने से उतार-चढ़ाव वाले बाजारों से भटकने से बचा जाता है।
तेजी और गिरावट की ताकत का आकलन करने के लिए मात्रात्मक संकेतकों को शामिल करने से यह सुनिश्चित होता है कि व्यापार की दिशा बाजार की ताकत के अनुरूप हो।
दो-दिशात्मक व्यापार को अपनाने से लाभ हो सकता है चाहे बाजार बढ़े या गिर जाए।
स्टॉप लॉस रणनीतियों को स्थापित करने से जोखिम प्रभावी ढंग से प्रबंधित होते हैं।
मूल्य चैनलों की अनुचित पैरामीटर सेटिंग से बहुत ढीले या संकीर्ण चैनल हो सकते हैं, व्यापार के अवसरों को खो सकते हैं या गलत संकेत उत्पन्न कर सकते हैं।
संकेतकों के पैरामीटर की अनुचित सेटिंग भी देरी या समय से पहले सिग्नल उत्पन्न करने का कारण बन सकती है।
घटनाओं से अचानक असामान्य अस्थिर चाल स्टॉप लॉस को ट्रिगर कर सकती है जिससे नुकसान हो सकता है।
दो-दिशात्मक व्यापार के लिए एक साथ लंबी और छोटी दोनों स्थिति का प्रबंधन करना आवश्यक होता है जिससे संचालित करना अधिक कठिन हो जाता है।
इष्टतम संयोजन खोजने के लिए मूल्य चैनल मापदंडों का अनुकूलन करें।
उछाल/बियर शक्ति के समय पर और सटीक निर्णय सुनिश्चित करने के लिए OBV ऑसिलेटर मापदंडों का परीक्षण और अनुकूलन करें।
संकेत की सटीकता में सुधार के लिए अन्य संकेतकों जैसे एमएसीडी, केडी आदि को शामिल करने पर विचार करें।
विभिन्न स्टॉप लॉस विधियों का परीक्षण करें जैसे ट्रैकिंग स्टॉप, प्रतिशत स्टॉप आदि।
विभिन्न उत्पादों का परीक्षण करें ताकि यह पता लगाया जा सके कि कौन सी रणनीति सबसे उपयुक्त है।
कुल मिलाकर यह एक स्पष्ट, समझने में आसान दो-दिशात्मक ट्रेडिंग रणनीति है जिसमें मूल्य कार्रवाई और बाजार के रुझानों और ताकत को निर्धारित करने के लिए मात्रात्मक संकेतक शामिल हैं। स्थिरता और लाभप्रदता में और सुधार के लिए पैरामीटर ट्यूनिंग और संकेतक संयोजन के माध्यम से अनुकूलन के लिए भी पर्याप्त जगह है।
/*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)