সুপার ট্রেন্ড সূচক এবং ইক্যুইটি কার্ভ ট্রেডিং এর উপর ভিত্তি করে পরিমাণগত কৌশল


সৃষ্টির তারিখ: 2024-01-15 11:41:53 অবশেষে সংশোধন করুন: 2024-01-15 11:41:53
অনুলিপি: 1 ক্লিকের সংখ্যা: 601
1
ফোকাস
1617
অনুসারী

সুপার ট্রেন্ড সূচক এবং ইক্যুইটি কার্ভ ট্রেডিং এর উপর ভিত্তি করে পরিমাণগত কৌশল

ওভারভিউ

এই কৌশলটির মূল ধারণাগুলি হ’ল সুপারট্রেন্ডিং সূচক এবং নিটওয়ার্ক কার্ভ ট্রেডিংয়ের সমন্বয়, যখন সুপারট্রেন্ডিং সূচকটি ক্রয় বা বিক্রয় সংকেত দেয়, আমরা সরাসরি লেনদেনটি সম্পাদন করি না, তবে আমরা বিচার করি যে বর্তমান নিটওয়ার্ক কার্ভটি তার চলমান গড়ের চেয়ে কম কিনা। আমরা কেবলমাত্র যখন নিটওয়ার্ক কার্ভটি চলমান গড়ের চেয়ে বেশি থাকে তখনই পজিশনটি খোলার চেষ্টা করি। যখন নিটওয়ার্ক কার্ভটি চলমান গড়ের চেয়ে কম থাকে, আমরা বর্তমান কৌশলটি স্থগিত করি। এটি ক্ষতির বিস্তারকে কার্যকরভাবে প্রতিরোধ করতে পারে।

কৌশল নীতি

এই কৌশলটি মূলত দুটি অংশে বিভক্তঃ

  1. প্রবণতা অতিক্রম করে
  2. নিটওয়ার্ক কার্ভ ট্রেডিং

সুপারট্রেন্ডিং সূচকের গণনা সূত্রটি নিম্নরূপঃ

রেলওয়ে = উৎস মূল্য - ATR গুণিত * ATR নিচের ট্র্যাক = উৎস মূল্য + ATR গুণিত * ATR

এর মধ্যে, এটিআর হল গড় বাস্তব তরঙ্গের মাত্রা। সুপার ট্রেন্ডিং সূচকটি এটিআর ব্যবহার করে ট্রেনে উঠতে এবং নেমে যাওয়ার জন্য, যখন দামটি ট্রেনে উঠে যায় তখন বিক্রয় সংকেত দেয় এবং যখন দামটি ট্রেনে নেমে যায় তখন ক্রয় সংকেত দেয়।

নেটওয়ার্ক কার্ভ ট্রেডিং এর ধারণা হল যে আমরা কৌশলটির নেটওয়ার্ক কার্ভের উপর চলমান গড় করি, যখন নেটওয়ার্ক কার্ভটি চলমান গড়ের নিচে থাকে, তখন বর্তমান কৌশলটির ট্রেডিং স্থগিত করি এবং নেটওয়ার্ক কার্ভটি চলমান গড়ের উপরে উঠার পরে আবার ট্রেডিং শুরু করার জন্য অপেক্ষা করি।

এই কৌশলটি উভয়কে একত্রিত করে, একটি ট্রেডিং সিগন্যাল উত্পন্ন করার পরে, আমরা সরাসরি লেনদেন করি না, তবে আমরা বিচার করি যে বর্তমান নেটওয়ার্ক কার্ভটি মুভিং এভারেজের চেয়ে বেশি কিনা। কেবলমাত্র যদি উভয়ই একই সাথে যোগ্য হয় তবে আমরা একটি অবস্থান খুলব। এটি কার্যকরভাবে একটি ট্রেডিং সিগন্যালের ঝুঁকি এড়াতে এবং অত্যধিক ক্ষতি রোধ করতে পারে।

সামর্থ্য বিশ্লেষণ

এই কৌশলটির প্রধান সুবিধাগুলো হলঃ

  1. সুপারট্রেন্ডিং সূচকগুলির ঝুঁকিগুলি কার্যকরভাবে প্রতিরোধ করা যায়। সুপারট্রেন্ডিং সূচকগুলি নিজেই ক্ষতি এড়াতে কার্যকরভাবে সক্ষম হয় না, নেটওয়ার্ক কার্ভ ট্রেডিং এই ত্রুটিটি পূরণ করতে পারে।

  2. যখন ট্রেডিং খারাপ হয়, তখন কৌশলগত ট্রেডিং স্থগিত করা যেতে পারে, অত্যধিক ক্ষতি এড়াতে। বাজার পরিবর্তনের জন্য অপেক্ষা করুন যাতে এটি আবার চালু হতে পারে।

  3. ম্যানুয়াল হস্তক্ষেপ ছাড়াই স্বয়ংক্রিয়ভাবে পজিশন পরিচালনা করা যায়। নেটওয়ার্ক কার্ভ চলমান গড়ের নীচে স্বয়ংক্রিয়ভাবে স্থগিত হয় এবং উচ্চতর হলে স্বয়ংক্রিয়ভাবে চালু হয়।

