রিসোর্স লোড হচ্ছে... লোডিং...

গতি ট্র্যাকিং কৌশল

লেখক:চাওঝাং, তারিখ: ২৯ ডিসেম্বর ২০২৩ 16:26:49
ট্যাগঃ

img

সারসংক্ষেপ

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

কৌশল নীতি

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

এছাড়াও, কৌশলটি স্বল্প ও দীর্ঘমেয়াদী প্রবণতা বিচার করার জন্য একটি বেসলাইন সূচকও প্রবর্তন করে; একটি নিশ্চিতকরণ সূচক মিথ্যা ব্রেকআউটগুলি ফিল্টার করতে ব্যবহৃত হয়। একটি ট্রেডিং সংকেত কেবল তখনই সক্রিয় হবে যখন বেসলাইন এবং নিশ্চিতকরণ সূচক উভয়ই প্রবণতার দিক যাচাই করেছে।

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

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

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

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

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

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

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

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

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

  1. বিচারের মডিউল বাড়ানো, যেমন অস্থিরতা মডিউল, অস্থিরতা বেশি হলে ট্রেডিং বন্ধ করা;
  2. মেশিন লার্নিং মডিউল বাড়ানো, মেশিন লার্নিং অ্যালগরিদম ব্যবহার করে সূচক ওজন নির্ধারণ করা।
  3. সেরা প্যারামিটার সমন্বয় খুঁজে পেতে সূচক পরামিতি অপ্টিমাইজ করা;
  4. প্রবণতাকে আরও ভালভাবে ট্র্যাক করার জন্য চলমান স্টপ লস অ্যালগরিদমকে অপ্টিমাইজ করুন;
  5. ঝুঁকি ব্যবস্থাপনা মডিউল যোগ করুন যেমন ট্রেলিং স্টপ লস, গতিশীল অবস্থান সমন্বয় ইত্যাদি।

সংক্ষিপ্তসার

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


