ডাবল মুভিং এভারেজ ক্রসওভার ট্রেডিং কৌশল

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

সারসংক্ষেপ

ডাবল মুভিং এভারেজ ক্রসওভার ট্রেডিং কৌশলটি বিভিন্ন প্যারামিটার সেটিং সহ দুটি মুভিং এভারেজ গণনা করে এবং মুভিং এভারেজগুলি ক্রস করার সময় ট্রেডিং করে ট্রেডিং সংকেত তৈরি করে। এই সহজ এবং সরল কৌশলটি মাঝারি মেয়াদী ট্রেডিংয়ের জন্য উপযুক্ত।

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

এই কৌশলটির মূল যুক্তি হল:

  1. ইনপুট পরামিতিঃ দ্রুততম এমএ সময়কাল maLen1, ধীরতম এমএ সময়কাল maLen2, এমএ টাইপ maTypeChoice

  2. ইনপুট পরামিতিগুলির উপর ভিত্তি করে দ্রুত MA maValue1 এবং ধীর MA maValue2 গণনা করুন

  3. দুটি এমএ তুলনা করে ক্রয় এবং বিক্রয় শর্ত নির্ধারণ করুনঃ

    • maValue1 যখন maValue2 এর উপরে ক্রস করে তখন কিনুন

    • যখন maValue1 maValue2 এর নিচে অতিক্রম করে তখন বিক্রি করুন

  4. ক্রয় ও বিক্রয় সংকেত দিয়ে লেনদেন সম্পাদন

  5. তাদের সম্পর্কের উপর ভিত্তি করে বিভিন্ন রঙে এমএ ভিজ্যুয়ালাইজ করুন

  6. ক্রয় এবং বিক্রয় সতর্কতা সংকেত পাঠান

সুবিধা

  • দ্বৈত এমএ ক্রসওভার সিস্টেম ব্যবহার করে, একক এমএ থেকে মিথ্যা সংকেত এড়ায়

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

  • সহজ এবং সরল যুক্তি, সহজেই বোঝা এবং বাস্তবায়ন

  • সময়মত কার্যকর করার জন্য কাস্টমাইজযোগ্য সিগন্যাল সতর্কতা

  • ভিজ্যুয়ালাইজড এমএ প্রবণতা স্বজ্ঞাত ট্রেডিং সূচক গঠন

  • সেরা সমন্বয় খুঁজে পেতে অপ্টিমাইজযোগ্য পরামিতি

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

ঝুঁকি

  • এমএ ক্রসগুলি মিথ্যা সংকেত তৈরি করতে পারে, অতিরিক্ত প্রবণতা এবং প্যাটার্ন নিশ্চিতকরণের প্রয়োজন

  • এমএ ক্রসওভারের আশেপাশে উইপসো অপ্রয়োজনীয় ট্রেডিং খরচ সৃষ্টি করে

  • অপ্রয়োজনীয় পরামিতিগুলি অতিরিক্ত বা কম ট্রেডিংয়ের দিকে পরিচালিত করে

  • চরম ঘটনাগুলি মূল্যের বিশাল ওঠানামা সৃষ্টি করে, ক্ষতির সীমাবদ্ধতা বজায় রাখতে অক্ষম

  • দীর্ঘমেয়াদী প্রবণতা বিচ্ছিন্নতা স্বল্পমেয়াদী সূচকগুলিকে অবৈধ করে দেয়

  • ঘন ঘন পর্যবেক্ষণের প্রয়োজন, সম্পূর্ণরূপে স্বয়ংক্রিয় নয়

ঝুঁকি ব্যবস্থাপনাঃ

  • ট্রেন্ডের বিরুদ্ধে ট্রেডিং এড়াতে ট্রেন্ড ফিল্টার যুক্ত করুন

  • সিগন্যাল বৈধতা নিশ্চিত করতে প্যাটার্ন ফিল্টার যোগ করুন

  • যুক্তিসঙ্গত ট্রেডিং ফ্রিকোয়েন্সির জন্য প্যারামিটার অপ্টিমাইজ করুন

  • হ্রাস সীমাবদ্ধ করার জন্য স্টপ লস/ট্যাক লাভ সেট করুন

  • দীর্ঘ সময়ের মধ্যে স্থিতিশীলতা পরীক্ষা

  • ভুয়া ব্রেকআউট এড়ানোর জন্য মূল্য এবং সময় ফিল্টার

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

  • সর্বোত্তম খুঁজে পেতে বিভিন্ন এমএ পরামিতি পরীক্ষা করুন

  • সর্বাধিক সঠিক সংকেতগুলির জন্য বিভিন্ন এমএ প্রকার পরীক্ষা করুন

  • বিপরীত ট্রেন্ড ট্রেড এড়াতে ট্রেন্ড ফিল্টার যুক্ত করুন

  • সঠিক প্রস্থান পয়েন্ট সনাক্ত করতে অস্থিরতা ফিল্টার যুক্ত করুন

  • মিথ্যা সংকেত হ্রাস করার জন্য মূল্য / সময় ফিল্টার যুক্ত করুন

  • বাস্তব লেনদেনের জন্য স্লিপজ কন্ট্রোল বাস্তবায়ন

  • সরঞ্জাম এবং সময়সীমা জুড়ে স্থিতিস্থাপকতা পরীক্ষা

  • স্বয়ংক্রিয় স্টপ লস/টেক মুনাফা একীভূত করুন

  • কৌশল উন্নত করতে মেশিন লার্নিং অন্বেষণ করুন

