এই কৌশলটির মূল ধারণা হ'ল সুপারট্রেন্ড সূচকটি ইক্যুইটি বক্ররেখার ব্যবসায়ের সাথে একত্রিত করা। যখন সুপারট্রেন্ড সূচকটি একটি ক্রয় বা বিক্রয় সংকেত তৈরি করে, আমরা সরাসরি বাণিজ্যটি সম্পাদন করি না। পরিবর্তে, আমরা বর্তমান ইক্যুইটি বক্ররেখাটি তার চলমান গড়ের নীচে কিনা তা পরীক্ষা করি। আমরা কেবলমাত্র যখন ইক্যুইটি বক্ররেখাটি চলমান গড়ের উপরে থাকে তখনই অবস্থানগুলি খুলব। যখন ইক্যুইটি বক্ররেখাটি চলমান গড়ের নীচে থাকে, তখন আমরা বর্তমান কৌশলটির জন্য ট্রেডিং বিরতি দেব। এটি কার্যকরভাবে ক্ষতির সম্প্রসারণ রোধ করতে পারে।
এই কৌশল মূলত দুটি অংশ নিয়ে গঠিতঃ
সুপারট্রেন্ড সূচকের গণনার সূত্র হলঃ
উপরের ব্যান্ড = উৎস মূল্য - ATR মাল্টিপ্লায়ার * ATR নিম্ন ব্যান্ড = উৎস মূল্য + ATR মাল্টিপ্লায়ার * ATR
যেখানে এটিআর মানে গড় সত্য পরিসীমা। সুপারট্রেন্ড সূচকটি উপরের এবং নীচের ব্যান্ডগুলি সেট করতে এটিআর ব্যবহার করে। উপরের ব্যান্ডের উপরে একটি ব্রেকআউট বিক্রয় সংকেত হিসাবে দাঁড়িয়েছে, যখন নীচের ব্যান্ডের নীচে একটি ব্রেকআউট একটি ক্রয় সংকেত হিসাবে দাঁড়িয়েছে।
ইক্যুইটি কার্ভ ট্রেডিংয়ের পিছনে ধারণাটি হ'ল আমরা কৌশলটির ইক্যুইটি কার্ভের চলমান গড় গ্রহণ করি। যখন ইক্যুইটি কার্ভ তার চলমান গড়ের নীচে পড়ে, আমরা বর্তমান কৌশলটির জন্য ট্রেডিং বিরতি করি এবং পুনরায় ট্রেডিং সক্ষম করার আগে ইক্যুইটি কার্ভটি চলমান গড়ের উপরে ফিরে আসার জন্য অপেক্ষা করি।
এই কৌশলটি দুটি কৌশলকে একত্রিত করে, যাতে সুপারট্রেন্ড সূচকটি একটি ট্রেডিং সংকেত তৈরি করার পরে, আমরা সরাসরি ট্রেডগুলিতে প্রবেশ করি না। পরিবর্তে, আমরা বর্তমান ইক্যুইটি বক্ররেখাটি তার চলমান গড়ের উপরে কিনা তা পরীক্ষা করি। কেবলমাত্র যখন উভয় শর্ত পূরণ হয় তখন আমরা অবস্থানগুলি খুলব। এটি কার্যকরভাবে সুপারট্রেন্ড সূচকটির অন্তর্নিহিত ঝুঁকিগুলি হ্রাস করতে পারে এবং অত্যধিক ক্ষতি রোধ করতে পারে।
এই কৌশলটির প্রধান সুবিধাগুলো হল:
এটি সুপারট্রেন্ড সূচকের ঝুঁকি কার্যকরভাবে প্রতিরোধ করতে পারে। সুপারট্রেন্ড সূচক নিজেই কার্যকরভাবে ক্ষতি হ্রাস করতে পারে না। ইক্যুইটি বক্ররেখা ট্রেডিং এই ঘাটতি পূরণ করে।
যখন ট্রেডিং অনুকূল হয় না, তখন আমরা অত্যধিক ক্ষতি এড়াতে ট্রেডিং বন্ধ করে দিই। বাজারের পুনরুদ্ধারের পর আমরা ট্রেডিং শুরু করতে পারি।
এটি ম্যানুয়াল হস্তক্ষেপ ছাড়াই স্বয়ংক্রিয়ভাবে পজিশন পরিচালনা করতে পারে। যখন শেয়ারের বাঁকটি চলমান গড়ের নীচে পড়ে তখন ট্রেডিং স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় এবং যখন শেয়ারের বাঁকটি তার উপরে ফিরে আসে তখন পুনরায় শুরু হয়।
এই কৌশলটির সাথে কিছু ঝুঁকিও রয়েছেঃ
ভুল প্যারামিটার সেটিং ইক্যুইটি কার্ভ ট্রেডিংকে অকার্যকর করে তুলতে পারে। উপযুক্ত চলমান গড় সময়ের নির্বাচন করা প্রয়োজন।
বাজারের প্রবণতা পরিবর্তনের সময় এটি দ্রুত অবস্থানের সমন্বয় করতে ব্যর্থ হতে পারে। এর ফলে কিছু ক্ষতি হতে পারে।
ইকুইটি কার্ভের রিবাউন্ডের অপেক্ষায় থাকা অবস্থায় এটি ভাল ট্রেডিং সুযোগ মিস করতে পারে।
প্রতিরোধ ব্যবস্থাঃ
প্যারামিটার অপ্টিমাইজ করুন এবং সেরা চলমান গড় সময় নির্বাচন করুন।
প্রবণতা মূল্যায়নের জন্য অন্যান্য সূচক অন্তর্ভুক্ত করুন এবং সেই অনুযায়ী অবস্থানগুলি সামঞ্জস্য করুন।
অপ্রত্যাশিত সুযোগ হ্রাস করার জন্য স্থগিত ট্রেডিংয়ের সময়কাল সংক্ষিপ্ত করা।
আমরা নিম্নলিখিত দিক থেকে কৌশলটি অপ্টিমাইজ করতে পারিঃ
সর্বোত্তম এটিআর সময়কাল এবং গুণক খুঁজে পেতে বিভিন্ন পরামিতি সংমিশ্রণ পরীক্ষা করুন।
অন্যান্য প্রকারের চলমান গড় চেষ্টা করুন, যেমন এক্সপোনেনশিয়াল চলমান গড়, হুল চলমান গড় ইত্যাদি
বাজারের প্রবণতা নির্ধারণের জন্য অন্যান্য সূচক যোগ করুন এবং প্রবণতা পরিবর্তনের সময় অবস্থানগুলি সামঞ্জস্য করুন।
সর্বোত্তম ভারসাম্য খুঁজে পেতে চলমান গড় সময়ের অপ্টিমাইজ করুন। খুব দীর্ঘ সময় সুযোগগুলি মিস করতে পারে, যখন খুব কম সময় খুব ঘন ঘন বিরতি নিতে পারে।
ট্রেডিং বন্ধ করার জন্য শর্তগুলি অপ্টিমাইজ করুন, যেমন স্থগিতাদেশের আগে স্টপ লস থ্রেশহোল্ড সেট করা।
এই কৌশলটি বুদ্ধিমানভাবে সুপারট্রেন্ড সূচককে ইক্যুইটি কার্ভ ট্রেডিংয়ের সাথে একত্রিত করে, উভয় কৌশলগুলির শক্তির সদ্ব্যবহার করে। পরীক্ষার ফলাফলগুলি দেখায় যে বেশিরভাগ ক্ষেত্রে, ইক্যুইটি কার্ভ ট্রেডিং প্রয়োগ করা আসলে লাভজনকতা হ্রাস করে। যেমন, এই কৌশলটি প্রতিরক্ষামূলক ব্যবসায়ীদের জন্য আরও উপযুক্ত। প্যারামিটার এবং যৌক্তিক অপ্টিমাইজেশনের সাথে এটি একটি খুব ব্যবহারিক পরিমাণগত ট্রেডিং কৌশল হয়ে উঠতে পারে।
/*backtest start: 2023-01-14 00:00:00 end: 2024-01-14 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('Supertrend & Equity curve with EMA', overlay=false, format=format.price, precision=2, initial_capital=100000) eqlen = input.int(25, "EQ EMA len", group = "New Equity Curve Settings") shEQandMA = input.bool(true, "Show Original Equity Curve and MA") shEQfilt = input.bool(true, "Show Filtered Equity Curve by MA") Periods = input(title='ATR Period', defval=10, group = "SuperTrend Settings") src = input(hl2, title='Source', group = "SuperTrend Settings") Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0, group = "SuperTrend Settings") changeATR = input(title='Change ATR Calculation Method ?', defval=true, group = "SuperTrend Settings") //SuperTrend Code atr2 = ta.sma(ta.tr, Periods) atr = changeATR ? ta.atr(Periods) : atr2 up = src - Multiplier * atr up1 = nz(up[1], up) up := close[1] > up1 ? math.max(up, up1) : up dn = src + Multiplier * atr dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? math.min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend // Strategy main code buySignal = trend == 1 and trend[1] == -1 sellSignal = trend == -1 and trend[1] == 1 if buySignal strategy.entry('Long', strategy.long) if sellSignal strategy.entry('Short', strategy.short) //Equity Curve calcs eq = strategy.netprofit ch = ta.change(eq) neq = ch != 0 ? eq : na mova = ta.ema(neq,eqlen) // New Equity Curve var float neweq = 0 var int ttrades = 0 var int wintrades = 0 var int losetrades = 0 switch strategy.netprofit == strategy.netprofit[1] => na strategy.netprofit < mova and strategy.netprofit[1] > mova => neweq := neweq + ch strategy.netprofit < mova and strategy.netprofit[1] < mova => na strategy.netprofit > mova and strategy.netprofit[1] > mova => neweq := neweq + ch newch = ta.change(neweq) switch newch == 0 => na newch > 0 => wintrades := wintrades +1 ttrades := ttrades +1 newch < 0 => losetrades := losetrades +1 ttrades := ttrades +1 //plot(eq, linewidth = 2) //plot(mova, color=color.red) //plot(neweq, color= color.green, linewidth = 3) //Table var testTable = table.new(position = position.top_right, columns = 5, rows = 10, bgcolor = color.green, border_width = 1) table.cell(table_id = testTable, column = 0, row = 0, text = "Strategy: ", bgcolor=color.white) table.cell(table_id = testTable, column = 1, row = 0, text = "Original: ", bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 0, text = "Equity Curve EMA: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 1, text = "Total Trades: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 2, text = "Win Trades: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 3, text = "Lose Trades: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 4, text = "Win Rate: ", bgcolor=color.white) table.cell(table_id = testTable, column = 0, row = 5, text = "Net Profit: ", bgcolor=color.white) //Equity Curve EMA stat table.cell(table_id = testTable, column = 2, row = 1, text = str.tostring(ttrades), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 2, text = str.tostring(wintrades), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 3, text = str.tostring(losetrades), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 4, text = str.tostring(math.round(100*wintrades/ttrades,2)), bgcolor=color.white) table.cell(table_id = testTable, column = 2, row = 5, text = str.tostring(math.round(neweq)), bgcolor=color.white) //Original Strategy stat // table.cell(table_id = testTable, column = 1, row = 1, text = str.tostring(strategy.closedtrades), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 2, text = str.tostring(strategy.wintrades), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 3, text = str.tostring(strategy.losstrades), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 4, text = str.tostring(math.round(100*strategy.wintrades/strategy.closedtrades,2)), bgcolor=color.white) // table.cell(table_id = testTable, column = 1, row = 5, text = str.tostring(math.round(strategy.netprofit)), bgcolor=color.white) //New Equity curve var newcurve = array.new_float(0) var int ida = 0 var bool printEQ = false if newch !=0 array.push(newcurve, neweq) if bar_index > last_bar_index - array.size(newcurve) - 1 - 20 and array.size(newcurve) > 20 printEQ := true else printEQ := false plot(printEQ and ida < strategy.closedtrades and shEQfilt ? array.get(newcurve, ida) : na, color=color.green, linewidth = 2) if printEQ ida := ida + 1 if ida >= array.size(newcurve) and printEQ ida := array.size(newcurve) -1 //Original Equity curve var newcurve2 = array.new_float(0) var int ida2 = 0 var bool printEQ2 = false if ch !=0 array.push(newcurve2, eq) if bar_index > last_bar_index - array.size(newcurve2) - 1 - 20 and array.size(newcurve2) > 20 printEQ2 := true else printEQ2 := false plot(printEQ2 and ida2 < strategy.closedtrades and shEQandMA ? array.get(newcurve2, ida2) : na, color=color.blue, linewidth = 2) if printEQ2 ida2 := ida2 + 1 if ida2 >= array.size(newcurve2) and printEQ2 ida2 := array.size(newcurve2) -1 //Moving Average Array var marray = array.new_float(0) if ch array.push(marray, mova) plot(printEQ2 and array.size(marray) > 40 and shEQandMA ? array.get(marray, ida2-1) : na, color=color.red, linewidth = 1) hline(0,"0 line", color=color.black, linestyle = hline.style_dotted) if (last_bar_index-1) and array.size(newcurve2) > 20 and array.size(newcurve) > 20 l = label.new(bar_index+2, array.get(newcurve2, array.size(newcurve2)-1), "Original Equity Curve", color=color.rgb(33, 149, 243, 85), textcolor = color.black, style = label.style_label_left) label.delete(l[1]) f = label.new(bar_index+2, array.get(newcurve, array.size(newcurve)-1), "Filtered Equity Curve", color=color.rgb(69, 238, 97, 85), textcolor = color.black, style = label.style_label_left) label.delete(f[1])