এর্গোটিক ডুয়াল-রেল বিপরীত MACD পরিমাণগত ট্রেডিং কৌশল

লেখক:চাওঝাং, তারিখ: ২০২৩-১২-২১ ১১ঃ০৭ঃ৫১
ট্যাগঃ

img

সারসংক্ষেপ

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

নীতিমালা

এই কৌশলটির মূল সূচক হল এমএসিডি। এটি দ্রুত চলমান গড় ইএমএ এবং ধীর চলমান গড় ইএমএ ((slowMALen) গণনা করে, তারপরে তাদের পার্থক্য xmacd গণনা করে। এটি xmacd এর ইএমএ ((সিগন্যাললংথ) গণনা করে xMA_MACD পেতে। যখন xmacd xMA_MACD এর উপরে অতিক্রম করে তখন একটি দীর্ঘ সংকেত ট্রিগার হয়, এবং একটি সংক্ষিপ্ত সংকেত নীচে একটি ক্রস ট্রিগার হয়। এই কৌশলটির মূল দিকটি বিপরীত ট্রেডিং সংকেত, অর্থাৎ xmacd এবং xMA_MACD এর মধ্যে সম্পর্কটি প্রচলিত এমএসিডি সূচকের বিপরীত, যা থেকে রিভার্স এমএসিডি নামটিও আসে।

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

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

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

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

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

ঝুঁকি হ্রাস করার জন্য, পরামিতিগুলি অপ্টিমাইজ করা যেতে পারে - চলমান গড় দৈর্ঘ্যের সমন্বয়; প্রবণতা এবং সূচক ফিল্টারগুলির সংমিশ্রণ অস্থির বাজারে সংকেতগুলি এড়ায়; স্টপ লস দূরত্ব বাড়ানো পৃথক ব্যবসায়ের উপর সীমাবদ্ধ ক্ষতি নিশ্চিত করে।

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

কৌশলটি বিভিন্ন দিক থেকে উন্নত করা যেতে পারে:

  1. দ্রুত এবং ধীর রেল পরামিতি সামঞ্জস্য করুন, চলন্ত গড় দৈর্ঘ্য অপ্টিমাইজ করুন, নির্দিষ্ট যন্ত্রের জন্য সর্বোত্তম পরামিতি সেট খুঁজে ব্যাকটেস্ট
  2. প্রবণতা ফিল্টার যোগ করুন বা সামঞ্জস্য করুন, ব্যাকটেস্টের ফলাফল থেকে বিচার করুন যে এটি রিটার্ন উন্নত করে কিনা
  3. সেরা পারফরম্যান্স নির্ধারণের জন্য বিভিন্ন স্টপ লস মেকানিজম, ফিক্সড বা ট্রেলিং পরীক্ষা করুন
  4. অতিরিক্ত ফিল্টার শর্তাবলী সেট করতে এবং সংকেতের গুণমান নিশ্চিত করার জন্য KD, Bollinger Bands এর মতো অন্যান্য সূচকগুলি একত্রিত করার চেষ্টা করুন

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

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


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

//@version = 3
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 09/12/2016
// This is one of the techniques described by William Blau in his book
// "Momentum, Direction and Divergence" (1995). If you like to learn more,
// we advise you to read this book. His book focuses on three key aspects
// of trading: momentum, direction and divergence. Blau, who was an electrical
// engineer before becoming a trader, thoroughly examines the relationship 
// between price and momentum in step-by-step examples. From this grounding,
// he then looks at the deficiencies in other oscillators and introduces some
// innovative techniques, including a fresh twist on Stochastics. On directional 
// issues, he analyzes the intricacies of ADX and offers a unique approach to help 
// define trending and non-trending periods.
// Blau`s indicator is like usual MACD, but it plots opposite of meaningof
// stndard MACD indicator. 
//
// You can change long to short in the Input Settings
// Please, use it only for learning or paper trading. Do not for real trading.
//
//
// 2018-09 forked by Khalid Salomão
// - Backtesting
// - Added filters: RSI, MFI, Price trend
// - Trailing Stop Loss
// - Other minor adjustments
//
////////////////////////////////////////////////////////////
strategy(title="Ergotic MACD Backtester [forked from HPotter]", shorttitle="Ergotic MACD Backtester", overlay=true, pyramiding=0, default_qty_type=strategy.cash, default_qty_value=25000, initial_capital=50000, commission_type=strategy.commission.percent, commission_value=0.15, slippage=3)


// === BACKTESTING: INPUT BACKTEST RANGE ===
source = input(close)
strategyType = input(defval="Long Only", options=["Long & Short", "Long Only", "Short Only"])

FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2030, title = "To Year", minval = 2017)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        
window()  => true // window of time verification

// === STRATEGY ===

r = input(144, minval=1, title="R (32,55,89,100,144,200)") // default 32
slowMALen = input(6, minval=1) // default 32
signalLength = input(6, minval=1)
reverse = input(false, title="Trade reverse (long/short switch)")

//hline(0, color=blue, linestyle=line)

fastMA = ema(source, r)
slowMA = ema(source, slowMALen)
xmacd = fastMA - slowMA
xMA_MACD = ema(xmacd, signalLength)

pos = 0
pos := iff(xmacd < xMA_MACD, 1,
	   iff(xmacd > xMA_MACD, -1, nz(pos[1], 0))) 
possig = 0
possig := iff(reverse and pos == 1, -1,
          iff(reverse and pos == -1, 1, pos))

// === FILTER: price trend ====
trending_price_long = input(true, title="Long only if price has increased" )
trending_price_short = input(false, title="Short only if price has decreased" )
trending_price_length = input( 2, minval=1 )
trending_price_with_ema = input( false )
trending_price_ema = input( 3, minval=1 )
price_trend = trending_price_with_ema ? ema(source, trending_price_ema) : source
priceLongTrend() => (trending_price_long ? rising(price_trend, trending_price_length) : true)
priceShortTrend() => (trending_price_short ? falling(price_trend, trending_price_length) : true)

// === FILTER: RSI ===
rsi_length = input( 14, minval=1 )
rsi_overSold = input( 14, minval=0, title="RSI Sell Cutoff (Sell only if >= #)" )
rsi_overBought = input( 82, minval=0, title="RSI Buy Cutoff (Buy only if <= #)" )

vrsi = rsi(source, rsi_length)
rsiOverbought() => vrsi > rsi_overBought
rsiOversold() => vrsi < rsi_overSold

trending_rsi_long = input(false, title="Long only if RSI has increased" )
trending_rsi_length = input( 2 )
rsiLongTrend() => trending_rsi_long ? rising(vrsi, trending_rsi_length) : true

// === FILTER: MFI ===
mfi_length = input(14, minval=1)
mfi_lower = input(14, minval=0, maxval=50)
mfi_upper = input(82, minval=50, maxval=100)
upper_s = sum(volume * (change(source) <= 0 ? 0 : source), mfi_length)
lower_s = sum(volume * (change(source) >= 0 ? 0 : source), mfi_length)
mf = rsi(upper_s, lower_s)

mfiOverbought() => (mf > mfi_upper)
mfiOversold() => (mf < mfi_lower)

trending_mfi_long = input(false, title="Long only if MFI has increased" )
trending_mfi_length = input( 2 )
mfiLongTrend() => trending_mfi_long ? rising(mf, trending_mfi_length) : true

// === SIGNAL CALCULATION ===
long  = window() and possig == 1 and rsiLongTrend() and mfiLongTrend() and not rsiOverbought() and not mfiOverbought() and priceLongTrend()
short = window() and possig == -1 and not rsiOversold() and not mfiOversold() and priceShortTrend()

// === trailing stop
tslSource=input(hlc3,title="TSL source")
//suseCurrentRes = input(true, title="Use current chart resolution for stop trigger?")
tslResolution = input(title="Use different timeframe for stop trigger? Uncheck box above.", defval="5")
tslTrigger = input(3.0) / 100
tslStop = input(0.6) / 100

currentPrice = request.security(syminfo.tickerid, tslResolution, tslSource, barmerge.gaps_off, barmerge.lookahead_off)

isLongOpen = false
isLongOpen := nz(isLongOpen[1], false)
entryPrice=0.0
entryPrice:= nz(entryPrice[1], 0.0)
trailPrice=0.0
trailPrice:=nz(trailPrice[1], 0.0)

// update TSL high mark
if (isLongOpen )
    if (not trailPrice and currentPrice >= entryPrice * (1 + tslTrigger))
        trailPrice := currentPrice
    else 
        if (trailPrice and currentPrice > trailPrice)
            trailPrice := currentPrice

if (trailPrice and currentPrice <= trailPrice * (1 - tslStop))
    // FIRE TSL SIGNAL
    short:=true // <===
    long := false

// if short clean up
if (short)
    isLongOpen := false
    entryPrice := 0.0
    trailPrice := 0.0

if (long)
    isLongOpen := true
    if (not entryPrice)
        entryPrice := currentPrice

// === BACKTESTING: ENTRIES ===
if long
    if (strategyType == "Short Only")
        strategy.close("Short")
    else
        strategy.entry("Long", strategy.long, comment="Long")

if short
    if (strategyType == "Long Only")
        strategy.close("Long")
    else
        strategy.entry("Short", strategy.short, comment="Short")	  
    
//barcolor(possig == -1 ? red: possig == 1 ? green : blue )
//plot(xmacd, color=green, title="Ergotic MACD")
//plot(xMA_MACD, color=red, title="SigLin")

plotshape(trailPrice ? trailPrice : na, style=shape.circle, location=location.absolute, color=blue, size=size.tiny)

plotshape(long, style=shape.triangleup, location=location.belowbar, color=green, size=size.tiny)
plotshape(short, style=shape.triangledown, location=location.abovebar, color=red, size=size.tiny)

// === Strategy Alert ===
alertcondition(long, title='BUY - Ergotic MACD Long Entry', message='Go Long!')
alertcondition(short, title='SELL - Ergotic MACD Long Entry', message='Go Short!')

// === BACKTESTING: EXIT strategy ===
sl_inp = input(7, title='Stop Loss %', type=float)/100
tp_inp = input(1.8, title='Take Profit %', type=float)/100

stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)

strategy.exit("Stop Loss/Profit", "Long", stop=stop_level, limit=take_level)

আরো