চলমান গড় ক্রসওভার কৌশল হল চলমান গড়ের উপর ভিত্তি করে একটি সাধারণভাবে ব্যবহৃত ট্রেডিং কৌশল। এটি একটি দ্রুত চলমান গড় এবং একটি ধীর চলমান গড়ের ক্রসওভারকে ট্রেডিং সংকেত হিসাবে ব্যবহার করে। যখন দ্রুত চলমান গড় নীচে থেকে ধীর চলমান গড়ের উপরে অতিক্রম করে, এটি একটি ক্রয় সংকেত। যখন দ্রুত চলমান গড় উপরে থেকে ধীর চলমান গড়ের নীচে অতিক্রম করে, এটি একটি বিক্রয় সংকেত। এই কৌশলটি 50 দিনের এমএকে দ্রুত এমএ এবং 200 দিনের এমএকে ধীর এমএ হিসাবে ব্যবহার করে।
এই কৌশলটির মূল যুক্তিটি চলমান গড়ের তত্ত্বের উপর ভিত্তি করে। চলমান গড়গুলি কার্যকরভাবে মূল্যের ওঠানামা মসৃণ করতে পারে এবং মূল্যের প্রবণতা নির্দেশ করতে পারে। দ্রুততম এমএ মূল্য পরিবর্তনের প্রতি আরও সংবেদনশীল এবং প্রবণতা বিপরীত পয়েন্টগুলি ক্যাপচার করতে পারে। ধীরতম এমএ মূল্য পরিবর্তনের প্রতি কম সংবেদনশীল এবং স্বল্পমেয়াদী ওঠানামা ফিল্টার করতে পারে। যখন দ্রুততম এমএ ধীরতম এমএ এর উপরে অতিক্রম করে, এটি দামের একটি আপট্রেন্ড নির্দেশ করে। যখন দ্রুততম এমএ ধীরতম এমএ এর নীচে অতিক্রম করে, এটি দামের একটি ডাউনট্রেন্ড নির্দেশ করে।
বিশেষত, এই কৌশলটি প্রথমে 50-দিনের এমএ এবং 200-দিনের এমএ সংজ্ঞায়িত করে। দীর্ঘ এন্ট্রি শর্তটি সেট করা হয় যখন দ্রুততম এমএ ধীরতম এমএ এর উপরে অতিক্রম করে। সংক্ষিপ্ত এন্ট্রি শর্তটি সেট করা হয় যখন দ্রুততম এমএ ধীরতম এমএ এর নীচে অতিক্রম করে। ওভারল্যাপিং ট্রেডগুলি এড়ানোর জন্য, কৌশলটি নিয়ন্ত্রণের জন্য isEntry এবং isExit পতাকা ব্যবহার করে। যখন এন্ট্রি শর্তটি পূরণ করা হয়, তখন isEntry সত্য হিসাবে সেট করা হয়। যখন প্রস্থান শর্তটি পূরণ করা হয়, তখন isExit সত্য হিসাবে সেট করা হয়। একটি দীর্ঘ অবস্থান কেবল তখনই খোলা হবে যখন isEntry মিথ্যা হয় এবং একটি ক্রয় সংকেত প্রদর্শিত হয়। একটি সংক্ষিপ্ত অবস্থান কেবল তখনই খোলা হবে যখন isExit মিথ্যা হয় এবং একটি বিক্রয় সংকেত প্রদর্শিত হয়।
এছাড়াও, কৌশলটি লাভ এবং স্টপ লস স্তরগুলিও সেট করে। ব্যবহারকারীরা ইনপুটগুলির মাধ্যমে টিপি / এসএল শতাংশ দূরত্ব নির্ধারণ করতে পারে। টিপি এবং এসএল দামগুলি প্রবেশ মূল্যের শতাংশের ভিত্তিতে গণনা করা হবে। যখন অবস্থানের আকার 0 এর চেয়ে বড় হয়, তখন টিপি এবং এসএল দীর্ঘ টিপি / এসএল শতাংশের ভিত্তিতে কার্যকর করা হবে। যখন অবস্থানের আকার 0 এর চেয়ে কম হয়, তখন টিপি এবং এসএল সংক্ষিপ্ত টিপি / এসএল শতাংশের ভিত্তিতে কার্যকর করা হবে।
এই কৌশলটির সুবিধাগুলির মধ্যে রয়েছেঃ
এটি বাস্তবায়ন করা সহজ। এটি খাঁটিভাবে এমএ ক্রসগুলির উপর ভিত্তি করে ট্রেড করে, ট্রেডিংয়ের অভিজ্ঞতা ছাড়াই নতুনদের জন্য উপযুক্ত।
ঝুঁকি ব্যবস্থাপনার সাথে নিয়ন্ত্রিত ড্রাউনডাউন। চলমান গড়গুলি স্বল্পমেয়াদী ওঠানামা ফিল্টার করতে পারে এবং থামানো এড়াতে পারে।
অভিযোজনযোগ্যতার জন্য কাস্টমাইজযোগ্য পরামিতি। ব্যবহারকারীরা এমএ সময়কাল এবং টিপি / এসএল স্তরের মতো পরামিতিগুলি অনুকূল করতে পারেন।
স্পষ্ট ভিজ্যুয়ালাইজেশন। কৌশলটি চার্টে মূল এমএ, এন্ট্রি এবং টিপি / এসএল স্তরগুলি প্লট করে।
সম্প্রসারণযোগ্য কাঠামো। কৌশল কাঠামো সম্পূর্ণ। এটিকে উন্নত করতে নতুন সংকেত এবং সূচক যুক্ত করা যেতে পারে।
এই কৌশলের ঝুঁকিগুলির মধ্যে রয়েছেঃ
চরম বাজার ইভেন্টের সময় হ্রাস বন্ধ করতে অক্ষম, যা বিশাল ড্রডাউন নিয়ে আসে। দ্রুত এমএ মূল্য পরিবর্তনের প্রতি সংবেদনশীল এবং চরম অবস্থার মধ্যে ব্যর্থ হতে পারে।
বিভিন্ন বাজারে ঝাঁকুনির শিকার, যা পরপর ক্ষতির কারণ হয়।
ট্রেডিং খরচ বিবেচনা করা হয় না। প্রকৃত ট্রেডিংয়ে ফি এবং স্লিপিং লাভজনকতাকে উল্লেখযোগ্যভাবে প্রভাবিত করবে।
ব্যাকটেস্ট ওভারফিটিংঃ বাস্তব বাজারের পরিস্থিতি জটিল এবং ব্যাকটেস্টের ফলাফলগুলি লাইভ পারফরম্যান্সের প্রতিনিধিত্ব করতে পারে না।
সমাধানগুলির মধ্যে রয়েছেঃ
একটি বৃহত্তর স্টপ লস ব্যবহার করুন, অথবা একটি অতিরিক্ত ব্রেকআউট স্টপ লস যোগ করুন।
এমএ দূরত্ব বাড়ান, ট্রেডিং ফ্রিকোয়েন্সি হ্রাস করুন, অথবা অন্যান্য ফিল্টার যুক্ত করুন।
প্রকৃত ট্রেডিং খরচ বিবেচনা করুন, একটি বৃহত্তর মুনাফা লক্ষ্য স্থান সেট.
পরিবর্তনশীল বাজারের পরিস্থিতি বিবেচনা করে পরামিতিগুলি ধীরে ধীরে অপ্টিমাইজ করুন এবং অতিরিক্ত ফিটিং হ্রাস করুন।
এই কৌশলটি নিম্নলিখিত দিকগুলিতে অনুকূলিত করা যেতে পারেঃ
সর্বোত্তম প্যারামিটার খুঁজে পেতে বিভিন্ন প্যারামিটার সমন্বয় পরীক্ষা করুন, যেমন এমএ সময়কাল।
ম্যাকড, কেডি ইত্যাদির মতো অন্যান্য সূচকগুলি ফিল্টার হিসাবে যুক্ত করুন।
স্টপ লস স্ট্র্যাটেজিকে অপ্টিমাইজ করুন যাতে ঝুঁকি ব্যবস্থাপনা আরও ভালো হয়।
ঝুঁকি নিয়ন্ত্রণের সাথে মুনাফা বাড়ানোর জন্য লিভারেজ দিয়ে পজিশনের আকার বাড়ান।
ট্রেডিং খরচ বিবেচনা করুন, লাইভ ট্রেডিং জন্য পরামিতি অপ্টিমাইজ।
অতিরিক্ত ফিটিং হ্রাস করার জন্য পরিসংখ্যানগত পদ্ধতি ব্যবহার করে পরামিতি স্থিতিশীলতা মূল্যায়ন করুন।
উপসংহারে, এই এমএ ক্রসওভার কৌশলটির একটি পরিষ্কার যুক্তি রয়েছে এবং এটি বাস্তবায়ন করা সহজ, এটি আলগো ট্রেডিংয়ের জন্য একটি ভূমিকা কৌশল হিসাবে উপযুক্ত। তবে এর ঝুঁকি এবং সীমাবদ্ধতাও রয়েছে। ধারাবাহিক মুনাফা অর্জনের জন্য সাবধানে প্যারামিটার এবং ফিল্টার অপ্টিমাইজেশন এবং ঝুঁকি নিয়ন্ত্রণ প্রয়োজন। এই কৌশলটি ব্যবহারকারীদের নিজস্ব ট্রেডিং শৈলীর সাথে খাপ খাইয়ে নেওয়ার জন্য এটির উপর ভিত্তি করে উদ্ভাবন এবং অপ্টিমাইজ করার জন্য দুর্দান্ত প্রসারণযোগ্যতা রয়েছে।
/*backtest start: 2023-10-02 00:00:00 end: 2023-10-09 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © gjfsdrtytru //@version=4 strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD) // Start code here... fastMA = sma(close,50) slowMA = sma(close,200) plot(fastMA, "Fast MA", color.blue) plot(slowMA, "Slow MA", color.red) // Long Enrty/Exit longCondition = crossover(fastMA,slowMA) closeLong = crossover(slowMA,fastMA) // Short Enrty/Exit shortCondition = crossover(slowMA,fastMA) closeShort = crossover(fastMA,slowMA) // Bot web-link alert - {{strategy.order.comment}} botLONG = "ENTRY LONG ALERT" botCLOSELONG = "CLOSE LONG ALERT" botSHORT = "ENTRY SHORT ALERT" botCLOSESHORT = "CLOSE SHORT ALERT" ////////////////////////////////////////////////////////////////// //////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\ /////////////////// [NO USER INPUT REQUIRED] ///////////////////// ////////////////////////////////////////////////////////////////// // Time period testStartYear = input(2020, "Backtest Start Year") testStartMonth = input(5, "Backtest Start Month") testStartDay = input(11, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time testPeriodStop = testPeriodStart + periodLength testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false // Convert Take profit and Stop loss to percentage longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options // 0% TP/SL = OFF (a value of 0 turns off TP/SL feature) longProfitPerc = longTP == 0 ? 1000 : longTP longStopPerc = longSL == 0 ? 1 : longSL shortProfitPerc = shortTP == 0 ? 1 : shortTP shortStopPerc = shortSL == 0 ? 1000 : shortSL // Determine TP/SL price based on percentage given longProfitPrice = strategy.position_avg_price * (1 + longProfitPerc) longStopPrice = strategy.position_avg_price * (1 - longStopPerc) shortProfitPrice = strategy.position_avg_price * (1 - shortProfitPerc) shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc) // Anti-overlap isEntry_Long = false isEntry_Long := nz(isEntry_Long[1], false) isExit_Long = false isExit_Long := nz(isExit_Long[1], false) isEntry_Short = false isEntry_Short := nz(isEntry_Short[1], false) isExit_Short = false isExit_Short := nz(isExit_Short[1], false) entryLong = not isEntry_Long and longCondition exitLong = not isExit_Long and closeLong entryShort = not isEntry_Short and shortCondition exitShort = not isExit_Short and closeShort if (entryLong) isEntry_Long := true isExit_Long := false if (exitLong) isEntry_Long := false isExit_Long := true if (entryShort) isEntry_Short := true isExit_Short := false if (exitShort) isEntry_Short := false isExit_Short := true // Order Execution if testPeriod() if entryLong strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}} if entryShort strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}} // TP/SL Execution if (strategy.position_size > 0) strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice) strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}} if (strategy.position_size < 0) strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice) strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}} // Draw Entry, TP and SL Levels for Long Positions plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP") plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry") plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL") // Draw Entry, TP and SL Levels for Short Positions plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP") plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry") plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")