ওমা এবং অ্যাপোলো ডুয়াল রেল ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

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

কৌশল নীতি

এই কৌশলটি মাঝারি দীর্ঘমেয়াদী প্রবণতা নির্ধারণের জন্য 50-দিন এবং 200-দিনের চলমান গড় ব্যবহার করে। 200-দিনের লাইনের উপরে 50-দিনের রেখা একটি উত্থান প্রবণতা নির্দেশ করে এবং বিপরীতভাবে একটি হ্রাস প্রবণতা।

পরবর্তী, কৌশলটি স্বল্পমেয়াদী মূল্য বিপরীতমুখী সুযোগগুলি সনাক্ত করতে ওমা সূচক ব্যবহার করে। ওমা সূচকটিতে %K এবং %D লাইন অন্তর্ভুক্ত রয়েছে, যা একটি সাধারণ চলমান গড় দ্বারা মসৃণ করা RSI সূচকের ফলাফল। যখন %K ওভারক্রয় এলাকা থেকে %D এর নীচে (80 এর উপরে) ভেঙে যায়, তখন এটি নির্দেশ করে যে দামটি একটি ওভারক্রয় অবস্থা থেকে একটি pullback নেমে যাচ্ছে; যখন %K ওভারসোল এলাকা থেকে %D এর উপরে (২০ এর নীচে) ভেঙে যায়, তখন এটি নির্দেশ করে যে দামটি ওভারসোল এলাকা থেকে পুনরুদ্ধার করছে, যা একটি দীর্ঘ সুযোগ উপস্থাপন করে।

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

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

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

কৌশলটির সুবিধা

  1. কৌশলটি ট্রেন্ড ট্রেডিং এবং কাউন্টার ট্রেন্ড ট্রেডিংকে একত্রিত করে, ট্রেন্ড বিচার এবং বিপরীতমুখী সূচক উভয়ই ব্যবহার করে, একটি স্থিতিশীল হাইব্রিড ট্রেডিং কাঠামো গঠন করে।

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

  3. কৌশলগত পরামিতিগুলি তুলনামূলকভাবে সহজ, সহজেই বোঝা যায় এবং অপ্টিমাইজ করা যায়, যা পরিমাণগত ট্রেডিংয়ের জন্য উপযুক্ত।

  4. এই কৌশলটির পারফরম্যান্স শক্তিশালী, ভাল জয় হার এবং ঝুঁকি-প্রতিফল অনুপাতের বৈশিষ্ট্য রয়েছে।

  5. দীর্ঘ এবং সংক্ষিপ্ত জন্য দ্বৈত রেল গ্রহণ করে, একটি একক দিক সীমাবদ্ধ না করেই ট্রেডিং সুযোগ অবিচ্ছিন্নভাবে প্রাপ্ত করা যেতে পারে।

কৌশলটির ঝুঁকি

  1. একটি বিপরীতমুখী কৌশল হিসাবে, প্রবণতা পরিবর্তনের সময় ধারাবাহিক ক্ষতি হতে পারে।

  2. এই কৌশলটি ব্যবসায়ীর কাছ থেকে তুলনামূলকভাবে উচ্চ মানসিক নিয়ন্ত্রণের প্রয়োজন, যার একটি নির্দিষ্ট স্তরের ড্রডাউন সহ্য করতে হবে।

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

  4. ওমা এবং অ্যাপোলো উভয় সূচকই অস্বাভাবিক ওঠানামাতে কিছুটা সংবেদনশীল এবং চরম বাজারের পরিস্থিতিতে ব্যর্থ হতে পারে।

  5. এই কৌশলটি রেঞ্জ-বান্ধব অস্থির বাজারগুলির জন্য আরও উপযুক্ত এবং শক্তিশালী প্রবণতা বাজারে কম পারফর্ম করতে পারে।

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

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

  1. আরও ভাল প্যারামিটার সেটিং পাওয়ার জন্য বিভিন্ন প্যারামিটার সমন্বয় পরীক্ষা করুন, উদাহরণস্বরূপ EWMA সমতল চলমান গড় ব্যবহার করে।

  2. ভলিউম বা BV সূচক যোগ করুন যাতে ডিভার্জেন্স বিচার করা যায় যা সিগন্যাল নির্ভরযোগ্যতা যাচাই করতে সাহায্য করতে পারে।

  3. ভিআইএক্সের মত ভোল্টেবিলিটি সূচক যোগ করুন, যখন বাজার আতঙ্কিত হয় তখন পজিশনের আকার কমাতে।

  4. স্টপ লস/ট্যাক প্রফিট কৌশলগুলি অপ্টিমাইজ করুন, যেমন গতিশীল এটিআর স্টপ লস গ্রহণ করা।

  5. মেশিন লার্নিং অ্যালগরিদম প্রবর্তন করে গতিশীলভাবে প্যারামিটার সেটিংস অপ্টিমাইজ করা।

  6. সিগন্যালের গুণমান উন্নত করতে মাল্টিফ্যাক্টর মডেল যুক্ত করুন।

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

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


