
মাল্টি ফ্যাক্টর কৌশলটি তিনটি ভিন্ন ধরণের কৌশলকে একত্রিত করে, যেমন ঝড়ের কৌশল, প্রবণতা ট্র্যাকিং কৌশল এবং ব্রেকথ্রু কৌশল, যা সমন্বয় ব্যবহারের মাধ্যমে আরও ভাল কৌশলগত প্রভাব অর্জন করে।
মাল্টি-ফ্যাক্টর কৌশলটি মূলত নিম্নলিখিত বিষয়গুলির উপর ভিত্তি করে মডেল করা হয়ঃ
শক কৌশলটি ক্রয় এবং বিক্রয়ের সময় নির্ধারণের জন্য এলোমেলো সূচকগুলি ব্যবহার করে। বিশেষত, যখন এলোমেলো সূচক% কে লাইনটি ওভারসোলড অঞ্চল থেকে% ডি লাইনটি অতিক্রম করে তখন একটি কেনার সংকেত উত্পন্ন হয়; যখন% কে লাইনটি ওভারসোলড অঞ্চল থেকে% ডি লাইনটি অতিক্রম করে তখন একটি বিক্রয় সংকেত উত্পন্ন হয়।
প্রবণতা কৌশলটি এসএমএর গড় রেখার একটি গোল্ডেন ক্রস ব্যবহার করে প্রবণতার দিকনির্দেশনা নির্ধারণ করে। যখন দ্রুত লাইনটি নীচের থেকে ধীর লাইনটি অতিক্রম করে তখন এটি একটি কেনার সংকেত দেয়; যখন দ্রুত লাইনটি নীচের থেকে ধীর লাইনটি অতিক্রম করে তখন এটি একটি বিক্রয় সংকেত দেয়।
ব্রেকআউট কৌশল অংশটি পর্যবেক্ষণ করে যে দামটি নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ বা সর্বনিম্ন দামটি অতিক্রম করেছে কিনা। যখন দাম সর্বোচ্চ দামের উপরে থাকে তখন কিনুন; যখন দাম সর্বনিম্ন দামের নীচে থাকে তখন বিক্রি করুন।
ট্রেডিংয়ে অংশগ্রহণের জন্য ট্রেডিংয়ে অংশ নেওয়ার আগে, ট্রেডিংয়ের প্রবণতাটি যথেষ্ট শক্তিশালী হলে ট্রেডিংয়ের প্রবণতাটি নির্ধারণ করতে ADX সূচকের সাথে মিলিত হয়।
স্টপ লিন এবং স্টপ থামার লাইন স্থাপন করুন এবং যুক্তিসঙ্গত স্টপ থামার অনুপাত সেট করুন।
মাল্টি-ফ্যাক্টর কৌশল মূলত নিম্নলিখিত ধারণাগুলি অনুসরণ করেঃ
যখন ADX সেট থ্রেশহোল্ডের চেয়ে বড় হয়, তখন ট্রেন্ডটি যথেষ্ট শক্তিশালী বলে মনে করা হয়, তখন ট্রেন্ডিং কৌশলটি কার্যকর করা শুরু হয়; যখন ADX থ্রেশহোল্ডের চেয়ে কম হয়, তখন এটি সমন্বয় বলে মনে করা হয়, তখন কেবল ঝড়ের কৌশলটি কার্যকর করা হয়।
প্রবণতার ক্ষেত্রে, এসএমএ যখন স্বর্ণকে ক্রস করে তখন ওপেন পজিশন কেনা হয়, যখন ডাই ফর্ক হয় তখন প্লেইন পজিশন দেওয়া হয়।
ট্রেডিং সিগন্যালের একটি র্যান্ডম ইনডিকেটর কার্যকর করা হয় যখন পরিস্থিতি অস্থির হয়।
উভয় বাজার পরিস্থিতিতে, ব্রেক-আউট কৌশলগুলি চ্যানেলগুলি অনুসরণ করার জন্য ব্যবহৃত হয়।
স্টপ লস স্টপ ফ্রিজ সেট করুন লাভের জন্য অনুকূলিতকরণ করুন।
মাল্টি ফ্যাক্টর কৌশলগুলির সর্বাধিক সুবিধা হ’ল বিভিন্ন ধরণের কৌশলগুলির সমন্বয়, উভয় বাজার পরিবেশে ভাল কৌশলগত প্রভাব অর্জন করা যায়। বিশেষত, প্রধানত নিম্নলিখিত সুবিধাগুলি রয়েছেঃ
ট্রেন্ডের সাথে সামঞ্জস্য রেখে, ট্রেন্ডের মধ্যে জয়লাভের উচ্চতর হার অর্জন করা।
এই ধরনের ব্যবসায়ীরা তাদের ব্যবসায়ের উপর নির্ভর করে এবং তাদের ব্যবসায়ের উপর নির্ভর করে।
উচ্চ মুনাফা ফ্যাক্টর সহ, স্টপ-অফ-লস সেটিং যুক্তিসঙ্গত।
এই প্রবণতাকে বিবেচনায় নিয়ে ক্ষতির পরিমাণ কমানো যায়।
বিভিন্ন সূচক একত্রিত হয়ে একটি শক্তিশালী ট্রেডিং সিগন্যাল তৈরি করতে পারে।
প্যারামিটার অপ্টিমাইজেশনের মাধ্যমে ভাল প্যারামিটার সমন্বয় পাওয়া যায়।
মাল্টি ফ্যাক্টর কৌশলগুলিও কিছু ঝুঁকি নিয়ে আসে, যার মধ্যে রয়েছেঃ
অপ্রয়োজনীয় বহু-ফ্যাক্টর সমন্বয় ট্রেডিং সিগন্যালের বিভ্রান্তি সৃষ্টি করতে পারে এবং সর্বোত্তম ফ্যাক্টর সমন্বয় খুঁজে বের করার জন্য পুনরাবৃত্তিমূলক পরীক্ষার প্রয়োজন।
অনেকগুলি প্যারামিটার অপ্টিমাইজ করা প্রয়োজন, অপ্টিমাইজেশানটি কঠিন এবং যথেষ্ট ঐতিহাসিক ডেটা সমর্থন প্রয়োজন।
ট্রেন্ডের বিপরীতে, সময়মত পজিশন বন্ধ করতে না পারা বড় ক্ষতির কারণ হতে পারে।
ADX সূচকটি পিছিয়ে আছে এবং সম্ভবত এটি প্রবণতা পাল্টাতে ব্যর্থ হয়েছে।
বিরাট ট্রেডিং সহজেই ধরা পড়ে, যার জন্য যুক্তিসঙ্গত স্টপ লস কৌশল প্রয়োজন।
এই ঝুঁকির জন্য, নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যেতে পারেঃ
ঐতিহাসিক তথ্যের মধ্যে বিভিন্ন ফ্যাক্টরগুলির স্থায়িত্ব পরীক্ষা করুন এবং স্থায়িত্বের ফ্যাক্টর নির্বাচন করুন।
জিনগত অ্যালগরিদমের মতো বুদ্ধিমান অপ্টিমাইজেশান পদ্ধতি ব্যবহার করে সর্বোত্তম প্যারামিটারগুলি সন্ধান করুন।
সর্বাধিক প্রত্যাহার নিয়ন্ত্রণের জন্য যুক্তিসঙ্গত স্টপ লিন্ড সেট করুন।
এই প্রবণতা পাল্টাচ্ছে এমন আরও কিছু সূচক রয়েছে।
বিরাট ক্ষতি এড়াতে, বিরাট ব্যবসায়ের জন্য স্টপ লস কৌশলটি অনুকূলিত করুন।
মাল্টি-ফ্যাক্টর কৌশলগুলি আরও উন্নত করার সুযোগ রয়েছেঃ
২. মেশিন লার্নিং পদ্ধতি ব্যবহার করে সর্বোত্তম কৌশলগত ওজন খুঁজে বের করা।
৩. প্যারামিটার অপ্টিমাইজেশনের জন্য একটি বুদ্ধিমান অ্যালগরিদম ব্যবহার করা যেতে পারে, যা দ্রুত অপ্টিমাইজেশান খুঁজে বের করতে পারে।
৪. বিভিন্ন পজিশনের আয় পরীক্ষা করা যায়।
৫. স্টপ লিনের গতিশীল সমন্বয় বিবেচনা করা যেতে পারে। যেমন লাভের পরে স্টপ লিনের পরিধি যথাযথভাবে প্রশস্ত করা যেতে পারে।
৬. আরো ফিল্টারিং শর্ত প্রবর্তন করা যেতে পারে, যেমন ট্র্যাফিকের পরিমাণ বৃদ্ধি, যা সিগন্যালের গুণমানকে উন্নত করবে।
মাল্টি ফ্যাক্টর কৌশল সমন্বয় প্রবণতা, ঝাঁকুনি, বিপর্যয় ইত্যাদি একাধিক ট্রেডিং লজিক বিবেচনা করে, উভয় বাজার পরিবেশে দুর্দান্ত প্রভাব অর্জন করতে পারে। একক কৌশল তুলনায়, মাল্টি ফ্যাক্টর কৌশল উচ্চতর স্থিতিশীল আয় অর্জন করতে পারে, ভাল আপগ্রেড করার জন্য স্থান রয়েছে। তবে এটি লক্ষ করা উচিত যে প্যারামিটার অপ্টিমাইজেশন আরও কঠিন এবং অপ্টিমাইজেশন প্রক্রিয়া সমর্থন করার জন্য পর্যাপ্ত ঐতিহাসিক তথ্য প্রয়োজন। সামগ্রিকভাবে, মাল্টি ফ্যাক্টর কৌশল একটি খুব কার্যকর অ্যালগরিদমিক ট্রেডিং পদ্ধতি, যা আরও গবেষণা এবং অপ্টিমাইজেশনের জন্য মূল্যবান।
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
// Revision: 1
// Author: Jonas
// === INPUT ===
// > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)
// > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")
strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])
flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100
// > SMA <
fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)
// > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend
// > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)
// > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3
// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => // create function "within window of time"
time >= window_start and time <= window_finish ? true : false
//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)
// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus
ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)
//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
ts_sum = 0.0
for i = ts_fromIndex to ts_toIndex
ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
ts_sum
intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0
// > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0
// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)
// === STOCHASTICS ===
stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)
// === FILTER & CONDITIONS ===
// > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]
bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false
bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1
bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1
// > TREND <
bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]
bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2
bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2
bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1
bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3
bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1
plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line) // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line) // plot SlowMA
// > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25
bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5
bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5
bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1
bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1
//=== STRATEGIES ENTRIES & EXITS ===
// > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)
// > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
if (bolOS == true)
if (intTrend == 0)
if(strStrategy == "Long" or strStrategy == "Long & Short")
strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS) // buy long when "within window of time" AND crossover
if(strStrategy == "Short" or strStrategy == "Long & Short")
strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
strategy.close("Lng Osc", when=(bolLongCloseOS))
//strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
strategy.close("Short Osc", when=(bolShortCloseOS))
//strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
if (bolTS == true)
if (not(intTrend == 0))
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS) // buy long when "within window of time" AND crossover
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS)) // buy long when "within window of time" AND crossover
strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
strategy.close("Lng TD", when=bolLongCloseTS)
strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
strategy.close("Short TD", when=bolShortCloseTS)
if (bolBO == true)
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Lng BO", when=bolLongCloseBO)
//strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short BO", strategy.short, when=bolShortOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Short BO", when=bolShortCloseBO)
//strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)