
এই নিবন্ধটি একটি অ্যালগরিদমিক ট্রেডিং কৌশল সম্পর্কে আলোচনা করে যা লাভের সুযোগগুলি সনাক্ত করে এবং মুভিং এভারেজের সাথে দামের ক্রসকে প্রবেশের সংকেত হিসাবে ব্যবহার করে। এই কৌশলটি মূল্যের প্রযুক্তিগত বিশ্লেষণ এবং প্রবণতা ট্র্যাকিংয়ের পদ্ধতিগুলিকে সংযুক্ত করে, যা সংকলন এবং প্রবণতা বিপরীত বিন্দু লাভের লক্ষ্যে।
এই কৌশলটির কেন্দ্রীয় যুক্তি দুটি অপ্রাসঙ্গিক সূচকের সংমিশ্রণের উপর ভিত্তি করেঃ
গ্রাস মোডঃ একটি K-লাইন বিপরীত মোড, যেখানে দ্বিতীয় K-লাইনের সত্তা প্রথম K-লাইনের সত্তাকে সম্পূর্ণরূপে গ্রাস করে। এটি বিপরীত হওয়ার সুযোগ সনাক্ত করতে ব্যবহৃত হয়।
দাম এবং চলমান গড়ের ক্রসঃ যখন দাম চলমান গড়ের নীচে থেকে ক্রস চলমান গড়কে অতিক্রম করে তখন একটি ক্রয় সংকেত উত্পন্ন হয়; যখন দাম চলমান গড়ের উপরে থেকে ক্রস চলমান গড়কে অতিক্রম করে তখন একটি বিক্রয় সংকেত উত্পন্ন হয়।
বাজারের সম্ভাব্য বিপর্যয়ের সময় নির্ধারণ করে এবং মুভিং এভারেজের সাথে দামের ক্রসিংয়ের মাধ্যমে বিপর্যয়ের ফিল্টারিং সিগন্যাল হিসাবে ব্যবহার করে মুনাফা অর্জনের সম্ভাবনা বাড়িয়ে তুলতে পারে।
বিশেষভাবে, এই কৌশলটি তিনটি গ্রাসের ফর্ম্যাটগুলি ট্র্যাক করেঃ মাল্টি-হেড গ্রাস, খালি হেড গ্রাস এবং শ্যাডলাইট গ্রাস, সমন্বয় এবং বিপরীত হওয়ার সম্ভাবনা নির্ধারণ করে। দামের সাথে চলমান গড়ের গোল্ডফোর্ক এবং ডেডফোর্কের সংকেতগুলি ফিল্টার করার পরে, অবশেষে পজিশনের দিকনির্দেশের সিদ্ধান্ত নেওয়া হয়।
এই কৌশলটির সবচেয়ে বড় সুবিধা হল সিদ্ধান্তের কার্যকারিতা বাড়ানোর জন্য অপ্রাসঙ্গিক সূচকগুলির সংমিশ্রণ ব্যবহার করা। গ্রাসকারী ফর্ম্যাটগুলি বাজার বিপরীত হওয়ার সময় এবং সম্ভাবনা নির্ধারণ করে; এবং দামগুলি এবং চলমান গড়গুলি বিপরীত দিকের দিকনির্দেশ এবং শক্তি যাচাই করে। উভয়ই পরস্পর যাচাই করে, যা কার্যকরভাবে মিথ্যা সংকেতের ফলে ট্রেডিং ক্ষতি হ্রাস করতে পারে।
আরেকটি সুবিধা হল প্যারামিটার সেটিংয়ের নমনীয়তা। ব্যবহারকারীরা তাদের নিজস্ব প্যারামিটার সেট করতে পারেন যেমন চলমান গড় সময়কাল, স্টপ লস, এবং অন্যান্য কৌশলগুলিকে অপ্টিমাইজ করতে পারে।
যদিও বিভিন্ন সূচক ব্যবহার করা হয়, তবে এই কৌশলটি ভুল সংকেতের ঝুঁকি নিয়ে আসে। গ্রাস করা মোডটি শতভাগ নির্ভরযোগ্য বিপরীতমুখী সংকেত নয়, এবং দামের সাথে চলমান গড়ের ক্রসগুলিও অকার্যকর হতে পারে। এগুলি অগ্রিম পজিশনের ক্ষতি হতে পারে।
তদুপরি, বেশিরভাগ প্রযুক্তিগত বিশ্লেষণ কৌশলগুলির মতো, এই কৌশলটি সংঘর্ষের পরিস্থিতিতে যেমন দামের ঝড়ের মতো স্থির বাজারে দুর্বল কার্যকারিতা দেখায়। অবিচ্ছিন্ন ঝড়ের ফলে স্টপ লস বা লাভের স্থান হ্রাস হতে পারে।
ঝুঁকি নিয়ন্ত্রণের জন্য, চলমান গড়ের প্যারামিটারগুলি যথাযথভাবে সামঞ্জস্য করা যেতে পারে, ক্ষতির স্তরকে অনুকূলিতকরণ করা যায়। অন্যান্য সূচকগুলির সাথে প্রবণতা এবং ঝড়ের পরিস্থিতি সনাক্তকরণের সাথে মিলিতভাবে, গতিশীল সমন্বয় কৌশলটির অংশগ্রহণের মাত্রা বিবেচনা করা যেতে পারে।
এই কৌশলটি নিম্নলিখিত উপায়ে উন্নত করা যেতে পারেঃ
আরো অনেক প্রকারের চলমান গড় পরীক্ষা করা হয়, যাতে সর্বোত্তম প্যারামিটার সমন্বয় খুঁজে পাওয়া যায়। উদাহরণস্বরূপ, ভারী চলমান গড়, চলমান গড়ের ধারাবাহিক মসৃণতা ইত্যাদি।
প্রবণতা নির্ধারণের সূচকগুলি বাড়ান এবং অস্থিরতার জন্য পজিশন তৈরি করা এড়িয়ে চলুন। যেমন ADX, বুলিন ব্যান্ড ইত্যাদি।
অপ্টিমাইজ করা স্টপ পদ্ধতি, স্টপ এফেক্ট বাড়ানো। স্টপ ট্র্যাকিং, চ্যান্ডেলিয়ার এক্সট ইত্যাদি স্টপ কৌশল বিবেচনা করা যেতে পারে।
মেশিন লার্নিং পদ্ধতিতে কে-লাইন আকৃতির বিচার করার জন্য এবং খাওয়ার স্বীকৃতির নির্ভুলতা বাড়ানোর জন্য।
স্বয়ংক্রিয় প্যারামিটার অপ্টিমাইজেশান বৈশিষ্ট্য যোগ করা হয়েছে যাতে প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে মানিয়ে নেওয়া যায়।
এই কৌশলটি পরিবর্তনের সময়কালের সিদ্ধান্ত নেওয়ার জন্য ফর্ম্যাটকে গ্রাস করে এবং মূল্য এবং চলমান গড়ের সাথে ক্রস-যাচাই করে। এটি একটি প্রযুক্তিগত বিশ্লেষণ কৌশল যা সূচক সংমিশ্রণের মাধ্যমে সিদ্ধান্তের কার্যকারিতা বাড়ায়। সুবিধাগুলি হ’ল সূচকগুলি পরস্পরের সাথে মিলিত হয়, প্যারামিটারগুলি নমনীয়; অসুবিধাটি হ’ল এখনও মিথ্যা সংকেত ঝুঁকি রয়েছে, অস্থিরতার জন্য দুর্বল। চলমান গড় প্যারামিটার, স্টপ লস পদ্ধতি, প্রবণতা বিচার এবং অন্যান্য পদ্ধতি যুক্ত করে কৌশলটির কার্যকারিতা আরও বাড়ানো যেতে পারে।
/*backtest
start: 2023-12-30 00:00:00
end: 2024-01-29 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
//@author=Daveatt
StrategyName = "BEST Engulfing + MA"
ShortStrategyName = "BEST Engulfing + MA"
strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true)
includeEngulfing = true
includeMA = true
source_ma = input(title="Source Price vs MA", type=input.source, defval=close)
typeofMA = input(title="Type of MA", defval="SMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "KMA", "TMA", "HullMA", "DEMA", "TEMA"])
length_ma = input(32, title = "MA Length", type=input.integer)
// ---------- Candle components and states
GreenCandle = close > open
RedCandle = close < open
NoBody = close==open
Body = abs(close-open)
// bullish conditions
isBullishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
isBullishEngulfing2 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) <= min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
// bearish conditions
isBearishEngulfing1 = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
isBearishEngulfing2 = max(close[1],open[1]) >= max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
// consolidation of conditions
isBullishEngulfing = isBullishEngulfing1 or isBullishEngulfing2
isBearishEngulfing = isBearishEngulfing1 or isBearishEngulfing2
//isBullishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and GreenCandle and RedCandle[1]
//isBearishEngulfing = max(close[1],open[1]) < max(close,open) and min(close[1],open[1]) > min(close,open) and Body > Body[1] and RedCandle and GreenCandle[1]
Engulf_curr = 0 - barssince(isBearishEngulfing) + barssince(isBullishEngulfing)
Engulf_Buy = Engulf_curr < 0 ? 1 : 0
Engulf_Sell = Engulf_curr > 0 ? 1 : 0
// Price vs MM
smma(src, len) =>
smma = 0.0
smma := na(smma[1]) ? sma(src, len) : (smma[1] * (len - 1) + src) / len
smma
ma(smoothing, src, length) =>
if smoothing == "RMA"
rma(src, length)
else
if smoothing == "SMA"
sma(src, length)
else
if smoothing == "EMA"
ema(src, length)
else
if smoothing == "WMA"
wma(src, length)
else
if smoothing == "VWMA"
vwma(src, length)
else
if smoothing == "SMMA"
smma(src, length)
else
if smoothing == "HullMA"
wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
else
if smoothing == "LSMA"
src
else
if smoothing == "KMA"
xPrice = src
xvnoise = abs(xPrice - xPrice[1])
nfastend = 0.666
nslowend = 0.0645
nsignal = abs(xPrice - xPrice[length])
nnoise = sum(xvnoise, length)
nefratio = iff(nnoise != 0, nsignal / nnoise, 0)
nsmooth = pow(nefratio * (nfastend - nslowend) + nslowend, 2)
nAMA = 0.0
nAMA := nz(nAMA[1]) + nsmooth * (xPrice - nz(nAMA[1]))
nAMA
else
if smoothing == "TMA"
sma(sma(close, length), length)
else
if smoothing == "DEMA"
2 * src - ema(src, length)
else
if smoothing == "TEMA"
3 * (src - ema(src, length)) + ema(ema(src, length), length)
else
src
MA = ma(typeofMA, source_ma, length_ma)
plot(MA, color=#006400FF, title="MA breakout", linewidth=3)
macrossover = crossover (source_ma, MA)
macrossunder = crossunder(source_ma, MA)
since_ma_buy = barssince(macrossover)
since_ma_sell = barssince(macrossunder)
macross_curr = 0 - since_ma_sell + since_ma_buy
bullish_MA_cond = macross_curr < 0 ? 1 : 0
bearish_MA_cond = macross_curr > 0 ? 1 : 0
posUp = (Engulf_Buy ? 1 : 0) + (bullish_MA_cond ? 1 : 0)
posDn = (Engulf_Sell ? 1 : 0) + (bearish_MA_cond ? 1 : 0)
conditionUP = posUp == 2 and posUp[1] < 2
conditionDN = posDn == 2 and posDn[1] < 2
sinceUP = barssince(conditionUP)
sinceDN = barssince(conditionDN)
// primary-first signal of the trend
nUP = crossunder(sinceUP,sinceDN)
nDN = crossover(sinceUP,sinceDN)
// and the following secondary signals
// save of the primary signal
sinceNUP = barssince(nUP)
sinceNDN = barssince(nDN)
buy_trend = sinceNDN > sinceNUP
sell_trend = sinceNDN < sinceNUP
// engulfing by
barcolor(nUP ? color.orange : na, title="Bullish condition")
barcolor(nDN ? color.yellow : na, title="Bearish condition")
isLong = nUP
isShort = nDN
long_entry_price = valuewhen(nUP, close, 0)
short_entry_price = valuewhen(nDN, close, 0)
longClose = close[1] < MA
shortClose = close[1] > MA
///////////////////////////////////////////////
//* Backtesting Period Selector | Component *//
///////////////////////////////////////////////
StartYear = input(2017, "Backtest Start Year",minval=1980)
StartMonth = input(1, "Backtest Start Month",minval=1,maxval=12)
StartDay = input(1, "Backtest Start Day",minval=1,maxval=31)
testPeriodStart = timestamp(StartYear,StartMonth,StartDay,0,0)
StopYear = input(2020, "Backtest Stop Year",minval=1980)
StopMonth = input(12, "Backtest Stop Month",minval=1,maxval=12)
StopDay = input(31, "Backtest Stop Day",minval=1,maxval=31)
testPeriodStop = timestamp(StopYear,StopMonth,StopDay,0,0)
testPeriod() => true
//////////////////////////
//* Profit Component *//
//////////////////////////
input_tp_pips = input(600, "Backtest Profit Goal (in USD)",minval=0)
input_sl_pips = input(300, "Backtest STOP Goal (in USD)",minval=0)
tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips
sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips
long_TP_exit = buy_trend and high >= tp
short_TP_exit = sell_trend and low <= tp
plot(tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue)
plot(sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red)
if testPeriod()
strategy.entry("Long", 1, when=isLong)
strategy.close("Long", when=longClose )
strategy.exit("XL","Long", limit=tp, when=buy_trend, stop=sl)
if testPeriod()
strategy.entry("Short", 0, when=isShort)
strategy.close("Short", when=shortClose )
strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)