/*backtest
start: 2023-10-25 00:00:00
end: 2023-10-28 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © PtGambler

//@version=5
strategy("2 EMA + Stoch RSI + ATR [Pt]", shorttitle = "2EMA+Stoch+ATR", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500)

// ********************************** Trade Period / Strategy Setting **************************************
startY = input(title='Start Year', defval=2011, group = "Backtesting window")
startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window")
startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window")
finishY = input(title='Finish Year', defval=2050, group = "Backtesting window")
finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window")
finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window")
timestart = timestamp(startY, startM, startD, 00, 00)
timefinish = timestamp(finishY, finishM, finishD, 23, 59)

// ******************************************************************************************

group_ema = "EMA"
group_stoch = "Stochastic RSI"
group_atr = "ATR Stoploss Finder"

// ----------------------------------------- 2 EMA -------------------------------------

ema1_len = input.int(50, "EMA Length 1", group = group_ema)
ema2_len = input.int(200, "EMA Length 2", group = group_ema)

ema1 = ta.ema(close, ema1_len)
ema2 = ta.ema(close, ema2_len)

plot(ema1, "ema1", color.white, linewidth = 2)
plot(ema2, "ema2", color.orange, linewidth = 2)

ema_bull = ema1 > ema2
ema_bear = ema1 < ema2


// -------------------------------------- Stochastic RSI -----------------------------

smoothK = input.int(3, "K", minval=1, group = group_stoch)
smoothD = input.int(3, "D", minval=1, group = group_stoch)
lengthRSI = input.int(14, "RSI Length", minval=1, group = group_stoch)
lengthStoch = input.int(14, "Stochastic Length", minval=1, group = group_stoch)
src = close
rsi1 = ta.rsi(src, lengthRSI)
k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = ta.sma(k, smoothD)

var trigger_stoch_OB = k > 80
var trigger_stoch_OS = k < 20

stoch_crossdown = ta.crossunder(k, d)
stoch_crossup = ta.crossover(k, d)

P_hi = ta.pivothigh(k,1,1)
P_lo = ta.pivotlow(k,1,1)

previous_high = ta.valuewhen(P_hi, k, 1)
previous_low = ta.valuewhen(P_lo, k, 1)
recent_high = ta.valuewhen(P_hi, k, 0)
recent_low = ta.valuewhen(P_lo, k, 0)

// --------------------------------------- ATR stop loss finder ------------------------

length = input.int(title='Length', defval=14, minval=1, group = group_atr)
smoothing = input.string(title='Smoothing', defval='EMA', options=['RMA', 'SMA', 'EMA', 'WMA'], group = group_atr)
m = input.float(0.7, 'Multiplier', step = 0.1, group = group_atr)
src1 = input(high, "Source for upper band", group = group_atr)
src2 = input(low, "Source for lower band", group = group_atr)

showatr = input.bool(true, 'Show ATR Bands', group = group_atr)
collong = input.color(color.purple, 'Long ATR SL', inline='1', group = group_atr)
colshort = input.color(color.purple, 'Short ATR SL', inline='2', group = group_atr)

ma_function(source, length) =>
    if smoothing == 'RMA'
        ta.rma(source, length)
    else
        if smoothing == 'SMA'
            ta.sma(source, length)
        else
            if smoothing == 'EMA'
                ta.ema(source, length)
            else
                ta.wma(source, length)

a = ma_function(ta.tr(true), length) * m
up = ma_function(ta.tr(true), length) * m + src1
down = src2 - ma_function(ta.tr(true), length) * m

p1 = plot(showatr ? up : na, title='ATR Short Stop Loss', color=colshort)
p2 = plot(showatr ? down : na, title='ATR Long Stop Loss', color=collong)

// ******************************* Profit Target / Stop Loss *********************************************

RR = input.float(2.0, "Reward to Risk ratio (X times SL)", step = 0.1, group = "Profit Target")

var L_PT = 0.0
var S_PT = 0.0
var L_SL = 0.0
var S_SL = 0.0

BSLE = ta.barssince(strategy.opentrades.entry_bar_index(0) == bar_index)

if strategy.position_size > 0 and BSLE == 1
    L_PT := close + (close-down)*RR
    L_SL := L_SL[1]
    S_PT := close - (up - close)*RR
    S_SL := up
else if strategy.position_size < 0 and BSLE == 1
    S_PT := close - (up - close)*RR
    S_SL := S_SL[1]
    L_PT := close + (close-down)*RR
    L_SL := down
else if strategy.position_size != 0
    L_PT := L_PT[1] 
    S_PT := S_PT[1]
else
    L_PT := close + (close-down)*RR
    L_SL := down
    S_PT := close - (up - close)*RR
    S_SL := up

entry_line = plot(strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr)

L_PT_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr)
S_PT_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr)

L_SL_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr)
S_SL_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr)

fill(L_PT_line, entry_line, color = color.new(color.green,90))
fill(S_PT_line, entry_line, color = color.new(color.green,90))
fill(L_SL_line, entry_line, color = color.new(color.red,90))
fill(S_SL_line, entry_line, color = color.new(color.red,90))


// ---------------------------------- strategy setup ------------------------------------------------------

var L_entry_trigger1 = false
var S_entry_trigger1 = false

L_entry_trigger1 := ema_bull and close < ema1 and k < 20 and strategy.position_size == 0
S_entry_trigger1 := ema_bear and close > ema1 and k > 80 and strategy.position_size == 0

L_entry1 = L_entry_trigger1[1] and stoch_crossup and recent_low > previous_low
S_entry1 = S_entry_trigger1[1] and stoch_crossdown and recent_high < previous_high

//debugging
plot(L_entry_trigger1[1]?1:0, "L Entry Trigger")
plot(stoch_crossup?1:0, "Stoch Cross Up")
plot(recent_low > previous_low?1:0, "Higher low")

plot(S_entry_trigger1[1]?1:0, "S Entry Trigger")
plot(stoch_crossdown?1:0, "Stoch Cross down")
plot(recent_high < previous_high?1:0, "Lower high")

if L_entry1
    strategy.entry("Long", strategy.long)

if S_entry1
    strategy.entry("Short", strategy.short)

strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit")
strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit")

//resetting triggers
L_entry_trigger1 := L_entry_trigger1[1] ? L_entry1 or ema_bear or S_entry1 ? false : true : L_entry_trigger1
S_entry_trigger1 := S_entry_trigger1[1] ? S_entry1 or ema_bull or L_entry1 ? false : true : S_entry_trigger1

//Trigger zones
bgcolor(L_entry_trigger1 ? color.new(color.green ,90) : na)
bgcolor(S_entry_trigger1 ? color.new(color.red,90) : na)

আরো