बोलिंगर बैंड एटीआर ट्रेलिंग स्टॉप रणनीति

लेखक:चाओझांग, दिनांकः 2024-01-03 11:20:06
टैगः

img

अवलोकन

यह रणनीति बोलिंगर बैंड्स सूचक और औसत सच्ची रेंज (एटीआर) सूचक को एक ब्रेकआउट ट्रेडिंग रणनीति बनाने के लिए एक ट्रेलिंग स्टॉप लॉस फ़ंक्शन के साथ जोड़ती है। ट्रेडिंग सिग्नल तब उत्पन्न होते हैं जब कीमतें निर्दिष्ट मानक विचलन के बोलिंगर बैंड्स को तोड़ती हैं। साथ ही, एटीआर सूचक का उपयोग स्टॉप लॉस की गणना करने और जोखिम / पुरस्कार अनुपात को नियंत्रित करने के लिए लाभ लेने के लिए किया जाता है। इसके अलावा, रणनीति में समय फ़िल्टर और पैरामीटर अनुकूलन जैसी विशेषताएं भी हैं।

रणनीति तर्क

चरण 1, मध्य बैंड, ऊपरी बैंड और निचले बैंड की गणना करें। मध्य बैंड कीमत का सरल चलती औसत (एसएमए) है, और ऊपरी और निचले बैंड मूल्य मानक विचलन के गुणक हैं। जब कीमत निचले बैंड से ऊपर की ओर टूटती है, तो लंबी हो जाती है। जब कीमत ऊपरी बैंड से नीचे की ओर टूटती है, तो छोटी हो जाती है।

चरण 2, एटीआर संकेतक की गणना करें। एटीआर संकेतक मूल्य की औसत अस्थिरता को दर्शाता है। एटीआर मूल्य के अनुसार, लंबी स्थिति और छोटी स्थिति के लिए स्टॉप लॉस सेट करें। साथ ही, जोखिम/लाभ अनुपात को नियंत्रित करने के लिए एटीआर मूल्य के आधार पर लाभ लेने की स्थिति सेट करें।

चरण 3, प्रमुख समाचार घटनाओं से भारी उतार-चढ़ाव से बचने के लिए केवल निर्दिष्ट समय अवधि में व्यापार करने के लिए समय फ़िल्टर का उपयोग करें।

चरण 4, ट्रैलिंग स्टॉप तंत्र। अधिक लाभ में लॉक करने के लिए नवीनतम एटीआर स्थिति के आधार पर स्टॉप हानि को समायोजित करना जारी रखें।

लाभ विश्लेषण

  1. बोलिंगर बैंड स्वयं एकल चलती औसत की तुलना में मूल्य संतुलन को अधिक प्रभावी ढंग से दर्शाता है;

  2. एटीआर स्टॉप लॉस प्रत्येक व्यापार के जोखिम/लाभ अनुपात को नियंत्रित करता है;

  3. लाभ में लॉक करने के लिए बाजार की अस्थिरता के आधार पर स्वचालित रूप से अनुवर्ती स्टॉप को समायोजित करता है;

  4. प्रचुर मात्रा में रणनीति मापदंड उच्च अनुकूलन क्षमता को सक्षम करते हैं।

जोखिम विश्लेषण

  1. जब बाजार समेकित होता है तो कई छोटे नुकसान हो सकते हैं;

  2. बोलिंगर बैंड क्रॉसओवर के साथ असफल ब्रेकआउट रिवर्स;

  3. रात भर के सत्रों और प्रमुख समाचार घटनाओं से जुड़े उच्च जोखिम।

प्रतिरोधात्मक उपाय:

  1. जोखिम प्रबंधन के सिद्धांतों का सख्ती से पालन करें, प्रति व्यापार हानि को नियंत्रित करें;
  2. जीत दर में सुधार के लिए मापदंडों का अनुकूलन;
  3. उच्च जोखिम वाले समय से बचने के लिए समय फ़िल्टर लगाएं।

अनुकूलन दिशाएँ

  1. विभिन्न पैरामीटर संयोजनों का परीक्षण करें;
  2. OBV जैसे समय संकेतक जोड़ें;
  3. मशीन लर्निंग मॉडल को शामिल करें।

निष्कर्ष

यह रणनीति ट्रेंड संतुलन और ब्रेकआउट दिशाओं को निर्धारित करने के लिए बोलिंगर बैंड, एटीआर को संयोजित करती है जोखिम / पुरस्कार अनुपात को नियंत्रित करने के लिए स्टॉप लॉस और लाभ लेने की गणना करने के लिए, और लाभ में लॉक करने के लिए ट्रेलिंग स्टॉप। इसके फायदे उच्च अनुकूलनशीलता, नियंत्रित जोखिम और अल्पकालिक इंट्राडे ट्रेडिंग के लिए उपयुक्तता में निहित हैं। पैरामीटर अनुकूलन और मशीन लर्निंग के माध्यम से जीत दर और लाभप्रदता में और सुधार हासिल किया जा सकता है।


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 1m
basePeriod: 1m
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/
// © sadeq_haddadi

//@version=5

strategy('Bollinger Bands + ATR / trail- V2', overlay=true ) // Interactive Brokers rate)



//date and time
startDate   = input(title="Start Date", defval=timestamp("01 Aug 2023 00:00 +0000"), tooltip="Date & time to begin analysis",group = 'Time Filter')
endDate     = input(title="End Date", defval=timestamp("1 Jan 2099 00:00 +0000"), tooltip="Date & time to stop analysis")
timeSession = input(title="Time Session To Analyze", defval="0300-1700", tooltip="Time session to analyze")
inSession(sess) => true

// indicators 

