
এই কৌশলটি দুটি ভিন্ন প্যারামিটার সেট করা চলমান গড়ের সাথে ক্রস-অপারেটিং করে, ক্রস-সিগন্যালের উপর ভিত্তি করে ট্রেন্ডের দিকনির্দেশের উপর ভিত্তি করে পজিশন খোলার এবং পজিশন খোলার জন্য। কৌশলটি 9 টি বিভিন্ন ধরণের চলমান গড়ের নির্বাচন করার অনুমতি দেয়, যার মধ্যে রয়েছে সাধারণ চলমান গড় (এসএমএ), সূচকীয় চলমান গড় (ইএমএ), ভারসাম্যযুক্ত চলমান গড় (ডাব্লুএমএ), আলমো চলমান গড় (এলএমএ), পরিমাণগত মান চলমান গড় (ভিডাব্লুএমএ) ইত্যাদি। কৌশলটি একই সাথে স্টপ লস এবং স্টপ লস সেট করে।
এই কৌশলটির কেন্দ্রীয় যুক্তি হল দুটি চলমান গড়ের মান তুলনা করা, এবং দুটি চলমান গড়ের ক্রস অবস্থার উপর ভিত্তি করে বাজারের প্রবণতার দিকটি বিচার করা। বিশেষত, আমরা একটি দ্রুত লাইন এবং একটি ধীর লাইন দুটি চলমান গড় সেট করি। যখন দ্রুত লাইনটি ধীর লাইনটি অতিক্রম করে, তখন মনে হয় যে বাজারটি একটি উত্থান প্রবণতাতে প্রবেশ করেছে, আরও বেশি করে; যখন দ্রুত লাইনটি ধীর লাইনটি অতিক্রম করে, তখন মনে হয় যে বাজারটি একটি পতনশীল প্রবণতাতে প্রবেশ করেছে, ফাঁকা।
পজিশনে প্রবেশের পরে, যদি দামটি স্টপ লস লাইন স্পর্শ করে তবে ক্ষতি হয় তবে পজিশন থেকে বেরিয়ে আসে; যদি দামটি স্টপ থামার লাইন স্পর্শ করে তবে প্রত্যাশিত মুনাফা অর্জন করে তবে পজিশন থেকে বেরিয়ে আসে। এটি লাভকে লক করতে পারে এবং ক্ষতির বিস্তার রোধ করতে পারে।
কোড লজিক অনুযায়ী, কৌশলটি মূলত চারটি অংশে বিভক্তঃ
চলমান গড় গণনা করুন। ব্যবহারকারীর দ্বারা নির্বাচিত চলমান গড়ের ধরণ অনুসারে, দ্রুত এবং ধীর লাইনের চলমান গড় গণনা করুন।
ট্রেডিং সিগন্যাল উৎপন্ন করা। ফাস্ট লাইন এবং লং লাইনের ক্রসিংয়ের উপর ভিত্তি করে, একটি ওভার এবং ডাউন সিগন্যাল উৎপন্ন করা হয়।
স্টপ লস স্টপ সেট করুন। স্টপ লস লাইন এবং স্টপ লস স্টপ লাইনের দামগুলি রিয়েল-টাইমে গণনা করা হয়, প্রবেশের মূল্য এবং সেট করা স্টপ লস স্টপ শতাংশের উপর ভিত্তি করে।
প্রবেশ এবং প্রস্থান প্রবেশ করুন এবং প্রস্থান করুন এবং বন্ধ করুন এবং বন্ধ করুন
এই কৌশলটির সবচেয়ে বড় সুবিধা হল যে আপনি বিভিন্ন ধরণের চলমান গড়ের মধ্যে বেছে নিতে পারেন। বিভিন্ন ধরণের চলমান গড়ের দামের সংবেদনশীলতা আলাদা, ব্যবহারকারীরা তাদের প্রয়োজন অনুসারে উপযুক্ত চলমান গড় নির্বাচন করতে পারেন। এছাড়াও, চলমান গড়ের দৈর্ঘ্য কাস্টমাইজ করা যেতে পারে, সময় মাত্রার অপ্টিমাইজেশনের জন্য।
আরেকটি সুবিধা হল একটি স্টপ লস স্টপ ব্যবস্থা। এটি ক্ষতির আরও বিস্তারকে কার্যকরভাবে প্রতিরোধ করতে পারে এবং একই সাথে মুনাফা লক করতে পারে। সামগ্রিকভাবে, এই কৌশলটি নমনীয় এবং বিভিন্ন প্রয়োজনের জন্য ব্যবহারকারীদের জন্য উচ্চতর কাস্টমাইজযোগ্য।
এই কৌশলটির প্রধান ঝুঁকি হল যে, মুভিং এভারেজটি পিছিয়ে থাকে। যখন দামের মধ্যে হঠাৎ করে বড় ধরনের অস্থিরতা দেখা দেয়, তখন মুভিং এভারেজটি সময়মত প্রতিক্রিয়া জানাতে পারে না, যার ফলে সেরা সময় প্রবেশ বা প্রস্থান মিস হতে পারে। এই সময় বড় ক্ষতি হতে পারে।
আরেকটি ঝুঁকি হ’ল স্টপ লস স্টপ পজিশন সেট করা। যদি সেট করা পরিধি খুব ছোট হয়, তবে এটি বেনিফিট হওয়ার সম্ভাবনা রয়েছে; যদি এটি খুব বড় হয়, তবে লাভের লকিং যথেষ্ট সময়মতো না হওয়ার সম্ভাবনা রয়েছে। তাই বাজারের পরিস্থিতির উপর ভিত্তি করে রিয়েল এস্টেটে স্টপ লস স্টপের প্যারামিটারগুলি অনুকূলিত করুন।
সাধারণভাবে, এই কৌশলটি প্রবণতার দিকনির্দেশের জন্য মূলত একটি চলমান গড়ের উপর নির্ভর করে, তাই হঠাৎ ঘটনার ফলে দামের ব্যাপক ওঠানামা হলে প্রভাবটি হ্রাস পায়। এছাড়াও, প্যারামিটার সেটিংটি কৌশলটির উপার্জনে আরও বেশি প্রভাব ফেলতে পারে।
এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে উন্নত করা যেতে পারেঃ
অপ্টিমাইজড মুভিং এভারেজের প্রকারভেদঃ বিভিন্ন বাজার পরিস্থিতি এবং লেনদেনের প্রকারভেদ অনুযায়ী আরো উপযুক্ত মুভিং এভারেজ নির্বাচন করুন।
চলমান গড়ের অপ্টিমাইজেশান প্যারামিটারগুলি। চলমান গড়ের সময়কালের দৈর্ঘ্যকে সামঞ্জস্য করুন যাতে এটি বাজারের বৈশিষ্ট্যগুলির সাথে আরও খাপ খায়।
অন্যান্য সূচক ফিল্টার যুক্ত করুন। অন্যান্য সূচক যেমন এমএসিডি, আরএসআই যোগ করা যেতে পারে যাতে কোনও প্রবণতা ছাড়াই বাজারে ঘন ঘন লেনদেন করা যায় না।
অপ্টিমাইজড স্টপ-ড্রপ অনুপাত। ঐতিহাসিক তথ্যের উপর ভিত্তি করে সর্বোত্তম স্টপ-ড্রপ প্যারামিটার গণনা করা হয়েছে।
মেশিন লার্নিং মডেল যোগ করা হয়েছে। এলএসটিএম, র্যান্ডম ফরেস্ট ইত্যাদির মতো অ্যালগরিদম ব্যবহার করে দামের গতিবিধি পূর্বাভাস দেওয়া হয়, ট্রেডিং সংকেত তৈরি করতে সহায়তা করে।
স্টপ ট্র্যাকিং অ্যালগরিদম ব্যবহার করা হয়েছে। স্টপ লাইনটি দামের গতির সাথে ধীরে ধীরে চলতে সক্ষম করে, যার ফলে স্টপ ট্রিগার হওয়ার সম্ভাবনা হ্রাস পায়।
এই কৌশলটি সামগ্রিকভাবে সহজ এবং সরাসরি, প্রবণতা দিকের ক্রস-বিচার করে, এটি একটি সাধারণ প্রবণতা অনুসরণকারী কৌশল। এর সুবিধাগুলি সহজেই বোঝা যায়, উচ্চতর নমনীয়তা, আপনি নিজেরাই চলমান গড়ের ধরণ এবং প্যারামিটারগুলি বেছে নিতে পারেন। এর অসুবিধাগুলি হ’ল উদ্বেগজনক ঘটনাগুলির প্রতি ধীর প্রতিক্রিয়া, কিছুটা বিলম্বের পরে। সামগ্রিকভাবে, এই কৌশলটি দীর্ঘমেয়াদী স্থিতিশীল উপার্জনের সন্ধানকারী বিনিয়োগকারীদের জন্য উপযুক্ত। অপ্টিমাইজেশনের মাধ্যমে কৌশলটির স্থিতিশীলতা এবং উপার্জনের স্তর আরও বাড়িয়ে তুলতে পারে।
/*backtest
start: 2022-12-26 00:00:00
end: 2024-01-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Kozlod - Yet Another Moving Average Cross Strategy", shorttitle="kozlod_yamacs", overlay = true)
//
// author: Kozlod
// date: 2018-03-06
//
////////////
// INPUTS //
////////////
ma_type = input(title = "MA Type", defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'ALMA', 'VWMA', 'HMA', 'LSMA', 'SMMA', 'DEMA'])
short_ma_len = input(title = "Short MA Length", defval = 5, minval = 1)
short_ma_src = input(title = "Short MA Source", defval = close)
long_ma_len = input(title = "Long MA Length", defval = 15, minval = 2)
long_ma_src = input(title = "Long MA Source", defval = close)
alma_offset = input(title = "ALMA Offset", type = float, defval = 0.85, step = 0.01, minval = 0, maxval = 1)
alma_sigma = input(title = "ALMA Sigma", type = float, defval = 6, step = 0.01)
lsma_offset = input(title = "LSMA Offset", defval = 0, step = 1)
sl_lev_perc = input(title = "SL Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01)
pt_lev_perc = input(title = "PT Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01)
// Set initial values to 0
short_ma = 0.0
long_ma = 0.0
// Simple Moving Average (SMA)
if ma_type == 'SMA'
short_ma := sma(short_ma_src, short_ma_len)
long_ma := sma(long_ma_src, long_ma_len)
// Exponential Moving Average (EMA)
if ma_type == 'EMA'
short_ma := ema(short_ma_src, short_ma_len)
long_ma := ema(long_ma_src, long_ma_len)
// Weighted Moving Average (WMA)
if ma_type == 'WMA'
short_ma := wma(short_ma_src, short_ma_len)
long_ma := wma(long_ma_src, long_ma_len)
// Arnaud Legoux Moving Average (ALMA)
if ma_type == 'ALMA'
short_ma := alma(short_ma_src, short_ma_len, alma_offset, alma_sigma)
long_ma := alma(long_ma_src, long_ma_len, alma_offset, alma_sigma)
// Hull Moving Average (HMA)
if ma_type == 'HMA'
short_ma := wma(2*wma(short_ma_src, short_ma_len/2)-wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len)))
long_ma := wma(2*wma(long_ma_src, long_ma_len /2)-wma(long_ma_src, long_ma_len), round(sqrt(long_ma_len)))
// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
short_ma := vwma(short_ma_src, short_ma_len)
long_ma := vwma(long_ma_src, long_ma_len)
// Least Square Moving Average (LSMA)
if ma_type == 'LSMA'
short_ma := linreg(short_ma_src, short_ma_len, lsma_offset)
long_ma := linreg(long_ma_src, long_ma_len, lsma_offset)
// Smoothed Moving Average (SMMA)
if ma_type == 'SMMA'
short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len
long_ma := na(long_ma[1]) ? sma(long_ma_src, long_ma_len) : (long_ma[1] * (long_ma_len - 1) + long_ma_src) / long_ma_len
// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
e1_short = ema(short_ma_src, short_ma_len)
e1_long = ema(long_ma_src, long_ma_len)
short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
long_ma := 2 * e1_long - ema(e1_long, long_ma_len)
/////////////
// SIGNALS //
/////////////
long_signal = crossover( short_ma, long_ma)
short_signal = crossunder(short_ma, long_ma)
// Calculate PT/SL levels
// Initial values
last_signal = 0
prev_tr_price = 0.0
pt_level = 0.0
sl_level = 0.0
// Calculate previous trade price
prev_tr_price := long_signal[1] or short_signal[1] ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na
// Calculate SL/PT levels
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100) : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100) : na
// Calculate if price hit sl/pt
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == 1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == 1 and close <= sl_level
short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == -1 and close >= sl_level
// What is last active trade?
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])
//////////////
// PLOTTING //
//////////////
// Plot MAs
plot(short_ma, color = red, linewidth = 2)
plot(long_ma, color = green, linewidth = 2)
// Plot Levels
plotshape(prev_tr_price, style = shape.cross, color = gray, location = location.absolute, size = size.small)
plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red, location = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location = location.absolute, size = size.small)
//////////////
// STRATEGY //
//////////////
strategy.entry("long", true, when = long_signal)
strategy.entry("short", false, when = short_signal)
strategy.close("long", when = long_hit_pt or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)