মাল্টি-ফ্যাক্টর কৌশল

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

img

সারসংক্ষেপ

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

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

বহু-ফ্যাক্টর কৌশল মূলত নিম্নলিখিত দিকগুলির উপর ভিত্তি করে মডেল করা হয়ঃ

  • অস্থির অংশটি ক্রয় এবং বিক্রয় সংকেত সনাক্ত করতে স্টোক্যাস্টিক দোলক ব্যবহার করে। বিশেষত, যখন %K লাইন ওভারসোল্ড অঞ্চল থেকে %D লাইনের উপরে অতিক্রম করে তখন একটি ক্রয় সংকেত উত্পন্ন হয়। যখন %K লাইন ওভারসোল্ড অঞ্চল থেকে %D লাইনের নীচে অতিক্রম করে তখন একটি বিক্রয় সংকেত উত্পন্ন হয়।

  • প্রবণতা অনুসরণকারী অংশটি প্রবণতা দিক নির্ধারণের জন্য এসএমএর সোনার ক্রস ব্যবহার করে। যখন দ্রুত এসএমএ ধীর এসএমএর উপরে অতিক্রম করে তখন একটি ক্রয় সংকেত উত্পন্ন হয়। যখন দ্রুত এসএমএ ধীর এসএমএর নীচে অতিক্রম করে তখন একটি বিক্রয় সংকেত উত্পন্ন হয়।

  • ব্রেকআউট অংশটি পর্যবেক্ষণ করে যদি দাম নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ মূল্যের উপরে বা সর্বনিম্ন মূল্যের নীচে ভেঙে যায়। এটি সর্বোচ্চ মূল্যের উপরে দাম ভেঙে গেলে একটি ক্রয় এবং সর্বনিম্ন মূল্যের নীচে দাম ভেঙে গেলে একটি বিক্রয় ট্রিগার করবে।

  • এডিএক্স সূচকটি প্রবণতার শক্তি পরিমাপ করতে ব্যবহৃত হয়। প্রবণতা যথেষ্ট শক্তিশালী হলেই প্রবণতা ট্রেডিং সংকেত তৈরি করা হয়।

  • লাভজনকতা বাড়ানোর জন্য স্টপ লস এবং টেক প্রফিট লাইন প্রয়োগ করা হয়।

সংক্ষেপে, বহু-ফ্যাক্টর কৌশলটি নিম্নলিখিত যুক্তি অনুসরণ করেঃ

  1. যখন এডিএক্স একটি প্রান্তিকের উপরে থাকে, তখন প্রবণতা শক্তিশালী বলে মনে করা হয়। প্রবণতা অনুসরণকারী কৌশল কার্যকর হয়। যখন এডিএক্স প্রান্তিকের নীচে থাকে, তখন বাজারটি বিস্তৃত হয়। শুধুমাত্র দোলক কৌশল কার্যকর হয়।

  2. ট্রেন্ডিং মার্কেটে, এসএমএ গোল্ডেন ক্রস একটি লং এন্ট্রি এবং ডেথ ক্রসটি পজিশনের প্রস্থানকে ট্রিগার করে।

  3. একটি রেঞ্জিং মার্কেটে, স্টোকাস্টিক দোলকের ট্রেডিং সিগন্যাল অনুসরণ করা হয়।

  4. শক্তিশালী গতি অনুসরণ করার জন্য উভয় বাজারের পরিস্থিতিতে ব্রেকআউট কৌশলটি প্রযোজ্য।

  5. স্টপ লস এবং টেক প্রফিট লাইনগুলি লাভ এবং ক্ষতির সীমাবদ্ধতার জন্য সেট করা হয়।

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