সিদ্ধান্ত

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


/*backtest
start: 2023-10-05 00:00:00
end: 2023-10-05 22:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// © sehweijun
//study( title="Arch1tect's New Toy", shorttitle="Arch1tect's New Toy", overlay=true, resolution="")
// strategy( title="Arch1tect's New Toy (Strategy Tester Version)", shorttitle="Arch1tect's New Toy (Strategy Tester Version)", overlay=true, initial_capital = 100000, commission_value=0.07, commission_type=strategy.commission.cash_per_contract)

maTypeChoice = input( "EMA", title="MA Type", options=["EMA", "WMA", "SMA"] )
maSrc = input( close, title="MA Source" )
maLen1 = input( 15, minval=1, title="MA Length" )
maLen2 = input( 95, minval=1, title="MA Length" )

maValue1 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen1 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen1 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen1 )
else
    0
    
maValue2 = if ( maTypeChoice == "EMA" )
    ema( maSrc, maLen2 )
else if ( maTypeChoice == "WMA" )
    wma( maSrc, maLen2 )
else if ( maTypeChoice == "SMA" )
    sma( maSrc, maLen2 )
else
    0

buySignal = crossover( maValue1, maValue2 )
sellSignal = crossunder( maValue1, maValue2 )

mainMAColour = ( maValue1 > maValue2 ) ? color.green : color.red 

plot( maValue1, title="Arch1tect's New Toy", color=mainMAColour, offset=0, linewidth=4 )
//plot( maValue2, title="Arch1tect's Filter", color=color.black, offset=0, linewidth=2 )

var color buyCandleColour = #00ff0a
var color sellCandleColour = #ff1100

barcolor( buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, title="Signal Bar Colour" )
bgcolor( color=buySignal ? buyCandleColour : sellSignal ? sellCandleColour : na, transp=85, title="Signal Background Colour")

alertcondition( buySignal or sellSignal, title="Signal change!", message="Signal change!")
alertcondition( buySignal, title="Buy signal!", message="Buy signal!")
alertcondition( sellSignal, title="Sell signal!", message="Sell signal!")

// Strategy Tester
stratTesterOn    = input( title="Strategy Tester [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)
entryTime        = input( "2200-1200", title = "Daily trading time session (in Exchange GMT)", group="Strategy Tester", type = input.session )
startTime        = input( "2200-2201", title = "Start Time", group="Strategy Tester", type = input.session )
maxDailyLoss     = input( 2500, title = "Max daily loss", group="Strategy Tester", type = input.integer )
maxTotalDrawdown = input( 12000, title = "Max daily loss", group="Strategy Tester", type = input.integer )
contractSize     = input( 1, title = "Contract size", group="Strategy Tester", type = input.integer )

tradeOnStartSess = input( title="First trade on session start [ON/OFF]", group="Strategy Tester", type=input.bool, defval=true)

fixedTPSL        = input( title="Fixed TP/SL PIPS [ON/OFF]", group="Strategy Tester", type=input.bool, defval=false)
fixedTPValue     = input ( 10.00, minval=0.01, type=input.float, title="TP", group="Strategy Tester" )
fixedSLValue     = input ( 10.00, minval=0.01, type=input.float, title="SL", group="Strategy Tester" )

fromDay          = input(defval = 1,    title = "From Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
fromMonth        = input(defval = 1,    title = "From Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
fromYear         = input(defval = 2020, title = "From Year", group="Date Range", type = input.integer, minval = 1970)
thruDay          = input(defval = 1,    title = "Thru Day", group="Date Range", type = input.integer, minval = 1, maxval = 31)
thruMonth        = input(defval = 1,    title = "Thru Month", group="Date Range", type = input.integer, minval = 1, maxval = 12)
thruYear         = input(defval = 2112, title = "Thru Year", group="Date Range", type = input.integer, minval = 1970)

start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false       // create function "within window of time"

// strategy.risk.max_intraday_loss( maxDailyLoss, strategy.cash )
// strategy.risk.max_drawdown( maxTotalDrawdown, strategy.cash )

isTime(_position) =>
    range = time( timeframe.period, _position + ':1234567' )
bgcolor( color=isTime( entryTime ) and stratTesterOn and window() ? color.yellow : na, title="Daily trading time session (in Exchange GMT)", transp=75 )

if ( stratTesterOn and window() )
    if ( buySignal and isTime( entryTime ) )
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Buy", strategy.long, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0 )
            strategy.entry( "Buy", strategy.long, contractSize )
            strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        
    if ( sellSignal and isTime( entryTime ))
        if ( not fixedTPSL )
            strategy.close_all()
            strategy.entry( "Sell", strategy.short, contractSize )
        
        if ( fixedTPSL and strategy.position_size == 0  )
            strategy.entry( "Sell", strategy.short, contractSize )
            strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    if ( isTime( startTime ) and tradeOnStartSess and strategy.position_size == 0 )
        if ( maValue1 > maValue2 )
            strategy.entry( "Buy", strategy.long, contractSize )
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Buy", stop=close[0]-fixedSLValue, limit=close[0]+fixedTPValue )
        else
            strategy.entry( "Sell", strategy.short, contractSize ) 
            
            if ( fixedTPSL )
                strategy.exit( "TP/SL", "Sell", stop=close[0]+fixedSLValue, limit=close[0]-fixedTPValue )
    
    strategy.close_all( when=not isTime( entryTime ) )

plot( strategy.equity )

আরো