
এই কৌশলটি একটি সহজ ট্রেন্ড ট্র্যাকিং কৌশল বাস্তবায়নের জন্য বিভিন্ন মুভিং এভারেজকে একত্রিত করে।
এই কৌশলটি প্রথমে সমাপ্তির মূল্যকে মসৃণ করে, এবং আপনি হেইকেন আশি সমাপ্তির মূল্য ব্যবহার করবেন কিনা তা চয়ন করতে পারেন। তারপরে একটি মসৃণ এমএ ফাংশন কল করা হয়, যাতে একাধিক স্তরযুক্ত মসৃণ চলমান গড় তৈরি হয়। প্রথমে একটি বৈকল্পিক ফাংশন কল করা হয়, যা বিভিন্ন ধরণের চলমান গড় তৈরি করতে পারে যেমন এসএমএ, ইএমএ, ডিইএমএ ইত্যাদি। একটি নির্দিষ্ট ধরণের এবং দৈর্ঘ্যের চলমান গড় উত্পন্ন করার পরে, একটি মসৃণ এমএ একাধিক স্তরযুক্ত একটি নির্দিষ্ট ধরণের এবং দৈর্ঘ্যের চলমান গড় উত্পন্ন করে।
অন্যান্য সূচক যেমন MACD, KDJ ইত্যাদির সাথে ব্যবহারের কথা বিবেচনা করা যেতে পারে, যাতে ট্রেন্ড সংকেতগুলি আরও সঠিকভাবে সনাক্ত করা যায়। চলন্ত গড় প্যারামিটারগুলি অনুকূলিতকরণ, বিলম্ব হ্রাস। যুক্তিসঙ্গত স্টপ লস লেভেল সেট করুন, একক ক্ষতি নিয়ন্ত্রণ করুন। একই সাথে ট্রেডিং ফ্রিকোয়েন্সি নিয়ন্ত্রণে মনোযোগ দিন, ট্রেডিং ব্যয় হ্রাস করুন।
এই কৌশলটি একাধিক ওভারল্যাপিং মুভিং এভারেজ দ্বারা প্রবণতা ট্র্যাকিং অর্জন করে, যা কার্যকরভাবে বাজারের শব্দকে মুছে ফেলতে পারে। এর সুবিধাটি সহজ এবং সহজেই ব্যবহার করা যায়, প্যারামিটারগুলিকে নমনীয়ভাবে সামঞ্জস্য করা যায়। তবে কেবলমাত্র মুভিং এভারেজ সিস্টেম ব্যবহার করে এখনও লাভজনকতার সীমাবদ্ধতা রয়েছে। অন্যান্য প্রযুক্তিগত সূচকগুলির সাথে ব্যবহারের বিষয়টি বিবেচনা করা যেতে পারে, একই সাথে লেনদেনের ঝুঁকি নিয়ন্ত্রণে, প্যারামিটারগুলি অনুকূলিতকরণে এবং কৌশল দক্ষতা বাড়ানোর বিষয়ে মনোযোগ দেওয়া যেতে পারে।
/*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
// Copyright (c) 2007-present Jurik Research and Consulting. All rights reserved.
// Copyright (c) 2018-present, Alex Orekhov (everget)
// Thanks to everget for code for more advanced moving averages
// Smooth Moving Average [STRATEGY] @PuppyTherapy script may be freely distributed under the MIT license.
strategy( title="Smooth Moving Average [STRATEGY] @PuppyTherapy", overlay=true )
// ---- CONSTANTS ----
lsmaOffset = 1
almaOffset = 0.85
almaSigma = 6
phase = 2
power = 2
// ---- GLOBAL FUNCTIONS ----
kama(src, len)=>
xvnoise = abs(src - src[1])
nfastend = 0.666
nslowend = 0.0645
nsignal = abs(src - src[len])
nnoise = sum(xvnoise, len)
nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2)
nAMA = 0.0
nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))
t3(src, len)=>
xe1_1 = ema(src, len)
xe2_1 = ema(xe1_1, len)
xe3_1 = ema(xe2_1, len)
xe4_1 = ema(xe3_1, len)
xe5_1 = ema(xe4_1, len)
xe6_1 = ema(xe5_1, len)
b_1 = 0.7
c1_1 = -b_1*b_1*b_1
c2_1 = 3*b_1*b_1+3*b_1*b_1*b_1
c3_1 = -6*b_1*b_1-3*b_1-3*b_1*b_1*b_1
c4_1 = 1+3*b_1+b_1*b_1*b_1+3*b_1*b_1
nT3Average_1 = c1_1 * xe6_1 + c2_1 * xe5_1 + c3_1 * xe4_1 + c4_1 * xe3_1
// The general form of the weights of the (2m + 1)-term Henderson Weighted Moving Average
getWeight(m, j) =>
numerator = 315 * (pow(m + 1, 2) - pow(j, 2)) * (pow(m + 2, 2) - pow(j, 2)) * (pow(m + 3, 2) - pow(j, 2)) * (3 * pow(m + 2, 2) - 11 * pow(j, 2) - 16)
denominator = 8 * (m + 2) * (pow(m + 2, 2) - 1) * (4 * pow(m + 2, 2) - 1) * (4 * pow(m + 2, 2) - 9) * (4 * pow(m + 2, 2) - 25)
denominator != 0
? numerator / denominator
: 0
hwma(src, termsNumber) =>
sum = 0.0
weightSum = 0.0
termMult = (termsNumber - 1) / 2
for i = 0 to termsNumber - 1
weight = getWeight(termMult, i - termMult)
sum := sum + nz(src[i]) * weight
weightSum := weightSum + weight
sum / weightSum
get_jurik(length, phase, power, src)=>
phaseRatio = phase < -100 ? 0.5 : phase > 100 ? 2.5 : phase / 100 + 1.5
beta = 0.45 * (length - 1) / (0.45 * (length - 1) + 2)
alpha = pow(beta, power)
jma = 0.0
e0 = 0.0
e0 := (1 - alpha) * src + alpha * nz(e0[1])
e1 = 0.0
e1 := (src - e0) * (1 - beta) + beta * nz(e1[1])
e2 = 0.0
e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
jma := e2 + nz(jma[1])
variant(src, type, len ) =>
v1 = sma(src, len) // Simple
v2 = ema(src, len) // Exponential
v3 = 2 * v2 - ema(v2, len) // Double Exponential
v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential
v5 = wma(src, len) // Weighted
v6 = vwma(src, len) // Volume Weighted
v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len // Smoothed
v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull
v9 = linreg(src, len, lsmaOffset) // Least Squares
v10 = alma(src, len, almaOffset, almaSigma) // Arnaud Legoux
v11 = kama(src, len) // KAMA
ema1 = ema(src, len)
ema2 = ema(ema1, len)
v13 = t3(src, len) // T3
v14 = ema1+(ema1-ema2) // Zero Lag Exponential
v15 = hwma(src, len) // Henderson Moving average thanks to @everget
ahma = 0.0
ahma := nz(ahma[1]) + (src - (nz(ahma[1]) + nz(ahma[len])) / 2) / len //Ahrens Moving Average
v16 = ahma
v17 = get_jurik( len, phase, power, src)
type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 :
type=="SMMA"?v7 : type=="Hull"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : type=="KAMA"?v11 :
type=="T3"?v13 : type=="ZEMA"?v14 : type=="HWMA"?v15 : type=="AHMA"?v16 : type=="JURIK"?v17 : v1
smoothMA(c, maLoop, type, len) =>
ma_c = 0.0
if maLoop == 1
ma_c := variant(c, type, len)
if maLoop == 2
ma_c := variant(variant(c ,type, len),type, len)
if maLoop == 3
ma_c := variant(variant(variant(c ,type, len),type, len),type, len)
if maLoop == 4
ma_c := variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len)
if maLoop == 5
ma_c := variant(variant(variant(variant(variant(c ,type, len),type, len),type, len),type, len),type, len)
ma_c
// Smoothing HA Function
smoothHA( o, h, l, c ) =>
hao = 0.0
hac = ( o + h + l + c ) / 4
hao := na(hao[1])?(o + c / 2 ):(hao[1] + hac[1])/2
hah = max(h, max(hao, hac))
hal = min(l, min(hao, hac))
[hao, hah, hal, hac]
// ---- Main Selection ----
haSmooth = input(false, title=" Use HA as source ? " )
length = input(60, title=" MA1 Length", minval=1, maxval=1000)
maLoop = input(2, title=" Nr. of MA1 Smoothings ", minval=1, maxval=5)
type = input("EMA", title="MA Type", options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA", "SMMA", "Hull", "LSMA", "ALMA", "KAMA", "ZEMA", "HWMA", "AHMA", "JURIK", "T3"])
// ---- BODY SCRIPT ----
[ ha_open, ha_high, ha_low, ha_close ] = smoothHA(open, high, low, close)
_close_ma = haSmooth ? ha_close : close
_close_smoothed_ma = smoothMA( _close_ma, maLoop, type, length)
maColor = _close_smoothed_ma > _close_smoothed_ma[1] ? color.lime : color.red
plot(_close_smoothed_ma, title= "MA - Trend", color=maColor, transp=85, linewidth = 4)
long = _close_smoothed_ma > _close_smoothed_ma[1] and _close_smoothed_ma[1] < _close_smoothed_ma[2]
short = _close_smoothed_ma < _close_smoothed_ma[1] and _close_smoothed_ma[1] > _close_smoothed_ma[2]
plotshape( short , title="Short", color=color.red, transp=80, style=shape.triangledown, location=location.abovebar, size=size.small)
plotshape( long , title="Long", color=color.lime, transp=80, style=shape.triangleup, location=location.belowbar, size=size.small)
//* Backtesting Period Selector | Component *//
//* Source: https://www.tradingview.com/script/eCC1cvxQ-Backtesting-Period-Selector-Component *//
testStartYear = input(2018, "Backtest Start Year",minval=1980)
testStartMonth = input(1, "Backtest Start Month",minval=1,maxval=12)
testStartDay = input(1, "Backtest Start Day",minval=1,maxval=31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = 9999 //input(9999, "Backtest Stop Year",minval=1980)
testStopMonth = 12 // input(12, "Backtest Stop Month",minval=1,maxval=12)
testStopDay = 31 //input(31, "Backtest Stop Day",minval=1,maxval=31)
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)
testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false
if testPeriod() and long
strategy.entry( "long", strategy.long )
if testPeriod() and short
strategy.entry( "short", strategy.short )