কানেকটিকাট টার্টল সিস্টেম

লেখক:চাওঝাং, তারিখঃ ২০২৩-১১-০৬ ১০ঃ২৩ঃ১২
ট্যাগঃ

img

সারসংক্ষেপ

এই কৌশলটি বিখ্যাত টর্টল ট্রেডিং সিস্টেমের উপর ভিত্তি করে এবং মূল নিয়মগুলি যতটা সম্ভব অনুসরণ করার চেষ্টা করে। এটি একটি প্রবণতা অনুসরণকারী সিস্টেম যা ডাবল চলমান গড় ব্যবহার করে প্রবেশ এবং প্রস্থান সংকেত তৈরি করে।

ট্রেডিং লজিক

  • N1-দিনের সর্বোচ্চ (ডিফল্ট 20 দিন) এবং N2-দিনের সর্বোচ্চ (ডিফল্ট 55 দিন) ডাবল চলমান গড় তৈরি করতে ব্যবহৃত হয়।
  • N3-দিনের নিম্ন (ডিফল্ট 10 দিন) এবং N4-দিনের নিম্ন (ডিফল্ট 20 দিন) দ্বিগুণ চলমান গড় তৈরি করতে ব্যবহৃত হয়।
  • যখন বন্ধের মূল্য N2-দিনের সর্বোচ্চ অতিক্রম করে তখন লম্বা যান। যখন বন্ধের মূল্য N4-দিনের সর্বনিম্নের নিচে পড়ে তখন অবস্থান বন্ধ করুন।
  • পূর্ববর্তী প্রবেশ মূল্যের তুলনায় প্রতিটি 1x ATR (ডিফল্ট 1) পর্যন্ত 5 টি অতিরিক্ত লং পজিশন পর্যন্ত পিরামিড।
  • প্রবেশ মূল্যের নিচে N x ATR (ডিফল্ট 2) এ একটি নির্দিষ্ট স্টপ লস সেট করুন।
  • শুধুমাত্র আগের ট্রেডের পর নতুন এন্ট্রি করার অনুমতি দিন।

সুবিধা বিশ্লেষণ

এই কৌশলটির সুবিধাঃ

  • ট্রেন্ড ট্রেডিং নীতি অনুসরণ করে এবং মাঝারি থেকে দীর্ঘমেয়াদী প্রবণতা ধরা।
  • ডাবল এমএগুলি ফিল্টার গঠন করে, যা একীকরণের সময় অত্যধিক লেনদেন এড়ায়।
  • স্টপ লস সেটিং যুক্তিসঙ্গত, খুব প্রশস্ত বা খুব সংকীর্ণ এড়ানো।
  • পরামিতিগুলি ঝুঁকি-প্রতিদান প্রোফাইল সামঞ্জস্য করার জন্য কনফিগারযোগ্য।
  • শক্তিশালী প্রবণতার সময় আরও লাভের জন্য পিরামিডিং করার অনুমতি দিন।

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

এছাড়াও কিছু ঝুঁকি আছেঃ

  • প্রবণতা বিপরীত হলে সময়মতো বের হতে না পারা, যা বড় ক্ষতির দিকে পরিচালিত করে।
  • অনেক বেশি পিরামিডিং ট্রেডিংয়ের ফ্রিকোয়েন্সি বাড়ায়।
  • অনুপযুক্ত প্যারামিটার টিউনিং সিস্টেমটিকে খুব আক্রমণাত্মক বা খুব সংরক্ষণশীল করে তোলে।
  • ব্যাকটেস্টের পক্ষপাত, বাস্তব কর্মক্ষমতা কম পারফর্ম করতে পারে।

নিম্নলিখিত উপায়ে ঝুঁকি কমাতে পারেঃ

  • ক্ষতি কমানোর জন্য MACD ডিভার্জেন্সের মত বিপরীতমুখী সংকেত যোগ করা।
  • শক্তিশালী প্যারামিটার অপ্টিমাইজেশান।
  • বড় ক্ষতির পর পজিশনের আকার কমিয়ে পজিশনের আকার যোগ করা।

উন্নতির ক্ষেত্র

কৌশলটি নিম্নলিখিত উপায়ে উন্নত করা যেতে পারেঃ

  • দামের পতন থেকে মুনাফা অর্জনের জন্য শর্ট ট্রেড লজিক যোগ করুন।
  • দামের ক্রিয়াকলাপের ভিত্তিতে স্টপগুলি সামঞ্জস্য করতে স্টপ লস অপ্টিমাইজেশন যুক্ত করুন।
  • পিরামিডের আকার অনুকূল করার জন্য অবস্থান মাপ মডিউল যোগ করুন।
  • মিথ্যা সংকেত এড়াতে ADX এর মত ট্রেন্ড শক্তি সূচক অন্তর্ভুক্ত করুন।
  • আরও মসৃণ রিটার্নের জন্য প্যারামিটারগুলি অপ্টিমাইজ করুন।
  • আসল ট্রেডিং খরচ যেমন স্লিপ এবং কমিশন বিবেচনা করুন।

সিদ্ধান্ত

কৌশলটি প্রবণতা অনুসরণ করে মুনাফা অর্জন করে এবং ভাল ব্যাকটেস্টের ফলাফল রয়েছে। তবে বাস্তব কর্মক্ষমতা যাচাই করা দরকার। লাইভ ট্রেডিংয়ে এটি প্রয়োগ করার আগে প্যারামিটার দৃust়তা, স্টপ লস এবং অবস্থান আকারের উপর আরও অপ্টিমাইজেশান প্রয়োজন। সামগ্রিকভাবে এটির একটি ভাল যুক্তি রয়েছে এবং উন্নতির জন্য অনেক সম্ভাবনা রয়েছে।