মাল্টি-ফ্যাক্টর কৌশলটির সবচেয়ে বড় সুবিধা হল এটি বিভিন্ন কৌশলগুলির শক্তিকে একত্রিত করে এবং ট্রেন্ডিং এবং রেঞ্জিং উভয় বাজারে ভাল পারফরম্যান্স অর্জন করে। প্রধান সুবিধা হলঃ

  1. এটি ট্রেন্ডগুলিকে ভালভাবে চালায় এবং ট্রেন্ডিং মার্কেটে উচ্চ বিজয় হার অর্জন করে।

  2. এটি রেঞ্জ-বান্ধব বাজার থেকে লাভবান হতে পারে এবং পজিশনে আটকে থাকা এড়াতে পারে।

  3. এটিতে উচ্চ মুনাফা ফ্যাক্টর রয়েছে, যথাযথভাবে স্টপ লস এবং লাভ গ্রহণের ব্যবস্থা রয়েছে।

  4. এটি মিথ্যা সংকেত থেকে ক্ষতি হ্রাস করার জন্য প্রবণতা শক্তি বিবেচনা করে।

  5. একাধিক সূচকের সংমিশ্রণ শক্তিশালী ট্রেডিং সংকেত দেয়।

  6. আরও ভাল পারফরম্যান্সের জন্য পরামিতিগুলি অপ্টিমাইজ করা যেতে পারে।

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

মাল্টি-ফ্যাক্টর স্ট্র্যাটেজিতে ঝুঁকিও রয়েছেঃ

  1. কারণগুলির ভুল সমন্বয় দ্বন্দ্বপূর্ণ ট্রেডিং সংকেত হতে পারে। সর্বোত্তম সমন্বয় খুঁজে পেতে ব্যাপক পরীক্ষার প্রয়োজন।

  2. একাধিক পরামিতি অপ্টিমাইজেশান অসুবিধা বৃদ্ধি এবং যথেষ্ট ঐতিহাসিক তথ্য প্রয়োজন।

  3. যখন প্রবণতা বিপরীত হয় তখন এটি সময়মতো পজিশন থেকে বেরিয়ে আসতে ব্যর্থ হতে পারে, যার ফলে বড় ক্ষতি হতে পারে।

  4. এডিএক্স সূচকটির বিলম্বিত প্রভাব রয়েছে এবং প্রবণতা পাল্টা পয়েন্টগুলি মিস করতে পারে।

  5. ব্রেকআউট ট্রেডিং হারানো পজিশনে আটকা পড়ার প্রবণতা রয়েছে। যুক্তিসঙ্গত স্টপ লস প্রয়োজন।

ঝুঁকিগুলি নিম্নলিখিত উপায়ে হ্রাস করা যেতে পারেঃ

  1. ফ্যাক্টর স্থিতিশীলতা ব্যাকটেস্টিং এবং স্থিতিশীল নির্বাচন।

  2. অপ্টিমাম প্যারামিটার খুঁজতে হিউরিস্টিক অপ্টিমাইজেশান অ্যালগরিদম ব্যবহার করে।

  3. সর্বোচ্চ ড্রাউনডাউন নিয়ন্ত্রণের জন্য যথাযথ স্টপ লস সেট করা।

  4. প্রবণতা বিপরীততা সনাক্ত করার জন্য অতিরিক্ত সূচক অন্তর্ভুক্ত করা।

  5. ব্রেকআউট ট্রেডিংয়ের জন্য স্টপ লস নিয়মগুলি অপ্টিমাইজ করা।

উন্নতির দিকনির্দেশ

বহু-ফ্যাক্টর কৌশলকে আরও উন্নত করার সুযোগ রয়েছেঃ

  1. আরও ভাল সংমিশ্রণ খুঁজে বের করার জন্য ভোল্টেবিলিটি, ভলিউম ইত্যাদির মতো আরও ফ্যাক্টর টাইপ পরীক্ষা করা।

  2. গতিশীলভাবে ফ্যাক্টর ওজনের অপ্টিমাইজ করার জন্য মেশিন লার্নিং কৌশল ব্যবহার করে।

  3. দ্রুত প্যারামিটার অপ্টিমাইজেশনের জন্য হিউরিস্টিক অ্যালগরিদম ব্যবহার করা।

  4. বিভিন্ন সময় ধরে লাভজনকতা পরীক্ষা করা।

  5. ডায়নামিক স্টপ লস নিয়মের অন্বেষণ করা। উদাহরণস্বরূপ, কিছু লাভ করার পরে স্টপ লস প্রসারিত করা।

  6. সিগন্যালের গুণমান উন্নত করার জন্য ভলিউম স্পাইক এর মত আরো ফিল্টার যোগ করা।

  7. ADX পরামিতিগুলি অপ্টিমাইজ করা বা আরও উন্নত প্রবণতা সনাক্তকরণ সূচক ব্যবহার করা।

সিদ্ধান্ত

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


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




আরো