
এহলস ইনস্ট্যান্ট ট্রেন্ড লাইন কৌশলটি জন এহলস তার বইয়ের স্টক এবং ফিউচারগুলির নিয়ন্ত্রণ বিশ্লেষণ প্যাকেজে প্রস্তাব করেছেন। এই কৌশলটি প্রযুক্তিগত সূচকগুলি ব্যবহার করে একটি স্টক বা ফিউচারের তাত্ক্ষণিক প্রবণতা সনাক্ত করতে এবং প্রবণতা বিপরীত হওয়ার সময় অবস্থানগুলি খোলার জন্য।
এই কৌশলটির কেন্দ্রবিন্দু হল তাত্ক্ষণিক প্রবণতা রেখা গণনা করা। আইটি রেখার গণনা সূত্রটি নিম্নরূপঃ
it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
যেখানে src মূল্যের প্রতিনিধিত্ব করে, a হল সমতলীকরণ ফ্যাক্টর, যার ডিফল্ট মান 0.07। এই সূত্রটি একটি দ্বিতীয় স্তরের ফিল্টার যা মূল্যকে সমতল করে এবং প্রবণতা তৈরি করে।
আরেকটি গুরুত্বপূর্ণ সূচক হল পিছিয়ে পড়া লাইন (লগ), যা গণনা করা হয় নিম্নরূপঃ
lag = 2.0 * it - nz(it[2])
এই লাইনটি আইটি লাইনের এক চক্র পিছিয়ে পড়েছে। যখন দামটি পিছিয়ে পড়ে তখন এটি প্রবণতা বিপরীতকরণকে বোঝায়, এটি আরও বেশি করে; যখন দামটি পিছিয়ে পড়ে তখন এটি প্রবণতা বিপরীতকরণকে বোঝায়, এটি খালি করে দেয়।
এছাড়াও, কৌশলটি ঝুঁকি নিয়ন্ত্রণের জন্য একটি স্টপ লস পলিসি নির্ধারণ করে।
এই কৌশলটির সুবিধাগুলো হলঃ
এই কৌশলটির কিছু ঝুঁকিও রয়েছেঃ
এই ঝুঁকিগুলি নিম্নলিখিত উপায়ে হ্রাস করা যেতে পারেঃ
এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যেতে পারেঃ
সামগ্রিকভাবে, ইলেস তাত্ক্ষণিক ট্রেন্ড লাইন কৌশলটি প্রযুক্তিগত সূচকগুলি ব্যবহার করে স্টক / ফিউচারগুলির রিয়েল-টাইম প্রবণতা সনাক্ত করতে এবং প্রবণতা বিপরীত হলে পজিশন খোলার জন্য। এটির কার্যকর গোলমাল ফিল্টারিং, উচ্চ প্যারামিটার সামঞ্জস্যযোগ্যতা, পরিষ্কার সংকেত উত্পাদন লজিক এবং অন্তর্নির্মিত ঝুঁকি নিয়ন্ত্রণের মতো সুবিধাগুলি রয়েছে। প্যারামিটার নির্বাচন, ফিল্টারিং, অবস্থান স্কেল এবং স্টপ লস সামঞ্জস্যের আরও অপ্টিমাইজেশনের মাধ্যমে এই কৌশলটি আরও ভাল পারফরম্যান্স অর্জন করতে পারে। পরিষ্কার কোড কাঠামোটি এটিকে সহজেই বোঝা এবং পরিবর্তন করা সহজ করে তোলে। সব মিলিয়ে, এটি একটি কার্যকর ট্র্যাকিং সিস্টেম যা পরীক্ষার এবং উন্নত করার জন্য মূল্যবান।
/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01)
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
it := (src + 2 * src[1] + src[2]) / 4.0
else
it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])
diff = input(0.5, title = "Spread")
LongPrice(p) =>
LongPrice = diff == 0 ? p : floor(p / diff) * diff
ShortPrice(p) =>
ShortPrice = diff == 0 ? p : ceil(p / diff) * diff
strategy.cancel_all()
reverseTrade = false
if stopType == "market-order"
if strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct)
strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
reverseTrade := true
if strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct)
strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
reverseTrade := true
if lag > it and not reverseTrade
price = LongPrice(max(close - (high - low) * rngFrac, low))
if strategy.position_size <= 0
strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
if stopType == "stop-order"
strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
else
if stopType == "stop-order"
strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
price = ShortPrice(min(close - (high - low) * rngFrac, high))
if strategy.position_size >= 0
strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
if stopType == "stop-order"
strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
else
if stopType == "stop-order"
strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))
itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red, transp=70)
// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
strategy.cancel_all()
strategy.close_all()