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

মিনটেম ব্রেকআউট এবং এনগলফিং প্যাটার্ন অ্যালগরিদমিক ট্রেডিং কৌশল

লেখক:চাওঝাং, তারিখঃ 2024-01-30 17:20:59
ট্যাগঃ

img

সারসংক্ষেপ

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

নীতিমালা

এই কৌশলটির মূল যুক্তি দুটি সম্পর্কহীন সূচকগুলির সংযোজন উপর ভিত্তি করেঃ

  1. গ্লোফিং প্যাটার্ন: একটি দুই-ক্যান্ডেলস্টিক বিপরীত প্যাটার্ন যেখানে দ্বিতীয় মোমবাতিটির দেহ সম্পূর্ণরূপে প্রথমটির দেহকে গ্লোফ করে, বিপরীত সুযোগগুলি সনাক্ত করতে ব্যবহৃত হয়।

  2. চলমান গড়ের সাথে মূল্য ক্রসওভারঃ যখন দাম নীচে থেকে চলমান গড় রেখার উপরে অতিক্রম করে তখন একটি ক্রয় সংকেত উত্পন্ন হয়; যখন দাম উপরে থেকে চলমান গড় রেখার নীচে অতিক্রম করে তখন একটি বিক্রয় সংকেত হয়।

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

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

সুবিধা

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

আরেকটি সুবিধা হল প্যারামিটার সেটিংসের নমনীয়তা। ব্যবহারকারীরা কৌশলটি নিজেরাই অপ্টিমাইজ করার জন্য চলমান গড় সময়কাল এবং স্টপ লস রেঞ্জের মতো প্যারামিটার সেট করতে পারেন।

ঝুঁকি

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

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

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

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

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

  1. ওজনযুক্ত চলমান গড়, দ্বিগুণ মসৃণ চলমান গড় ইত্যাদির মতো সর্বোত্তম প্যারামিটার সেটগুলি খুঁজে পেতে আরও চলমান গড়ের ধরণের পরীক্ষা করুন

  2. পার্শ্ববর্তী বাজারে পজিশন খোলার এড়ানোর জন্য প্রবণতা মূল্যায়ন সূচক যোগ করুন। উদাহরণস্বরূপ এডিএক্স, বলিংজার ব্যান্ড ইত্যাদি।

  3. কার্যকারিতা উন্নত করার জন্য স্টপ লস পদ্ধতি অপ্টিমাইজ করুন। ট্রেইলিং স্টপ লস, চ্যান্ডেলিয়ার এক্সট বিবেচনা করা যেতে পারে।

  4. মোমবাতি প্যাটার্ন বিচার করতে মেশিন লার্নিং পদ্ধতি বাড়ান এবং গ্লোফিং স্বীকৃতি সঠিকতা উন্নত করুন।

  5. অভিযোজিত সমন্বয় জন্য পরামিতি অপ্টিমাইজেশান ফাংশন যোগ করুন.

সিদ্ধান্ত

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


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


আরো