ট্রেন্ড অ্যাঙ্গেল মুভিং এভারেজ ক্রসওভার কৌশল


সৃষ্টির তারিখ: 2024-01-25 14:35:13 অবশেষে সংশোধন করুন: 2024-01-25 14:35:13
অনুলিপি: 2 ক্লিকের সংখ্যা: 1182
1
ফোকাস
1617
অনুসারী

ট্রেন্ড অ্যাঙ্গেল মুভিং এভারেজ ক্রসওভার কৌশল

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি মূলত নিম্নলিখিত সূচকগুলির উপর ভিত্তি করে বিচার করা হয়ঃ

  1. গড়রেখা কোণঃ জুরিখ গড়রেখা এবং সূচকীয় চলমান গড়ের তির্যক কোণ গণনা করে মূল্য প্রবণতার দিক নির্ণয় করা। কোণটি 0 এর চেয়ে বড় হলে এটি একটি উচ্চতর প্রবণতা এবং 0 এর চেয়ে ছোট হলে এটি একটি নিম্নতর প্রবণতা।

  2. মূল্য পরিবর্তনের হারঃ সাম্প্রতিক 12 টি কে লাইনের বন্ধের মূল্য পরিবর্তনের হার গণনা করে, অস্থিরতার মাধ্যমে অকার্যকর সংকেতগুলি ফিল্টার করে।

যখন গড় রেখার কোণটি উপরে থাকে এবং দামের পরিবর্তনের হারটি শর্ত পূরণ করে তখন অতিরিক্ত করুন; যখন গড় রেখার কোণটি নীচে থাকে এবং দামের পরিবর্তনের হারটি শর্ত পূরণ করে তখন শূন্য করুন।

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

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

এই কৌশলটির সুবিধাগুলো হলঃ

  1. গড়রেখার স্লাইড ব্যবহার করে প্রবণতা নির্ণয় করা খুবই নির্ভরযোগ্য, এবং বিজয়ী হওয়ার সম্ভাবনা বেশি।

  2. দামের পরিবর্তনের হার সূচকটি কার্যকরভাবে ওঠানামা ফিল্টার করতে পারে এবং অকার্যকর লেনদেন এড়াতে পারে।

  3. জুরিখের গড় রেখাটি দ্রুত প্রতিক্রিয়া দেখায় এবং ইএমএ স্থিতিশীল প্রবণতা নির্ধারণ করে, যা একে অপরের পরিপূরক।

  4. লং-শর্ট ও ডাবল-ডাইরেক্ট ট্রেডিং পদ্ধতিতে ট্রেন্ডিংয়ের সময় লং-শর্ট ও ডাবল-ডাইরেক্ট ট্রেডিং পদ্ধতিতে ট্রেন্ডিংয়ের সময় লং-শর্ট ও ডাবল-ডাইরেক্ট ট্রেডিং করা যায়।

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

এই কৌশলটির কিছু ঝুঁকিও রয়েছেঃ

  1. দামের তীব্র অস্থিরতার সময়, গড় রেখাটি ভুল সংকেত তৈরি করার সম্ভাবনা বেশি। অপ্টিমাইজেশান প্যারামিটারগুলির মাধ্যমে এই ঝুঁকি হ্রাস করা যেতে পারে।

  2. সমন্বয় করার সময় সমান্তরাল সংকেতগুলি ঘন ঘন পরিবর্তন হতে পারে, যার ফলে প্রচুর অপ্রয়োজনীয় লেনদেন হয়। অকার্যকর লেনদেন কমাতে অতিরিক্ত ফিল্টারিং শর্ত যুক্ত করা যেতে পারে।

  3. স্টপ লস এড়িয়ে যেতে পারে যখন কোন আকস্মিক ঘটনা দামকে উঁচুতে নিয়ে যায়, এবং স্টপ লস পয়েন্ট যথাযথভাবে ছেড়ে দেওয়া যেতে পারে।

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

এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে উন্নত করা যেতে পারেঃ

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

  2. 👉

  3. অন্যান্য সূচকগুলির সাথে মিলিত হয়ে, স্টপ লসকে আরও স্মার্ট করে তোলে।

  4. ট্রেডিং আকারের উপর ভিত্তি করে অ্যালগরিদম তৈরি করা হয়েছে, যাতে মুনাফা আরও স্থিতিশীল হয়।

সারসংক্ষেপ

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

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

//@version=4
// Based on ma angles code by Duyck which also uses Everget Jurik MA calulation and angle calculation by KyJ
strategy("Trend Angle BF", overlay=false)

/////////////// Time Frame ///////////////
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
    
src=input(ohlc4,title="source")

// definition of "Jurik Moving Average", by Everget
jma(_src,_length,_phase,_power) =>
    phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
    beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
    alpha = pow(beta, _power)
    jma = 0.0
    e0 = 0.0
    e0 := (1 - alpha) * _src + alpha * nz(e0[1])
    e1 = 0.0
    e1 := (_src - e0) * (1 - beta) + beta * nz(e1[1])
    e2 = 0.0
    e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
    jma := e2 + nz(jma[1])

//// //// Determine Angle by KyJ //// //// 
angle(_src) =>
    rad2degree=180/3.14159265359  //pi 
    ang=rad2degree*atan((_src[0] - _src[1])/atr(14)) 

jma_line=jma(src,10,50,1)
ma=ema(src,input(56))
jma_slope=angle(jma_line)
ma_slope=angle(ma)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(12, minval=1)
pcntChange = input(2, 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 = ma_slope>=0 and isMoving()
short = ma_slope<=0 and isMoving()

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])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(900.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

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

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("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
hline(0, title='Zero line', color=color.purple, linewidth=1)
plot(ma_slope,title="ma slope", linewidth=2,color=ma_slope>=0?color.lime:color.red)
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)