ঝুঁকি বিশ্লেষণ

এই কৌশলটির কিছু ঝুঁকিও রয়েছেঃ

  1. প্যারামিটার সেট করার ভুলের ফলে নেটওয়ার্ক কার্ভ ট্রেডিংয়ের কার্যকারিতা কার্যকরভাবে কার্যকর করা যায় না। উপযুক্ত চলমান গড় সময়কাল নির্বাচন করা প্রয়োজন।

  2. যখন বাজারের প্রবণতা পরিবর্তিত হয়, আপনি সময়মত আপনার অবস্থান পরিবর্তন করতে পারবেন না। এর ফলে কিছু ক্ষতি হতে পারে।

  3. তবে, এই ব্যবস্থায় প্রবেশের জন্য একটি ভাল সময় মিস করা যেতে পারে, কারণ এটির জন্য অপেক্ষা করতে হবে যখন নিটওয়ার্ক কার্ভটি পুনরায় উত্থিত হয়।

প্রতিকারঃ

  1. অপ্টিমাইজেশান প্যারামিটার, সর্বোত্তম চলমান গড় সময়কাল নির্বাচন করুন।

  2. অন্যান্য সূচকগুলির সাথে প্রবণতা নির্ধারণের সাথে সাথে সময়মতো পজিশনের পরিবর্তন করুন।

  3. ট্রেডিং বন্ধের সময়কে যথাযথভাবে সংক্ষিপ্ত করা, যাতে প্রবেশের সুযোগ মিস করার সম্ভাবনা কম থাকে।

অপ্টিমাইজেশান দিক

এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে উন্নত করা যেতে পারেঃ

  1. বিভিন্ন প্যারামিটার সমন্বয় পরীক্ষা করে সেরা ATR চক্র এবং ATR গুণ খুঁজে বের করুন।

  2. অন্য ধরনের মুভিং এভারেজ যেমন ইন্ডেক্সাল মুভিং এভারেজ, হুল মুভিং এভারেজ ইত্যাদি ব্যবহার করে দেখুন।

  3. অন্যান্য সূচক যোগ করুন ট্রেন্ডিংয়ের জন্য, ট্রেন্ড পরিবর্তন হলে সময়মত পজিশনে সামঞ্জস্য করুন।

  4. চলমান গড়ের চক্রটি অনুকূলিত করুন এবং সর্বোত্তম ভারসাম্য খুঁজে বের করুন। চক্রটি খুব দীর্ঘ হলে সুযোগটি মিস করা হবে এবং খুব কম হলে প্রায়শই বিরতি দেওয়া হবে।

  5. ট্রেডিং স্থগিত করার শর্তগুলিকে অপ্টিমাইজ করুন, যেমন একটি স্টপ লস লাইন সেট করা, যা কেবলমাত্র ক্ষতির একটি নির্দিষ্ট পরিমাণে পৌঁছানোর পরে স্থগিত করা হয়।

সারসংক্ষেপ

এই কৌশলটি সুপার ট্রেন্ডিং সূচক এবং নেটওয়ার্ক কার্ভ ট্রেডিংয়ের একটি চতুর সমন্বয় করে। এই কৌশলটি সুপার ট্রেন্ডিং সূচকগুলির ট্রেন্ডিংয়ের সুবিধাগুলি সংরক্ষণ করে এবং নেটওয়ার্ক কার্ভ ট্রেডিংয়ের মাধ্যমে ঝুঁকিগুলি কার্যকরভাবে নিয়ন্ত্রণ করে। পরীক্ষার ফলাফলগুলি দেখায় যে বেশিরভাগ ক্ষেত্রে, নেটওয়ার্ক কার্ভ ট্রেডিংয়ের প্রয়োগের ফলে মুনাফা হ্রাস পায়। সুতরাং এই কৌশলটি প্রতিরক্ষামূলক ট্রেডারদের জন্য আরও উপযুক্ত। প্যারামিটার অপ্টিমাইজেশন এবং নিয়ম অপ্টিমাইজেশনের মাধ্যমে এই কৌশলটি একটি খুব কার্যকর পরিমাণে ট্রেডিং কৌশল হতে পারে।

কৌশল সোর্স কোড
/*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])