পরিমাণগত অসিলেটরের উপর ভিত্তি করে সমন্বয় কৌশল


সৃষ্টির তারিখ: 2024-02-27 16:46:42 অবশেষে সংশোধন করুন: 2024-02-27 16:46:42
অনুলিপি: 3 ক্লিকের সংখ্যা: 653
1
ফোকাস
1617
অনুসারী

পরিমাণগত অসিলেটরের উপর ভিত্তি করে সমন্বয় কৌশল

ওভারভিউ

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

কৌশল নীতি

এই নীতিটি চারটি মূলধারার উপর ভিত্তি করে নির্ণয় করা হয়েছেঃ

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

বিশেষভাবে, কৌশলটির চারটি প্রবেশের শর্ত হলঃ মার্জিত কম্পন সূচক সংকেত লাইন এবং চক্রীয় সূচক সংকেত লাইন একই সাথে ঊর্ধ্বগামী হয় ০; মূল লাইনটি চক্রের লাইনটি ভেঙে দেয় ০; মূল লাইনটি ঊর্ধ্বগামী তাত্ক্ষণিক প্রবণতা লাইনের চেয়ে বেশি; স্পিলম্যান গ্রেডের সংশ্লিষ্ট সহগ ধনাত্মক ০।

কিন্তু আউট হওয়ার শর্ত অনেক সহজ, যখন মূল লাইনটি ক্ষণস্থায়ী প্রবণতা লাইনটি অতিক্রম করে তখনই প্লেইন করা হয়।

শূন্য শর্তটি একাধিক শর্তের মতো, কেবলমাত্র বিচার শর্তটি বিপরীত হতে পারে।

সামর্থ্য বিশ্লেষণ

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

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

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

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

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

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

অপ্টিমাইজেশান দিক

এই নীতিটি নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যায়ঃ

  1. এড়ানোর জন্য স্টপ মেশিন যোগ করুন। ইতিহাসের পুনরাবৃত্তির তথ্যের উপর ভিত্তি করে সর্বাধিক প্রত্যাহার গণনা করুন এবং সেই অনুযায়ী স্টপ পয়েন্ট সেট করুন।

  2. ফিল্টার যুক্ত করুন। MACD, ব্রিনব্যান্ড ইত্যাদির মতো সূচকগুলিকে একাধিক স্তর ফিল্টার করার জন্য যুক্ত করুন, যা মিথ্যা সংকেতকে আরও কমিয়ে দেয়।

  3. আরও সময়কালের সাথে যুক্ত করুন। বর্তমানে কেবলমাত্র একটি প্যারামিটার রয়েছে, আরও সময়কালের প্যারামিটারগুলি প্রবর্তন করা যেতে পারে, মাল্টি-টাইম-অক্ষ যাচাইকরণ পদ্ধতি ব্যবহার করে স্থিতিশীলতা বাড়ানো যায়।

  4. প্যারামিটার অপ্টিমাইজেশান মডিউল যোগ করা হয়েছে, যা বিভিন্ন বাজারের অবস্থার উপর ভিত্তি করে সূচক প্যারামিটারগুলিকে গতিশীলভাবে সামঞ্জস্য করে, যাতে কৌশলগুলি আরও অভিযোজিত হয়।

  5. মাল্টি-প্রজাতি বাজারজাতকরণ। বিভিন্ন জাতের জন্য কৌশল প্রয়োগ করুন, বাজারজাতকরণের সুযোগগুলি সন্ধান করুন এবং ঝুঁকিগুলি আরও নিয়ন্ত্রণ করুন।

সারসংক্ষেপ

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

কৌশল সোর্স কোড
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai

//@version=5
strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100)

// -- Inputs --
inp = input(title='Source', defval=close)
res = input.timeframe(title='Resolution', defval='')
bar = input(title='Allow Bar Color Change?', defval=true)
src = inp
length = input.int(title='Length', defval=20, minval=2, maxval=300)
rmsLength = input.int(title='Rms Length', defval=50, minval=2)
decyclerLength = length

// -- Calculation --
// Ehlers Elegant Oscillator
a1 = math.exp(-1.414 * math.pi / length)
b1 = 2 * a1 * math.cos(1.414 * math.pi / length)
c2 = b1
c3 = -a1 * a1
c1 = 1 - c2 - c3

deriv = src - nz(src[2])
rms = math.avg(math.pow(deriv, 2), rmsLength)
rms := rms != 0 ? math.sqrt(rms) : 0
nDeriv = rms != 0 ? deriv / rms : 0
iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0

ss = 0.0
ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2]))
ssSig = ta.wma(ss, length)

slo = ss - ssSig
sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0
eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black

hline(0)
plot(ssSig, title='EO', color=eoColor, linewidth=2)

// Ehlers Decycler
pi = 2 * math.asin(1)
twoPiPrd = 2 * pi / decyclerLength
alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd)

dec = 0.0
dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1]))

decyclerSig = src > dec ? 1 : src < dec ? -1 : 0
decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black
plot(dec, title='Decycler', color=decColor, linewidth=2)

// Ehlers Instantaneous Trendline
getItrend(src, alpha) =>
    Price = src
    Smooth = 0.0
    ITrend = 0.0
    Trigger = 0.0
    
    ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha  * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2])
    if(bar_index < 7)
        ITrend := (Price + 2 * Price[1] + Price[2]) / 4
    Trigger := 2 * ITrend - ITrend[2]
    [ITrend, Trigger]

itrendAlpha = 2 / (length + 1) / 2
[iT, Tr] = getItrend(src, itrendAlpha)

iTColor = Tr > iT ? color.aqua : color.maroon
plot(iT, 'Instantaneous Trend', iTColor, 2)

// Ehlers Spearman Rank
priceArray = array.new_float(300, 0.0)
rank = array.new_float(300, 0.0)
for i = 1 to length
    array.set(priceArray, i, nz(src[i - 1]))
    array.set(rank, i, i)

for i = 1 to length
    count = length + 1 - i
    for j = 1 to length - count
        if array.get(priceArray, j + 1) < array.get(priceArray, j)
            tempPrice = array.get(priceArray, j)
            tempRank = array.get(rank, j)
            array.set(priceArray, j, array.get(priceArray, j + 1))
            array.set(rank, j, array.get(rank, j + 1))
            array.set(priceArray, j + 1, tempPrice)
            array.set(rank, j + 1, tempRank)
         
sum = 0.0   
for i = 1 to length
    sum := sum + math.pow(i - array.get(rank, i), 2)
signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1)))))
spearmanSlo = signal - nz(signal[1])
spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0

// -- Signals --
bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0
bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0
bool exitLong = ta.crossunder(src[100], iT) 
bool exitShort = ta.crossover(src[100], iT)

barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray)

// -- Long Exits --
strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG')

// -- Short Exits --
strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT')

bool isStrategyEntryEnabled = true
// -- Long Entries --
if (isStrategyEntryEnabled)
    strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG')
else
    strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG')

// -- Short Entries --
if (isStrategyEntryEnabled)
    strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT')
else
    strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')