চলমান গড় ক্রসওভার কৌশল নয় ধরনের

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

img

সারসংক্ষেপ

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

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

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

একটি পজিশনে প্রবেশ করার পরে, যদি মূল্য স্টপ লস লাইনে স্পর্শ করে, আমরা ক্ষতি কমাতে পজিশন থেকে বেরিয়ে আসি। যদি মূল্য লাভের লাইনে স্পর্শ করে, আমরা প্রত্যাশিত হিসাবে মুনাফা লক করতে পজিশন থেকে বেরিয়ে আসি। এটি আমাদের মুনাফা লক করতে এবং ক্ষতির আরও প্রসারিত হতে বাধা দেয়।

কোড লজিক থেকে, কৌশলটি চারটি অংশে বিভক্ত করা যেতে পারেঃ

  1. চলমান গড় গণনা করুন। ব্যবহারকারীর চলমান গড়ের ধরণের নির্বাচনের ভিত্তিতে, দ্রুত লাইন এবং ধীর লাইন চলমান গড় গণনা করুন।

  2. ট্রেডিং সিগন্যাল তৈরি করুন দ্রুত লাইন এবং ধীর লাইনের ক্রসওভার পরিস্থিতির উপর ভিত্তি করে দীর্ঘ এবং সংক্ষিপ্ত সংকেত তৈরি করুন।

  3. স্টপ লস এবং লাভের স্তর সেট করুন। প্রবেশ মূল্য এবং সেট স্টপ লস / লাভের শতাংশের ভিত্তিতে, রিয়েল টাইমে স্টপ লস এবং লাভের মূল্যের স্তর গণনা করুন।

  4. প্রবেশ এবং প্রস্থান. দীর্ঘ / সংক্ষিপ্ত সংকেত উপর ভিত্তি করে প্রবেশ, স্টপ লস / লাভ নিতে সংকেত উপর ভিত্তি করে প্রস্থান।

সুবিধা বিশ্লেষণ

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

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

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

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

আরেকটি ঝুঁকি হ'ল স্টপ লস এবং লাভের স্তর সেট করা। যদি ব্যাপ্তিটি খুব ছোট হয় তবে এটি স্কাল্পারদের পক্ষে দুর্বল হতে পারে। যদি খুব বড় হয় তবে সময়মতো লাভকে লক করতে ব্যর্থ হওয়া সহজ। অতএব, লাইভ ট্রেডিংয়ের সময় বাজারের অবস্থার সাথে সামঞ্জস্য রেখে স্টপ লস / লাভের পরামিতিগুলি অনুকূল করা দরকার।

সাধারণভাবে, এই কৌশলটি মূলত প্রবণতা দিক নির্ধারণের জন্য চলমান গড়ের উপর নির্ভর করে। সুতরাং হঠাৎ ঘটনাগুলি যখন বড় দামের ওঠানামা করে তখন এর কার্যকারিতা হ্রাস পেতে পারে। এছাড়াও, পরামিতি সেটিংগুলি কৌশল রিটার্নগুলিতেও বড় প্রভাব ফেলতে পারে।

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

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

  1. বিভিন্ন বাজার পরিবেশ এবং ট্রেডিং পণ্যের উপর ভিত্তি করে আরও উপযুক্ত মুভিং গড় নির্বাচন করুন।

  2. চলমান গড়ের পরামিতিগুলি অনুকূল করুন। বাজারের বৈশিষ্ট্যগুলির সাথে আরও ভালভাবে ফিট করার জন্য চলমান গড়ের দৈর্ঘ্য সামঞ্জস্য করুন।

  3. ফিল্টারিংয়ের জন্য অন্যান্য সূচক যোগ করুন। স্পষ্ট প্রবণতা না থাকলে ঘন ঘন ট্রেডিং এড়াতে MACD, RSI এবং অন্যান্য সূচক যোগ করা যেতে পারে।

  4. স্টপ লস/টেক প্রফিট রেসিও অপ্টিমাইজ করুন। ঐতিহাসিক তথ্যের উপর ভিত্তি করে সর্বোত্তম স্টপ লস/টেক প্রফিট পরামিতি গণনা করুন।

  5. মেশিন লার্নিং মডেল যোগ করুন। মূল্যের গতিবিধি পূর্বাভাস দিতে এবং ট্রেডিং সংকেত তৈরিতে সহায়তা করার জন্য LSTM, র্যান্ডম ফরেস্ট অ্যালগরিদম ব্যবহার করুন।

  6. ট্রেলিং স্টপ লস অ্যালগরিদম গ্রহণ করুন। হিট হওয়ার সম্ভাবনা কমাতে স্টপ লস লাইনকে ধীরে ধীরে মূল্য আন্দোলনের সাথে চলতে সক্ষম করুন।

সিদ্ধান্ত

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


/*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)

আরো