/*backtest
start: 2023-11-28 00:00:00
end: 2023-12-28 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © Milleman
//@version=4
strategy("MilleMachine", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.06)


// Additional settings
Mode = input(title="Mode", defval="LongShort", options=["LongShort", "OnlyLong", "OnlyShort","Indicator Mode"])
UseTP = false                               //input(false, title="Use Take Profit?")
QuickSwitch = true                          //input(true, title="Quickswitch")
UseTC = true                                //input(true, title="Use Trendchange?")

// Risk management settings
//Spacer2 = input(false, title="======= Risk management settings =======")
Risk = input(1.0, title="% Risk",minval=0)/100
RRR = 2                                     //input(2,title="Risk Reward Ratio",step=0.1,minval=0,maxval=20)
SL_Mode = false                             // input(true, title="ON = Fixed SL / OFF = Dynamic SL (ATR)")
SL_Fix = 3                                  //input(3,title="StopLoss %",step=0.25, minval=0)/100
ATR = atr(14)                               //input(14,title="Periode ATR"))
Mul = input(2,title="ATR Multiplier",step=0.1)
xATR = ATR * Mul
SL = SL_Mode ? SL_Fix : (1 - close/(close+xATR))

// INDICATORS  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Ind(type, src, len) =>
    float result = 0
    if type=="McGinley"
        result := na(result[1]) ? ema(src, len) : result[1] + (src - result[1]) / (len * pow(src/result[1], 4))
    if type=="HMA"
        result := wma(2*wma(src, len/2)-wma(src, len), round(sqrt(len)))
    if type=="EHMA"
        result := ema(2*ema(src, len/2)-ema(src, len), round(sqrt(len)))
    if type=="THMA"
        lend = len/2
        result := wma(wma(src, lend/3)*3-wma(src, lend/2)-wma(src,lend), lend)
    if type=="SMA" // Simple
        result := sma(src, len)
    if type=="EMA" // Exponential
        result := ema(src, len)
    if type=="DEMA" // Double Exponential
        e = ema(src, len)
        result := 2 * e - ema(e, len)
    if type=="TEMA" // Triple Exponential
        e = ema(src, len)
        result := 3 * (e - ema(e, len)) + ema(ema(e, len), len)
    if type=="WMA" // Weighted
        result := wma(src, len)
    if type=="VWMA" // Volume Weighted
        result := vwma(src, len) 
    if type=="SMMA" // Smoothed
        w = wma(src, len)
        result := (w[1] * (len - 1) + src) / len
    if type == "RMA"
        result := rma(src, len)
    if type=="LSMA" // Least Squares
        result := linreg(src, len, 0)
    if type=="ALMA" // Arnaud Legoux
        result := alma(src, len, 0.85, 6)
    if type=="Kijun" //Kijun-sen
        kijun = avg(lowest(len), highest(len))
        result :=kijun
    if type=="WWSA" // Welles Wilder Smoothed Moving Average
        result := nz(result[1]) + (close -nz(result[1]))/len
    result

// Baseline : Switch from Long to Short and vice versa
BL_Act = input(true, title="====== Activate Baseline - Switch L/S ======")
BL_type = input(title="Baseline Type", defval="McGinley", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
BL_src = input(close, title="BL source")
BL_len = input(50, title="BL length", minval=1)
BL = Ind(BL_type,BL_src, BL_len)

// Confirmation indicator
C1_Act = input(false, title="===== Activate Confirmation indicator =====")
C1_type = input(title="C1 Entry indicator", defval="SMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
C1_src = input(close, title="Source")
C1_len = input(5,title="Length", minval=1)
C1 = Ind(C1_type,C1_src,C1_len)

// Entry indicator : Hull Moving Average
Spacer5 = input(true, title="====== ENTRY indicator =======")
EI_type = input(title="EI Entry indicator", defval="HMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
EI_src = input(close, title="Source")
EI_Len = input(46,title="Length", minval=1)
EI = Ind(EI_type,EI_src,EI_Len)

// Trail stop settings
TrailActivation = input(true, title="===== Activate Trailing Stop =====")
TS_type = input(title="TS Traling Stop Type", defval="EMA", options=["McGinley","HMA","EHMA","THMA","SMA","EMA","DEMA","TEMA","WMA","VWMA","SMMA","RMA","LSMA","ALMA","Kijun","WWSA"])
TrailSLScaling = 1 //input(100, title="SL Scaling", minval=0, step=5)/100
TrailingSourceLong = Ind(TS_type,low,input(5,"Smoothing Trail Long EMA", minval=1))
TrailingSourceShort = Ind(TS_type,high,input(2,"Smoothing Trail Short EMA", minval=1))

//VARIABLES MANAGEMENT
TriggerPrice = 0.0, TriggerPrice := TriggerPrice[1]
TriggerSL = 0.0, TriggerSL := TriggerSL[1]
SLPrice = 0.0, SLPrice := SLPrice[1], TPPrice = 0.0, TPPrice := TPPrice[1]
isLong = false, isLong := isLong[1], isShort = false, isShort := isShort[1]

//LOGIC
GoLong = crossover(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] > 1) and (not C1_Act or C1>C1[1]) and (Mode == "LongShort" or Mode == "OnlyLong")
GoShort = crossunder(EI,EI[1]) and (strategy.position_size == 0.0 and QuickSwitch) and (not BL_Act or BL/BL[1] < 1) and (not C1_Act or C1<C1[1]) and (Mode == "LongShort" or Mode == "OnlyShort")
ExitLong = isLong and crossunder(EI,EI[1]) and UseTC
ExitShort = isShort and crossover(EI,EI[1]) and UseTC

//FRAMEWORK
//Reset Long-Short memory
if isLong and strategy.position_size == 0.0
    isLong := false
if isShort and strategy.position_size == 0.0
    isShort := false
//Long
if GoLong
    isLong := true, TriggerPrice := close, TriggerSL := SL
    TPPrice := UseTP? TriggerPrice * (1 + (TriggerSL * RRR)) : na
    SLPrice := TriggerPrice * (1-TriggerSL)
    Entry_Contracts = strategy.equity * Risk / ((TriggerPrice-SLPrice)/TriggerPrice) / TriggerPrice
    strategy.entry("Long", strategy.long, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts)
    strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice)
if isLong
    NewValSL = TrailingSourceLong * (1 - (SL*TrailSLScaling))
    if TrailActivation and NewValSL > SLPrice
        SLPrice := NewValSL
    strategy.exit("TPSL","Long", limit=TPPrice, stop=SLPrice)
if ExitLong
    strategy.close_all(comment="TrendChange")
    isLong := false

//Short
if GoShort
    isShort := true, TriggerPrice := close, TriggerSL := SL
    TPPrice := UseTP? TriggerPrice * (1 - (TriggerSL * RRR)) : na
    SLPrice := TriggerPrice * (1 + TriggerSL)
    Entry_Contracts = strategy.equity * Risk / ((SLPrice-TriggerPrice)/TriggerPrice) / TriggerPrice
    strategy.entry("Short", strategy.short, comment=tostring(round((TriggerSL/TriggerPrice)*1000)), qty=Entry_Contracts)
    strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice)
if isShort
    NewValSL = TrailingSourceShort * (1 + (SL*TrailSLScaling))
    if TrailActivation and NewValSL < SLPrice
        SLPrice := NewValSL
    strategy.exit("TPSL","Short", limit=TPPrice, stop=SLPrice)
if ExitShort
    strategy.close_all(comment="TrendChange")
    isShort := false

//VISUALISATION
plot(BL_Act?BL:na, color=color.blue,title="Baseline")
plot(C1_Act?C1:na, color=color.yellow,title="confirmation Indicator")
EIColor = EI>EI[1] ? color.green : color.red
Fill_EI = plot(EI, color=EIColor, linewidth=1, transp=40, title="Entry Indicator EI")
Fill_EID = plot(EI[1], color=EIColor, linewidth=1, transp=40, title="Entry Indicator EID")
fill(Fill_EI,Fill_EID, title="EI_Fill", color=EIColor,transp=50)

plot(strategy.position_size != 0.0 and (isLong or isShort) ? TriggerPrice : na, title="TriggerPrice", color=color.yellow, style=plot.style_linebr)
plot(strategy.position_size != 0.0 and (isLong or isShort) ? TPPrice : na, title="TakeProfit", color=color.green, style=plot.style_linebr)
plot(strategy.position_size != 0.0 and (isLong or isShort) ? SLPrice : na, title="StopLoss", color=color.red, style=plot.style_linebr)
bgcolor(isLong[1] and cross(low,SLPrice) and low[1] > SLPrice and TriggerPrice>SLPrice ? color.yellow : na, transp=75, title="SL Long")
bgcolor(isShort[1] and cross(high,SLPrice) and high[1] < SLPrice and TriggerPrice<SLPrice ? color.yellow : na, transp=75, title="SL Short")

আরো