এহেলার্স ইনস্ট্যান্ট ট্রেন্ডলাইন কৌশল

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

img

সারসংক্ষেপ

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

কৌশলগত যুক্তি

এই কৌশলটির মূলটি হল তাত্ক্ষণিক ট্রেন্ডলাইন (আইটি) গণনা করা। আইটি জন্য সূত্রটি হলঃ

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])

লেগ লাইনটি আইটি লাইনের চেয়ে এক বার পিছিয়ে আছে। যখন মূল্য লেগ লাইনের উপরে অতিক্রম করে, এটি একটি আপসাইড ব্রেকআউট সংকেত দেয়, দীর্ঘ যান। যখন মূল্য লেগ লাইনের নীচে অতিক্রম করে, এটি একটি ডাউনসাইড ব্রেকআউট সংকেত দেয়, সংক্ষিপ্ত যান।

উপরন্তু, কৌশল ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ লস অর্ডার সেট করে।

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

এই কৌশলটির সুবিধাগুলির মধ্যে রয়েছেঃ

  1. আইটি লাইন কার্যকরভাবে গোলমাল ফিল্টার করে এবং সংকেতের গুণমান উন্নত করে
  2. ২য় অর্ডার ফিল্টার আরো tuning নমনীয়তা এবং দৃঢ়তা প্রদান করে
  3. প্রবণতার মধ্যে অপ্রয়োজনীয় হুইপসো এড়াতে লেগ লাইন
  4. পূর্ব নির্ধারিত স্তরে সংযুক্ত স্টপ লস নিয়ন্ত্রণের ঝুঁকি
  5. পরিষ্কার কোড কাঠামো, বুঝতে এবং পরিবর্তন করা সহজ

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

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

  1. আইটি / লেগ লাইনের ভুল প্যারামিটার টিউনিং মিথ্যা সংকেত তৈরি করতে পারে
  2. খারাপ স্টপ লস কনফিগারেশন অকাল স্টপ আউট বা অত্যধিক ক্ষতি হতে পারে
  3. উচ্চ ট্রেডিং ফ্রিকোয়েন্সিতে কমিশন ফি জমা হয়
  4. দীর্ঘ সময় ধরে রাখা ক্ষতির ঝুঁকি বাড়ায়

এই ঝুঁকিগুলি হ্রাস করা যেতে পারেঃ

  1. প্যারামিটার অপ্টিমাইজেশনের জন্য মেশিন লার্নিং প্রয়োগ করা
  2. অভিযোজিত স্টপ লস স্তর সেট করা
  3. কম ট্রেডিং ফ্রিকোয়েন্সির জন্য পজিশনের আকার হ্রাস করা
  4. হোল্ডিং সময়ের স্টপ লস অন্তর্ভুক্ত করা

অপ্টিমাইজেশান নির্দেশাবলী

এই কৌশল নিম্নলিখিত দিকগুলির মধ্যে আরও অপ্টিমাইজ করা যেতে পারেঃ

  1. সর্বোত্তম খুঁজে পেতে বিভিন্ন ফিল্টার পরামিতি পরীক্ষা প্রভাব
  2. সংকেত ফিল্টার করার জন্য অন্যান্য সূচক একত্রিত করার চেষ্টা করুন
  3. প্রবণতা ত্বরণের পর্যায়ে আকার বাড়ানোর জন্য এন্ট্রি লজিক উন্নত করুন
  4. বাজারের অস্থিরতার উপর ভিত্তি করে অভিযোজিত স্টপ লস সেট আপ করুন
  5. ট্রেডিং সেশন এবং ফ্রিকোয়েন্সির সময় সিরিজ বিশ্লেষণ পরিচালনা করুন

সিদ্ধান্ত

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


/*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()

আরো