length = input.int(20, minval=1,group = 'Bollinger Band')
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
src = input(close, title="Source")
mult1 = input.float(2.0, minval=0.001, maxval=50, title="StdDev1")
mult2 = input.float(3.0, minval=0.001, maxval=50, title="StdDev2")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev1 = mult1 * ta.stdev(src, length)
dev2 = mult2 * ta.stdev(src, length)
upper1 = basis + dev1
lower1 = basis - dev1
upper2 = basis + dev2
lower2 = basis - dev2
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#2962FF, offset = offset,linewidth=2)
p1 = plot(upper1, "Upper", color=color.new(color.white,50), offset = offset,linewidth=2)
p2 = plot(lower1, "Lower", color=color.new(color.white,50), offset = offset,linewidth=2)
p3 = plot(upper2, "Upper", color=color.new(color.white,80), offset = offset,linewidth=1)
p4 = plot(lower2, "Lower", color=color.new(color.white,80), offset = offset,linewidth=1)

fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
fill(p3, p4, title = "Background", color=color.rgb(33, 150, 243, 95))

show_crosses = input(false, "Show Cross the Bands?")

plotshape(show_crosses and ta.crossover(close, upper2)  ? src : na, "S", style = shape.triangledown, location =location.abovebar, color = color.yellow, size = size.tiny)
plotshape(show_crosses and ta.crossunder(low, lower2) ? src : na ,"L", style = shape.triangleup, location =  location.belowbar, color = color.purple, size = size.tiny)

second_entry = input(true, "Show second deviation entry point?")

//atr

length_ATR = input.int(title="Length", defval=5, minval=1,group = 'ATR')
smoothing = input.string(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
m = input.float(1, "Multiplier")
src1 = input(high)
src2 = input(low)
pline = input.bool(title = 'show ATR lines ?', defval=false)



ma_function(source, length_ATR) =>
	if smoothing == "RMA"
		ta.rma(source, length_ATR)
	else
		if smoothing == "SMA"
			ta.sma(source, length_ATR)
		else
			if smoothing == "EMA"
				ta.ema(source, length_ATR)
			else
				ta.wma(source, length_ATR)
				
a = ma_function(ta.tr(true), length_ATR) * m
x = ma_function(ta.tr(true), length_ATR) * m + src1
x2 = src2 - ma_function(ta.tr(true), length_ATR) * m

PP1 = plot(pline ? x :na , title = "ATR Short Stop Loss", color= color.new(color.red,20) )
PP2 = plot(pline ? x2:na , title = "ATR Long Stop Loss",  color=color.new(color.green,20) )

Tp_to_Sl = input.float(1.5, "TP/SL")
candle_size =  input.float(10, "candle/pip")
distance_source =  input.float(1.5, "distance to midline/pip")
//strategy

buyCondition = low[2] < lower1 and  ta.crossover(close[1], lower1)  and strategy.position_size == 0 and (close[1] - open[1]) < candle_size * 0.0001 and close > open and ( basis - close) > distance_source * 0.0001

sellCondition = high[2] > upper1 and ta.crossunder(close[1], upper1)  and strategy.position_size == 0 and (open[1] - close[1]) < candle_size * 0.0001 and close < open  and (close - basis) > distance_source * 0.0001
//
buyCondition2 = low[2] < lower2 and  ta.crossover(close[1], lower2)  and (close[1] - open[1]) < candle_size * 0.0001 and close > open and ( basis - close) > distance_source * 0.0001
sellCondition2 = high[2] > upper2 and ta.crossunder(close[1], upper2)   and (open[1] - close[1]) < candle_size * 0.0001 and close < open  and (close - basis) > distance_source * 0.0001

plotshape(second_entry and  sellCondition2 ? src : na, "S", style = shape.triangledown, location =location.abovebar, color = color.rgb(241, 153, 177), size = size.tiny)
plotshape(second_entry and buyCondition2 ? src : na ,"L", style = shape.triangleup, location =  location.belowbar, color = color.rgb(177, 230, 168), size = size.tiny)
//
since_buy  =ta.barssince(buyCondition)
since_sell =ta.barssince(sellCondition)
entry_price = ta.valuewhen(buyCondition or sellCondition, src, 0)

sl_long = ta.valuewhen(buyCondition, x2[1], 0)
sl_short = ta.valuewhen(sellCondition, x[1], 0)
buyprofit = entry_price + (Tp_to_Sl*( entry_price - sl_long))
sellprofit= entry_price + (Tp_to_Sl*( entry_price - sl_short))

//alert_massage = "new strategy position is {{strategy.position_size}}"
//prof = ta.crossover(high,upper1)
//buyexit=ta.valuewhen(prof,upper1,0)

if buyCondition and inSession(timeSession)

    strategy.entry( id = "long", direction = strategy.long , alert_message='Open Long Position' )

if sellCondition and inSession(timeSession)
   
    strategy.entry(id= "short", direction = strategy.short, alert_message='Open Short Position')

//trail-stop loss
use_trailing = input.bool(title = 'use trailing stop loss?', defval=true)
pricestop_long=0.00
pricestop_short=100000.00
if (strategy.position_size > 0)
   
    if use_trailing == false
        pricestop_long := sl_long
    else
        pricestop_long := math.max (x2, pricestop_long[1]) //trail - long

if (strategy.position_size < 0)
   
    if use_trailing == false
        pricestop_short := sl_short
    else
        pricestop_short := math.min (x, pricestop_short[1])  // trail - short 

if strategy.position_size > 0 
   
    strategy.exit(id = 'close', limit =  buyprofit , stop = pricestop_long  )

if strategy.position_size < 0 

    strategy.exit(id = 'close', limit = sellprofit  , stop = pricestop_short  )

alertcondition(buyCondition or sellCondition, 'Enter_position')



अधिक