গড় বিপরীতমুখী লাইন কৌশল হল চলমান গড় বিপরীতমুখী উপর ভিত্তি করে একটি স্বল্পমেয়াদী ট্রেডিং কৌশল। এটি বোলিংজার ব্যান্ড, আরএসআই, সিসিআই এবং অন্যান্য সূচকগুলি সংযুক্ত করে স্বল্পমেয়াদী বাজারের ওঠানামা ক্যাপচার করে এবং কম কেনার এবং উচ্চ বিক্রয় করার লক্ষ্য অর্জন করে।
কৌশলটি মূলত স্টক সূচক, ফরেক্স এবং মূল্যবান ধাতুগুলির মতো অত্যন্ত তরল পণ্যগুলির জন্য ব্যবহৃত হয়। এটি ব্যবসায়ের সামগ্রিক ঝুঁকি-ফেরত অনুপাত নিয়ন্ত্রণ করার সময় প্রতি বাণিজ্যে লাভের সর্বাধিকীকরণকে অনুসরণ করে।
দামের বিচ্যুতি অঞ্চলগুলি বিচার করার জন্য বোলিংজার ব্যান্ডগুলি ব্যবহার করুন। যখন দাম উপরের বোলিংজার ব্যান্ডের কাছে আসে তখন শর্ট যেতে বিবেচনা করুন এবং যখন দাম নীচের বোলিংজার ব্যান্ডের কাছে আসে তখন দীর্ঘ যেতে বিবেচনা করুন।
অতিরিক্ত ক্রয় এবং অতিরিক্ত বিক্রয় পরিস্থিতি নির্ধারণের জন্য RSI সূচককে একত্রিত করুন। RSI সূচক কার্যকরভাবে অতিরিক্ত ক্রয় এবং অতিরিক্ত বিক্রয় পরিস্থিতি সনাক্ত করতে পারে।
মূল্য বিপরীতমুখী সংকেত নির্ধারণের জন্য সিসিআই সূচক ব্যবহার করুন। সিসিআই সূচক অস্বাভাবিকতার প্রতি তুলনামূলকভাবে সংবেদনশীল এবং মূল্য বিপরীতমুখী সুযোগগুলি কার্যকরভাবে ক্যাপচার করতে পারে।
যখন দাম 5 দিনের চলমান গড়ের উপরে ভেঙে যায় তখন দীর্ঘ যান এবং যখন এটি নীচে ভেঙে যায় তখন সংক্ষিপ্ত যান। চলমান গড়ের অবস্থান বর্তমান মূল মূল্য পরিসীমা উপস্থাপন করে এবং দাম এবং চলমান গড়ের মধ্যে সম্পর্ক সম্ভাব্য প্রবণতা পরিবর্তনগুলি প্রতিফলিত করে।
এন্ট্রি সিগন্যাল নিশ্চিত হওয়ার পর, মুনাফা নেওয়ার জন্য দ্রুত অবস্থানটি বন্ধ করুন। উচ্চ জয় হার উপলব্ধি করার জন্য পুনরুদ্ধারের ভিত্তিতে স্টপ লস সেট করুন।
গড় রিভার্সন লাইন কৌশলটি বোলিংজার ব্যান্ড, আরএসআই, সিসিআই এবং অন্যান্য সূচককে একত্রিত করে। এই সূচকগুলি মূল্য পরিবর্তনের জন্য বেশ সংবেদনশীল এবং তাদের সমন্বয় সংকেত নির্ভুলতা উন্নত করতে এবং মিথ্যা সংকেত হ্রাস করতে পারে।
এই কৌশলটির জন্য একক সূচক দ্বারা বিভ্রান্তি এড়াতে সিঙ্ক্রোন সূচক সংকেত এবং দামের প্রয়োজন। এর সাথে সম্পর্কিত ঝুঁকি হ্রাস করার জন্য এটি স্পষ্ট মূল্য বিপরীতের প্রয়োজন।
দীর্ঘ বা সংক্ষিপ্ত যাই হোক না কেন, কৌশলটি তুলনামূলকভাবে কঠোর স্টপ লস লাইন সেট করবে। একবার দামটি একটি অনুপযুক্ত দিকের স্টপ লস লাইনটি ভেঙে গেলে, কৌশলটি প্রতি বাণিজ্যে বড় ক্ষতি এড়াতে দ্রুত ক্ষতি বন্ধ করবে।
কৌশলটি ধাপে ধাপে লাভ অর্জনের জন্য দুটি লাভের লক্ষ্য নির্ধারণ করবে। একই সাথে, লাভ নেওয়ার পরে, এটি প্রতি বাণিজ্যে লাভের স্থান প্রসারিত করতে ছোট ধাপের সমন্বয় ট্র্যাকিং স্টপ লস ব্যবহার করবে।
চরম দামের ওঠানামা হলে, স্টপ লস লাইনটি ভেঙে যেতে পারে, যা অপ্রয়োজনীয় ক্ষতির কারণ হতে পারে। এই জাতীয় পরিস্থিতি সাধারণত বড় ইভেন্টগুলির কারণে অস্বাভাবিক মূল্য আন্দোলনের সময় ঘটে।
স্টপ লস রেঞ্জ বাড়িয়ে এবং বড় ইভেন্টের সময় অপারেশন এড়ানো এই ঝুঁকি কমাতে পারে।
যখন উর্ধ্বমুখী প্রবণতা খুব তীব্র হয়, তখন দামগুলি প্রায়শই সময়মতো বিপরীত হওয়ার জন্য খুব দ্রুত বৃদ্ধি পায়। এই ক্ষেত্রে ধারাবাহিকভাবে শর্ট যাওয়ার ফলে উর্ধ্বমুখী প্রবণতা অনুসরণ করার ঝুঁকি থাকতে পারে।
এই ক্ষেত্রে সাময়িকভাবে অপেক্ষা করা ভাল, এবং আপগ্রেডের গতি উল্লেখযোগ্যভাবে দুর্বল হওয়ার পরই শর্ট নেওয়ার কথা বিবেচনা করা ভাল।
ব্যাকটেস্টের ফলাফলগুলি সর্বোত্তম পরামিতিগুলি নির্বাচন করতে বিভিন্ন পরামিতি সংমিশ্রণের অধীনে পরীক্ষা করা যেতে পারে। উদাহরণস্বরূপ, আরএসআই পরামিতি, সিসিআই পরামিতিগুলি অনুকূলিত করা যেতে পারে।
ট্রেডিং ভলিউম বা বোলিংজার ব্যান্ডউইথের মতো ভলিউম সূচক যোগ করা যেতে পারে। যখন দামগুলি কেবলমাত্র সামান্য সামঞ্জস্য করে তখন এটি মিথ্যা সংকেত তৈরি করা এড়াতে পারে।
ট্রেড প্রতি মুনাফা সর্বাধিক করার জন্য বিভিন্ন মুনাফা গ্রহণ এবং স্টপ লস পয়েন্ট পরীক্ষা করা যেতে পারে। একই সময়ে, স্টপ লসকে সহজেই ট্রিগার করা থেকে রোধ করার জন্য ঝুঁকিগুলিও ভারসাম্যপূর্ণ করা উচিত।
গড় বিপরীতমুখী রেখা কৌশল ব্যাপকভাবে একাধিক সূচক রায় ব্যবহার করে এবং সঠিক সংকেত, শব্দ অপারেশন, এবং নিয়ন্ত্রণযোগ্য ঝুঁকি বৈশিষ্ট্য আছে। এটি বাজারের পরিবর্তনগুলির জন্য অত্যন্ত সংবেদনশীল এবং তুলনামূলকভাবে শক্তিশালী তরলতা আছে এমন পণ্যগুলির জন্য উপযুক্ত। এটি কম কেনা এবং উচ্চ বিক্রি করার লক্ষ্য অর্জনের জন্য বোলিংজার ব্যান্ড এবং মূল চলমান গড়ের মধ্যে মূল্য বিপরীতমুখী সুযোগগুলি ক্যাপচার করতে পারে।
ব্যবহারিক প্রয়োগে, প্রকৃত বিপরীতমুখী সময় নির্ধারণের জন্য ভলিউম সূচকগুলি একত্রিত করার সময়, সূচক পরামিতিগুলির অপ্টিমাইজেশানকে এখনও মনোযোগ দেওয়া উচিত। অতিরিক্তভাবে, চরম মূল্যের ওঠানামাগুলির বিরুদ্ধে সঠিক ঝুঁকি ব্যবস্থাপনা নেওয়া উচিত। যদি সঠিকভাবে ব্যবহার করা হয় তবে এই কৌশলটি অপেক্ষাকৃত স্থিতিশীল আলফা রিটার্ন অর্জন করতে পারে।
/*backtest start: 2022-12-22 00:00:00 end: 2023-12-28 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/ // © sg1999 //@version=4 // >>>>>strategy name strategy(title = "CCI-RSI MR", shorttitle = "CCI-RSI MR", overlay = true) // >>>>input variables // 1. risk per trade as % of initial capital risk_limit = input(title="Risk Limit (%)", type=input.float, minval=0.1, defval=2.0, step=0.1) // 2. drawdown Draw_down = input(title="Max Drawdown (x ATR)", type=input.float, minval=0.5, maxval=10, defval=2.0, step=0.1) // 3. type of stop loss to be used original_sl_type = input(title="SL Based on", defval="Close Price", options=["Close Price","Last Traded Price"]) // 4. entry signal validity for bollinger strategies dist_from_signal= input(title="Entry distance from signal", type=input.integer, minval=1, maxval=20, defval=3, step=1) // 5. multiple exit points exit_1_pft_pct = input(title="1st exit when reward is", type=input.float, minval=0.5, maxval=100, defval=1.0, step=0.1) exit_1_qty_pct = input(title="1st exit quantity %", type=input.float, minval=1, maxval=100, defval=100, step=5) exit_2_pft_pct = input(title="2nd exit when reward is", type=input.float, minval=0.5, maxval=100, defval=1.5, step=0.1) sl_trail_pct = input(title="Trailing SL compared to original SL", type=input.float, minval=0.5, maxval=100, defval=0.5, step=0.5) //show signal bool plotBB = input(title="Show BB", type=input.bool, defval=true) plotSignals = input(title="Show Signals", type=input.bool, defval=true) // 6. date range to be used for backtesting fromMonth = input(defval = 1, title = "From Month", type = input.integer, minval = 1, maxval = 12) fromDay = input(defval = 1, title = "From Day", type = input.integer, minval = 1, maxval = 31) fromYear = input(defval = 1990, title = "From Year", type = input.integer, minval = 1970) thruMonth = input(defval = 1, title = "Thru Month", type = input.integer, minval = 1, maxval = 12) thruDay = input(defval = 1, title = "Thru Day", type = input.integer, minval = 1, maxval = 31) thruYear = input(defval = 2022, title = "Thru Year", type = input.integer, minval = 1970) start = timestamp(fromYear, fromMonth, fromDay, 00, 00) // backtest start window finish = timestamp(thruYear, thruMonth, thruDay, 23, 59) // backtest finish window window() => true // >>>>>strategy variables //input variables current_high = highest(high, 5) // swing high (5 period) current_low = lowest(low, 5) // swing low (5 period) current_ma = sma(close, 5) // Simple Moving average (5 period) atr_length = atr(20) // ATR (20 period) CCI = cci(close,20) // CCI (20 period) RSI = rsi(close,14) // RSI (14 period) RSI_5 = sma (RSI, 5) // Simple moving average of RSI (5 period) // 1. for current candle long_entry = false short_entry = false risk_reward_ok = false sl_hit_flag = false tsl_hit_flag = false sl_cross = false // 2. across candles var RSI_short = false //short signal boolean var RSI_long = false //long signal boolean var cci_sell = false //sellsignal crossunder boolean var cci_buy = false //buy signal crossover boolean var bar_count_long = 0 // Number of bars after a long signal var bar_count_short = 0 // Number of bars after a short signal var candles_on_trade = 0 var entry_price = 0.00 var sl_price = 0.00 var qty = 0 var exit_1_qty = 0 var exit_2_qty = 0 var exit_1_price = 0.0 var exit_2_price = 0.0 var hold_high = 0.0 // variable used to calculate Trailing sl var hold_low = 0.0 // variable used to calculate Trailing sl var tsl_size = 0.0 // Trailing Stop loss size(xR) var sl_size = 0.0 // Stop loss size (R) var tsl_price = 0.0 //Trailing stoploss price // >>>>>strategy conditions. // Bollinger bands (2 std) [mBB0,uBB0,lBB0] = bb(close,20,2) uBB0_low= lowest(uBB0,3) // lowest among upper BB of past 3 periods lBB0_high= highest(lBB0,3) //highest among upper BB of past 3 periods //RSI and CCI may not necessarily crossunder on the same candle t_sell_RSI = sum( crossunder(RSI,RSI_5)? 1 : 0, 2) == 1 // checks if crossunder has happened in the last 3 candles (including the current candle) t_sell_CCI = sum( crossunder(CCI,100)? 1 : 0, 2) == 1 //and (CCI >50) t_buy_RSI = sum( crossover(RSI,RSI_5)? 1 : 0, 2) == 1 //checks if crossover has happened in the last 3 candles (including the current candle) t_buy_CCI = sum( crossover(CCI,-100) ? 1 : 0, 2) == 1 //and (CCI<-50) // CONDITIONS FOR A SELL signal if t_sell_RSI and t_sell_CCI and (current_high >= uBB0_low) cci_sell := true bar_count_short := 0 if cci_sell and strategy.position_size ==0 bar_count_short := bar_count_short + 1 if cci_sell and bar_count_short<= dist_from_signal and close <= current_ma and strategy.position_size ==0 RSI_short := true //conditions for a BUY signal if t_buy_RSI and t_buy_CCI and (current_low <= lBB0_high) // or current_low_close <= lBB01_high) cci_buy := true bar_count_long := 0 if cci_buy and strategy.position_size ==0 bar_count_long := bar_count_long + 1 if cci_buy and bar_count_long<= dist_from_signal and close >= current_ma and strategy.position_size ==0 RSI_long := true if RSI_long and RSI_short RSI_long := false RSI_short := false // >>>>>entry and target specifications if strategy.position_size == 0 and RSI_short short_entry := true entry_price := close sl_price := current_high + syminfo.mintick // (swing high + one tick) is the stop loss sl_size := abs(entry_price - sl_price) candles_on_trade := 0 tsl_size := abs(entry_price - sl_price)*sl_trail_pct // Here sl_trail_pct is the multiple of R which is used to calculate TSL size if strategy.position_size == 0 and RSI_long long_entry := true entry_price := close sl_price := current_low - syminfo.mintick //(swing low - one tick) is the stop loss candles_on_trade := 0 sl_size := abs(entry_price - sl_price) tsl_size := abs(entry_price - sl_price)*sl_trail_pct // Here sl_trail_pct is the multiple of R which is used to calculate TSL size if long_entry and short_entry long_entry := false short_entry := false // >>>>risk evaluation criteria //>>>>> quantity determination and exit point specifications. if (long_entry or short_entry) and strategy.position_size == 0 // Based on our risk (R), no.of lots is calculated by considering a risk per trade limit formula qty := round((strategy.equity) * (risk_limit/100)/(abs(entry_price - sl_price)*syminfo.pointvalue)) exit_1_qty := round(qty * (exit_1_qty_pct/100)) exit_2_qty := qty - (exit_1_qty) if long_entry exit_1_price := entry_price + (sl_size * exit_1_pft_pct) exit_2_price := entry_price + (sl_size * exit_2_pft_pct) if short_entry exit_1_price := entry_price - (sl_size * exit_1_pft_pct) exit_2_price := entry_price - (sl_size * exit_2_pft_pct) // trail SL after 1st target is hit if abs(strategy.position_size) == 0 hold_high := 0 hold_low := 0 if strategy.position_size > 0 and high > exit_1_price if high > hold_high or hold_high == 0 hold_high := high tsl_price := hold_high - tsl_size if strategy.position_size < 0 and low < exit_1_price if low < hold_low or hold_low == 0 hold_low := low tsl_price := hold_low + tsl_size //>>>> entry conditons if long_entry and strategy.position_size == 0 strategy.cancel("BUY", window()) // add another window condition which considers day time (working hours) strategy.order("BUY", strategy.long, qty, comment="BUY @ "+ tostring(entry_price),when=window()) if short_entry and strategy.position_size == 0 strategy.cancel("SELL", window()) // add another window condition which considers day time (working hours) strategy.order("SELL", strategy.short, qty, comment="SELL @ "+ tostring(entry_price),when=window()) //>>>> exit conditons tsl_hit_flag := false //exit at tsl if strategy.position_size > 0 and close < tsl_price and abs(strategy.position_size)!=qty strategy.order("EXIT at TSL", strategy.short, abs(strategy.position_size), comment="EXIT TSL @ "+ tostring(close)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 tsl_hit_flag := true cci_sell := false cci_buy := false strategy.cancel("EXIT 1", true) strategy.cancel("EXIT 2", true) strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at SL",true) if strategy.position_size < 0 and close > tsl_price and abs(strategy.position_size)!=qty strategy.order("EXIT at TSL", strategy.long, abs(strategy.position_size), comment="EXIT TSL @ "+ tostring(close)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 tsl_hit_flag := true cci_sell := false cci_buy := false strategy.cancel("EXIT 1", true) strategy.cancel("EXIT 2", true) strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at SL",true) //>>>>exit at sl if strategy.position_size > 0 and original_sl_type == "Close Price" and close < sl_price and abs(strategy.position_size)==qty strategy.cancel("EXIT at SL", true) strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size),stop= sl_price, comment="EXIT SL @ "+ tostring(close)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false sl_hit_flag := true strategy.cancel("EXIT 1", true) strategy.cancel("EXIT 2", true) strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at TSL",true) if strategy.position_size < 0 and original_sl_type == "Close Price" and close > sl_price and abs(strategy.position_size)==qty strategy.cancel("EXIT at SL", true) strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop = sl_price, comment="EXIT SL @ "+ tostring(close)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false sl_hit_flag := true strategy.cancel("EXIT 1", true) strategy.cancel("EXIT 2", true) strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at TSL",true) //>>>>>for ltp sl setting if strategy.position_size > 0 and original_sl_type == "Last Traded Price" and abs(strategy.position_size) ==qty strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size),stop= sl_price, comment="EXIT SL @ "+ tostring(close)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false strategy.cancel("EXIT 1", true) strategy.cancel("EXIT 2", true) strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at TSL",true) if strategy.position_size < 0 and original_sl_type == "Last Traded Price" and abs(strategy.position_size) ==qty strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop = sl_price, comment="EXIT SL @ "+ tostring(close)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false strategy.cancel("EXIT 1", true) strategy.cancel("EXIT 2", true) strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at TSL",true) //>>>>>exit at target if strategy.position_size > 0 and abs(strategy.position_size) == qty and not tsl_hit_flag strategy.order("EXIT 1", strategy.short, exit_1_qty, limit=exit_1_price, comment="EXIT TG1 @ "+ tostring(exit_1_price)) strategy.cancel("Exit Drawd",true) cci_sell := false cci_buy := false if strategy.position_size > 0 and abs(strategy.position_size) < qty and abs(strategy.position_size) != qty and not tsl_hit_flag strategy.order("EXIT 2", strategy.short, exit_2_qty, limit=exit_2_price, comment="EXIT TG2 @ "+ tostring(exit_2_price)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at SL", true) if strategy.position_size < 0 and abs(strategy.position_size) == qty and not tsl_hit_flag strategy.order("EXIT 1", strategy.long, exit_1_qty, limit=exit_1_price, comment="EXIT TG1 @ "+ tostring(exit_1_price)) strategy.cancel("Exit Drawd",true) cci_buy := false cci_sell := false if strategy.position_size < 0 and abs(strategy.position_size) < qty and abs(strategy.position_size) != qty strategy.order("EXIT 2", strategy.long, exit_2_qty, limit=exit_2_price, comment="EXIT TG2 @ "+ tostring(exit_2_price)) RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false strategy.cancel("Exit Drawd",true) strategy.cancel("EXIT at SL", true) //>>>>>>drawdown execution if strategy.position_size < 0 and original_sl_type == "Close Price" and not tsl_hit_flag strategy.cancel("Exit Drawd",true) strategy.order("Exit Drawd", strategy.long, abs(strategy.position_size), stop= (entry_price + Draw_down*atr_length) ,comment="Drawdown exit S") RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false if strategy.position_size > 0 and original_sl_type == "Close Price" and not tsl_hit_flag and not sl_hit_flag strategy.cancel("Exit Drawd",true) strategy.order("Exit Drawd", strategy.short, abs(strategy.position_size), stop= (entry_price - Draw_down*atr_length) ,comment="Drawdown exit B") RSI_short := false RSI_long := false bar_count_long := 0 bar_count_short := 0 cci_buy := false cci_sell := false //>>>>to add sl hit sign if strategy.position_size != 0 and sl_hit_flag //For symbols on chart sl_cross := true //>>>>>cancel all pending orders if the trade is booked strategy.cancel_all(strategy.position_size == 0 and not (long_entry or short_entry)) //>>>>plot indicators p_mBB = plot(plotBB ? mBB0 : na, color=color.teal) p_uBB = plot(plotBB ? uBB0 : na, color=color.teal, style=plot.style_stepline) p_lBB = plot(plotBB ? lBB0 : na, color=color.teal, style=plot.style_stepline) plot(sma(close,5), color=color.blue, title="MA") //>>>>plot signals plotshape(plotSignals and RSI_short, style=shape.triangledown, location=location.abovebar, color=color.red) plotshape(plotSignals and RSI_long, style=shape.triangleup, location=location.belowbar, color=color.green) plotshape(sl_cross, text= "Stoploss Hit",size= size.normal,style=shape.xcross , location=location.belowbar, color=color.red) //>>>>plot signal high low if strategy.position_size != 0 candles_on_trade := candles_on_trade + 1 if strategy.position_size != 0 and candles_on_trade == 1 line.new(x1=bar_index[1], y1=high[1], x2=bar_index[0], y2=high[1], color=color.black, width=2) line.new(x1=bar_index[1], y1=low[1], x2=bar_index[0], y2=low[1], color=color.black, width=2) //>>>>end of program