স্পাইরাল ব্রেকআউট মুভিং এভারেজ কৌশল

লেখক:চাওঝাং, তারিখঃ 2024-01-15 11:45:23
ট্যাগঃ

img

সারসংক্ষেপ

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

কৌশলগত যুক্তি

কৌশলটি দুটি মূল সূচকের উপর ভিত্তি করেঃ

  1. স্পাইরাল চ্যানেলঃ প্রবণতা দিক নির্ধারণের জন্য উপরের এবং নীচের ব্যান্ডগুলি প্লট করুন। উপরের ব্যান্ডের উপরে দামের ভাঙ্গন আপগ্রেড প্রবণতা নির্দেশ করে, যখন নীচের ব্যান্ডের নীচে ভাঙ্গন হ্রাস প্রবণতার সংকেত দেয়।

  2. পরিবর্তনের হার (আরওসি): দামের ত্বরণ সনাক্ত করুন। একটি ইতিবাচক প্রান্তিকের উপরে আরওসি একটি ত্বরান্বিত দামের গতির পরামর্শ দেয়, যখন নেতিবাচক প্রান্তিকের নীচে আরওসি একটি ত্বরান্বিত নেমে যাওয়া গতির দিকে নির্দেশ করে।

ক্রয় সংকেত তৈরি হয় যখন স্পাইরাল চ্যানেল এবং ROC উভয়ই উত্থানমুখী ইঙ্গিত দেয়, যথা দামের উপরে উপরের ব্যান্ডের উপরে ভাঙ্গন এবং ত্বরান্বিত ঊর্ধ্বমুখী গতির সাথে যুক্ত। বিক্রয় সংকেতগুলি যখন উভয় সূচক bearish হয়ে যায় তখন ট্রিগার হয়।

সংযুক্ত সংকেতগুলি প্রবণতার বিরুদ্ধে ট্রেডিং এড়াতে এবং নির্ভরযোগ্যতা উন্নত করতে সহায়তা করে।

সুবিধা

  1. প্রবণতা এবং গতির মধ্যে সমঝোতা প্রয়োজন করে উচ্চতর জয় হার সহ নির্ভরযোগ্য সংকেত।

  2. প্যারামিটার টিউনিংয়ের মাধ্যমে ট্রেডিং ফ্রিকোয়েন্সি কাস্টমাইজ করা যায়, যেমন ROC প্যারামিটারগুলি সামঞ্জস্য করা যায়।

  3. স্বতন্ত্র লেনদেনের ঝুঁকি হ্রাস করার জন্য স্টপ লস।

  4. প্রবণতা বাড়াতে এবং লাভজনকতা আরও বাড়ানোর জন্য পুনরায় প্রবেশের প্রক্রিয়া।

ঝুঁকি

  1. সিগন্যাল নির্ভরযোগ্যতার কারণে কিছু ট্রেডিং সুযোগ মিস করা এবং লাভের সম্ভাবনা সীমাবদ্ধ করা।

  2. প্রবণতা বিপরীত হলে ধরা পড়ার ঝুঁকিতে, যা সম্ভাব্যভাবে বড় ক্ষতির দিকে পরিচালিত করে।

  3. খারাপ প্যারামিটার টিউনিং খুব কম বা খুব বেশি সংকেত হতে পারে।

  4. স্থির স্টপ লস শতাংশ বিশাল প্রতিকূল দামের ওঠানামা উপর গুরুতর ক্ষতি প্রতিরোধ করতে অক্ষম।

উন্নতির সুযোগ

  1. সর্বোত্তম পারফরম্যান্সের জন্য ROC পরামিতি অপ্টিমাইজ করুন।

  2. ঝুঁকি এবং পুরস্কারের ভারসাম্য বজায় রাখার জন্য বিভিন্ন স্টপ লস স্তর পরীক্ষা করুন।

  3. সিগন্যালগুলোকে পরিমার্জন করার জন্য ভলিউম, ভোল্টেবিলিটি ইন্ডিকেটর এর মত অন্যান্য ফিল্টার যোগ করুন।

  4. সেরা ফিট খুঁজে পেতে বিভিন্ন বাজারে পারফরম্যান্স মূল্যায়ন করুন।

  5. বিভিন্ন বাজারের অবস্থার জন্য গতিশীল অবস্থানের আকার নির্ধারণ করা।

সিদ্ধান্ত

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


/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SSL Chaikin BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

/////////////// Chaikin MF /////////////// 
_1 = input(false,  "═══════ Chaikin MF ═══════")
length = input(20, minval=1, title = "Chaikin SMA Length")
upperThreshold = input(0.04, step=0.01, title="Upper Threshold")
lowerThreshold = input(0.02, step=0.01, title="Lower Threshold")
ad = close==high and close==low or high==low ? 0 : ((2*close-low-high)/(high-low))*volume
mf = sum(ad, length) / sum(volume, length)

/////////////// SSL Channels /////////////// 
_2 = input(false,  "═════════ SSL ══════════")
len1=input(title="SMA Length 1", defval=12)
len2=input(title="SMA Length 2", defval=13)

smaHigh = sma(high, len1)
smaLow = sma(low, len2)

Hlv = 0
Hlv := close > smaHigh ? 1 : close < smaLow ? -1 : Hlv[1]
sslDown = Hlv < 0 ? smaHigh : smaLow
sslUp = Hlv < 0 ? smaLow : smaHigh

///////////// Rate Of Change ///////////// 
_3 = input(false,  "══════ Rate of Change ══════")
source = close
roclength = input(13, "ROC Length",  minval=1)
pcntChange = input(4, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

///////////////  Strategy  /////////////// 
long = sslUp > sslDown and isMoving() or crossover(mf, upperThreshold)
short = sslUp < sslDown and isMoving() or crossunder(mf, lowerThreshold)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

//////////////// Stop loss /////////////// 
_4 = input(false,  "════════ Stop Loss ═══════")
sl_inp = input(2.0, title='Stop Loss %') / 100

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long)
    strategy.entry("S", strategy.short, when=short)
    strategy.exit("L SL", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S SL", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
p1 = plot(sslDown, linewidth = 1, color=color.red)
p2 = plot(sslUp, linewidth = 1, color=color.lime)
fill(p1, p2,  color = sslDown < sslUp ? color.lime : color.red, transp=80)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(crossover(mf, upperThreshold) ? color.blue : crossunder(mf, lowerThreshold) ? color.orange : na, transp=30)

আরো