
সমান্তরাল ট্র্যাকিং কৌশলটি মূল প্রবণতা নির্দেশক হিসাবে হালের চলমান গড় ব্যবহার করে, দামের প্রবণতার দিকনির্দেশের জন্য। একই সাথে, এই কৌশলটি অন্যান্য বিভিন্ন সূচকের সাথে মিলিত হয়, যেমন বেঞ্চমার্ক লাইন, নিশ্চিতকরণ সূচক ইত্যাদি, দামের প্রবণতা যাচাই করতে এবং মিথ্যা সংকেতগুলি ফিল্টার করতে। প্রবণতা অনুসরণ করার পরে, কৌশলটি গড় সত্যিকারের তরঙ্গের ব্যাপ্তি ব্যবহার করে গতিশীল স্টপ লস গণনা করে।
প্রান্তিকতা ট্র্যাকিং কৌশলটির কেন্দ্রবিন্দু হল হাল চলমান গড়। হাল চলমান গড় দামের পরিবর্তনের জন্য আরও সংবেদনশীল এবং প্রবণতার দিকটি কার্যকরভাবে নির্ধারণ করতে পারে। যখন দামগুলি হাল লাইনটি অতিক্রম করে, তখন একটি উচ্চতর প্রবণতা গঠনের বিষয়টি নিশ্চিত করে, আরও বেশি করে; যখন দামগুলি হাল লাইনটি অতিক্রম করে, তখন একটি নিম্নমুখী প্রবণতা গঠনের বিষয়টি নিশ্চিত করে, খালি করে দেয়।
এছাড়াও, কৌশলটি একটি বেঞ্চমার্ক সূচক প্রবর্তন করে, যা দীর্ঘ-স্বল্প প্রবণতা নির্ধারণের জন্য ব্যবহৃত হয়; একটি নিশ্চিতকরণ সূচক, যা মিথ্যা ব্রেকআউটগুলিকে ফিল্টার করার জন্য ব্যবহৃত হয়। কেবলমাত্র যখন বেঞ্চমার্ক এবং নিশ্চিতকরণ সূচক উভয়ই প্রবণতার দিকনির্দেশ যাচাই করে তখনই একটি ট্রেডিং সংকেত প্রেরণ করা হয়।
ট্রেডিংয়ের পরে, কৌশলটি এটিআর এবং হুল ইএমএর দ্বারা গণনা করা গড় বাস্তব তরঙ্গের ব্যবহার করে স্টপ পজিশন সেট করে। প্রবণতা অব্যাহত থাকায়, স্টপ লাইনটিও ক্রমাগত উপরে / নীচে স্থানান্তরিত হয়, যাতে ট্রেন্ডের মুনাফা লক করা যায়।
সমান্তরাল ট্র্যাকিং কৌশলটি প্রবণতা বিচার এবং ঝুঁকি নিয়ন্ত্রণের সুবিধাগুলি একত্রিত করে, যা প্রবণতার পরিস্থিতিতে আরও ভাল আয় করতে পারে। স্থির স্টপ কৌশলগুলির তুলনায়, এটি প্রবণতা চালানোর জন্য একটি চলমান স্টপ অনুসরণ করতে পারে, যাতে বাজারের স্বাভাবিক ওঠানামা দ্বারা ক্ষতিগ্রস্থ না হয়।
অনেকগুলি সূচকের সংমিশ্রণ ব্যবহার কৌশলটিকে বাজারের পরিবর্তনের প্রতি আরও সংবেদনশীল করে তোলে এবং কার্যকরভাবে মিথ্যা সংকেতগুলি ফিল্টার করতে পারে। তদতিরিক্ত, কৌশলটি একাধিক প্যারামিটার সরবরাহ করে যা ব্যবহারকারীরা বাজার সম্পর্কে তাদের নিজস্ব বিচারের উপর ভিত্তি করে অপ্টিমাইজ করতে পারে।
এই কৌশলটি মূলত প্রবণতা সূচকগুলির উপর নির্ভর করে, যা সমন্বয় করার সময় ত্রুটিযুক্ত সংকেত এবং স্টপ লস হতে পারে। এছাড়াও, একাধিক সূচক সমন্বয় সূচক সংঘর্ষের ক্ষেত্রেও ঘটতে পারে। প্যারামিটার সেট করার ভুল পদ্ধতিও কৌশলটির দুর্বল পারফরম্যান্সের কারণ হতে পারে
কৌশলটিতে অতিরিক্ত বিচারক মডিউল যুক্ত করার কথা বিবেচনা করা যেতে পারে, সূচকগুলি মতবিরোধের ক্ষেত্রে ট্রেডিং স্থগিত করা যেতে পারে; বা একাধিক সূচকের বিচার ফলাফলকে একত্রিত করার জন্য একটি ভোটদান ব্যবস্থা গ্রহণ করা যেতে পারে। প্যারামিটার সেটিংয়ের দিক থেকে, সেরা প্যারামিটারগুলি ফিডব্যাক অপ্টিমাইজেশন পদ্ধতির মাধ্যমে পাওয়া যেতে পারে।
সমান্তরাল ট্র্যাকিং কৌশলটি নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যেতে পারেঃ
সমান্তরাল ট্র্যাকিং কৌশলটি সামগ্রিকভাবে একটি দুর্দান্ত ট্রেন্ড ট্র্যাকিং কৌশল। এটি সফলভাবে প্রবণতা বিচার এবং গতিশীল স্টপ লসকে একত্রিত করে, যা কার্যকরভাবে প্রবণতা অনুসরণ করে। আরও অপ্টিমাইজেশনের মাধ্যমে, আরও ভাল কৌশল পারফরম্যান্সের প্রত্যাশা রয়েছে। কৌশলটি পরিমাণগত ব্যবসায়ের কৌশল তৈরির জন্য একটি ভাল রেফারেন্স সরবরাহ করে।
/*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")