/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Turtle", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1, pyramiding=5)

stopInput = input(2.0, "Stop N", step=.5)
pyramidInput = input(1, "Pyramid N", step=.5)
l1LongInput = input(20, "L1 Long", minval=5)
l2LongInput = input(55, "L2 Long", minval=5)
l1LongExitInput = input (10, "L1 Long Exit", minval=5)
l2LongExitInput = input (20, "L2 Long Exit", minval=5)

FromYear = input(2000, "From Year", minval=1900),   FromMonth = input(1, "From Month", minval=1, maxval=12),    FromDay = input(1, "From Day", minval=1, maxval=31)
ToYear = input(9999, "To Year", minval=1900),       ToMonth = input(1, "To Month", minval=1, maxval=12),        ToDay = input(1, "To Day", minval=1, maxval=31)
FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00),     ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59)
TradeDateIsAllowed() => time >= FromDate and time <= ToDate
l1Long = highest(l1LongInput)
l1LongExit = lowest(l1LongExitInput)
l2Long = highest(l2LongInput)
l2LongExit = lowest(l2LongExitInput)

// 
// ADX, +-DI
// https://www.tradingview.com/script/rlMJ05yl-ADX-and-DI-pine-script-3-0/
//
len = 14
th = 20
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

// Back to Turtle

filter = true // not (DIPlus < ADX and DIMinus < ADX) and DIPlus > DIMinus
var win = false
var totalPrice = 0.0
var buyPrice = 0.0
var avgPrice = 0.0
var nextBuyPrice = 0.0
var stopPrice = 0.0
var totalBuys = 0

var bool inBuy = false
var float l1LongPlot = highest(l1LongInput)
var float l2LongPlot = highest(l2LongInput)

n = atr(14)

var mode = 'L1'
string longLevel = na

if not inBuy 
    l1LongPlot := highest(l1LongInput)[1]
    l2LongPlot := highest(l2LongInput)[1]
    
    if (close > l2Long[1] and filter)
        mode := 'L2'
        if TradeDateIsAllowed() 
            strategy.close_all()
            strategy.entry("long", strategy.long, comment="L2")
            longLevel := 'L2'

        win := false
        buyPrice := close
        totalBuys := 1
        totalPrice := buyPrice
        avgPrice := buyPrice
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        inBuy := true
    else 
        if (close > l1Long[1] and filter)
            mode := 'L1'
            if not win
                if TradeDateIsAllowed()
                    strategy.close_all()
                    strategy.entry("long", strategy.long, comment="L1")
                    longLevel := 'L1'
            win := false
            buyPrice := close
            totalBuys := 1
            totalPrice := buyPrice
            avgPrice := buyPrice
            stopPrice := close-(stopInput*n)
            nextBuyPrice := high+(pyramidInput*n)
            inBuy := true
        else 
            inBuy := false

else
    l1LongPlot := l1LongPlot[1]
    l2LongPlot := l2LongPlot[1]
    
    if close > nextBuyPrice and TradeDateIsAllowed() and totalBuys < 6
        strategy.entry("long", strategy.long, comment="LP")
        longLevel := 'P'
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        totalBuys := totalBuys + 1
        totalPrice := totalPrice + buyPrice
        avgPrice := totalPrice / totalBuys

    if (close < stopPrice) 
        inBuy := false
        if TradeDateIsAllowed()
            if (close >= avgPrice)
                longLevel := 'SG'
            else 
                longLevel := 'SR'
            strategy.close("long", strategy.long)
        win := false
        buyPrice := 0
        avgPrice := 0
    else
        if (mode == 'L1' and close > l2Long[1] and filter)
            if win
                inBuy := true
                win := false
                mode := 'L2'
                if TradeDateIsAllowed()
                    strategy.close_all()
                    longLevel := 'L2'
                    strategy.entry("long", strategy.long, comment="L2")
                buyPrice := close
                totalBuys := 1
                totalPrice := buyPrice
                avgPrice := buyPrice
                stopPrice := close-(stopInput*n)
                nextBuyPrice := close+(pyramidInput*n)
        else
            if (close < l1LongExit[1] or close < l2LongExit[1])
                inBuy := false
                if TradeDateIsAllowed()
                    strategy.close("long", strategy.long)
                if close < avgPrice
                    longLevel := 'SR'
                    win := false
                else
                    longLevel := 'SG'
                    win := true
                buyPrice := 0

plot(l1LongPlot, title="l1 long", linewidth=3, style=plot.style_stepline, color=color.green)
plot(l1LongExit[1], title="l1 exit", linewidth=3, style=plot.style_stepline, color=color.red)

plot(l2LongPlot, title="l2 long", linewidth=2, style=plot.style_stepline, color=color.green)
plot(l2LongExit[1], title="l2 exit", linewidth=2, style=plot.style_stepline, color=color.red)

plot(stopPrice, title="stop", linewidth=2, style=plot.style_stepline, color=color.purple)

plotarrow(longLevel == 'L1' ? 1 : 0, colordown=color.black, colorup=color.green, transp=40)
plotarrow(longLevel == 'L2' ? 1 : 0, colordown=color.black, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SR' ? -1 : 0, colordown=color.red, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SG' ? -1 : 0, colordown=color.green, colorup=color.purple, transp=40)




আরো