এই কৌশলটি এক্সপোনেনশিয়াল মুভিং এভারেজ ক্রসওভার সিস্টেম এবং টার্টল ট্রেডিং সিস্টেমকে একীভূত করে, দুটি জনপ্রিয় পদ্ধতিগত ট্রেডিং কৌশল। এটি বিশেষভাবে দৈনিক সময়সীমার জন্য ডিজাইন করা হয়েছে গতিশীলভাবে অবস্থান পরিচালনা করে রিয়েল-টাইমে বাজারের প্রবণতা ট্র্যাক করতে।
কৌশলটিতে দুটি উপ-কৌশল রয়েছেঃ প্রবণতা কৌশল এবং ব্রেকআউট কৌশল।
ট্রেন্ড কৌশলটি দ্রুত ইএমএ এবং ধীর ইএমএ ক্রসওভারগুলি ট্রেডিং সংকেত হিসাবে ব্যবহার করে। দ্রুত ইএমএ সময়কাল ব্যবহারকারীর দ্বারা সংজ্ঞায়িত হয় এবং ধীর ইএমএ সময়কাল দ্রুত ইএমএর 5 গুণ। সংকেতটি ইএমএ পার্থক্যকে 252-পরিয়াল রিটার্ন স্ট্যান্ডার্ড বিচ্যুতি দ্বারা বিভক্ত করে উত্পন্ন হয়, যা আরও নির্ভরযোগ্য সংকেত উত্পাদন করতে অস্থিরতা-সমন্বিত। এটি নতুন প্রবণতা গঠন সনাক্ত করার সময় দীর্ঘ বা সংক্ষিপ্ত যায়।
ব্রেকআউট কৌশলটি বেসলাইন হিসাবে একটি নির্দিষ্ট পুনর্বিবেচনার সময়কালে সর্বোচ্চ উচ্চ এবং সর্বনিম্ন নিম্ন মূল্যের গড় ব্যবহার করে। যখন দামটি নির্দিষ্ট শতাংশে বেসলাইনের উপরে / নীচে ভেঙে যায় তখন দীর্ঘ / সংক্ষিপ্ত সংকেত উত্পন্ন হয়।
পজিশন সাইজিং সাম্প্রতিক মূল্যের অস্থিরতা এবং ব্যবহারকারীর সংজ্ঞায়িত বার্ষিক ঝুঁকি লক্ষ্যের উপর ভিত্তি করে। অস্থিরতা কম হলে বৃহত্তর আকার নেওয়া হয় এবং অস্থিরতা বেশি হলে ছোট আকার নেওয়া হয়। এটি ঝুঁকি সমন্বয় সহ গতিশীল অবস্থান পরিচালনা উপলব্ধি করে।
হার্ড স্টপগুলি গড় সত্যিকারের পরিসরের গুণিতক হিসাবে সেট করা হয়। ট্রেলিং স্টপগুলি সাম্প্রতিক সর্বোচ্চ সর্বোচ্চ বা সর্বনিম্ন নিম্ন মূল্যের অনুসরণ করে।
এই কৌশলটির প্রধান সুবিধাগুলির মধ্যে রয়েছেঃ
ট্রেন্ড ট্র্যাকিং এবং ব্রেকআউট উপ-কৌশলকে একত্রিত করে বিভিন্ন বাজারের পরিবেশে শক্তিশালী দৃঢ়তার সাথে মানিয়ে নেওয়া হয়।
উন্নত পজিশনের আকার নির্ধারণ এবং ঝুঁকি ব্যবস্থাপনার কৌশল প্রয়োগ করে গতিশীলভাবে পজিশন পরিচালনা করা হয় এবং কার্যকরভাবে ঝুঁকি নিয়ন্ত্রণ করা হয়।
সাম্প্রতিক অস্থিরতা এবং বার্ষিক ঝুঁকির লক্ষ্যমাত্রার ভিত্তিতে অস্থিরতা-সমন্বয় পজিশনগুলি উচ্চ/নিম্ন অস্থিরতা ব্যবস্থায় তুলনামূলকভাবে স্থিতিশীল পোর্টফোলিও ঝুঁকি বজায় রাখে।
স্টপ লস নির্ধারণ করা প্রকৃত মূল্যের ওঠানামা উপর ভিত্তি করে স্টপ রান থেকে অপ্রয়োজনীয় ছোট ক্ষতি এড়ায়।
রিয়েল-টাইমে ট্রেলিং স্টপ সামঞ্জস্য করে নমনীয়ভাবে মুনাফা বুক করার প্রবণতা অনুসরণ করে এবং সময়মতো বন্ধ করে দেয়।
এই কৌশলটির প্রধান ঝুঁকিগুলি হলঃ
পরামিতি অপ্টিমাইজেশান উপর নির্ভরশীলতা। বিভিন্ন পরামিতি উল্লেখযোগ্যভাবে কৌশল কর্মক্ষমতা প্রভাবিত তাই ব্যাপক পরীক্ষার অপ্টিম পরামিতি খুঁজে পেতে প্রয়োজন হয়।
ঘন ঘন স্টপ আউটগুলি অস্থির প্রবণতাগুলিতে। স্টপ লস প্রস্থটি শিথিল করা যেতে পারে এবং স্টপ প্রক্রিয়াগুলি অনুকূলিত করা যেতে পারে।
প্রাথমিক মূলধন এবং ট্রেডিং খরচ সম্পর্কে সংবেদনশীলতা। অপর্যাপ্ত প্রাথমিক মূলধন এবং উচ্চ ট্রেডিং খরচ লাভজনকতার উপর নেতিবাচক প্রভাব ফেলে।
পজিশনের আকার নির্ধারণ এবং ঝুঁকি নিয়ন্ত্রণের জন্য সঠিক অস্থিরতা অনুমানগুলির উপর নির্ভর করা। অ-নির্দিষ্ট অস্থিরতা অনুমানগুলি অতিরিক্ত বা কম আকারের পজিশনের দিকে পরিচালিত করে।
মূল অপ্টিমাইজেশান দিকগুলির মধ্যে রয়েছেঃ
বৃহত্তর ঐতিহাসিক ডেটাসেটের সাথে আরও ব্যাকটেস্টিংয়ের মাধ্যমে সর্বোত্তম প্যারামিটার সেট অনুসন্ধান করুন।
বিভিন্ন স্টপ যেমন চলমান স্টপ, সময় স্টপ, অস্থিরতা স্টপ ইত্যাদি পরীক্ষা করে স্টপ প্রক্রিয়া উন্নত করা।
সর্বোত্তম ঝুঁকি-ফেরত প্রোফাইল খুঁজে পেতে বিভিন্ন ঝুঁকি লক্ষ্যমাত্রা পরীক্ষা করে পজিশনের আকার এবং ঝুঁকি ব্যবস্থাপনা অনুকূল করুন। এছাড়াও বিভিন্ন লিভারেজ স্তরের প্রভাব পরীক্ষা করুন।
সিগন্যাল সঠিকতা এবং কৌশল দৃঢ়তা উন্নত করার জন্য আরো সহায়ক সূচক চেষ্টা করুন।
অবস্থান বরাদ্দের নির্ভুলতা উন্নত করার জন্য উচ্চতর সময়সীমার সংকেত দিয়ে সিদ্ধান্তে সহায়তা করে বিভিন্ন হোল্ডিং সময় পরীক্ষা করুন।
এই কৌশলটি ট্রেডিং কৌশলগুলির দুটি প্রধান বিভাগকে একীভূত করেঃ প্রবণতা অনুসরণ এবং ব্রেকআউট। উন্নত গতিশীল অবস্থান সমন্বয় কৌশল প্রয়োগ করে, এটি লাভের দিকে বাজারের গতি অনুসরণ করার সময় কার্যকরভাবে ঝুঁকি নিয়ন্ত্রণ করে। এটি শক্তিশালী মুনাফা সম্ভাবনা প্রদর্শন করে এবং আরও পরীক্ষা এবং অপ্টিমাইজেশনের মূল্যবান।
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m 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/ // © Crunchster1 //@version=5 strategy(title="Crunchster's Turtle and Trend System", shorttitle="Turtle Trend", overlay=true, slippage=10, pyramiding=1, precision = 4, calc_on_order_fills = false, calc_on_every_tick = false, default_qty_value = 0.1, initial_capital = 1000, commission_value = 0.06, process_orders_on_close = true) // Inputs and Parameters src = input(close, 'Source', group='Strategy Settings') length = input.int(title="Lookback period for fast EMA", defval=10, minval=2, group='Strategy Settings', tooltip='This sets the lookback period for the fast exponential moving average. The slow EMA is 5x the fast EMA length') blength = input.int(title="Lookback period for Breakout", defval=20, minval=5, step=5, group='Strategy Settings') long = input(true, 'Long', inline='08', group='Strategy toggle') short = input(true, 'Short', inline='08', group='Strategy toggle', tooltip='Toggle long/short strategy on/off') EMAwt = input(false, 'Trend', inline='01', group='Strategy toggle') breakwt = input(true, 'Breakout', inline='01', group='Strategy toggle', tooltip='Toggle trend/breakout strategy on/off') stopMultiple = input.float(2, 'Stop multiple', step=0.5, group='Risk Management Settings', tooltip='Multiple for ATR, setting hard stop loss from entry price') trail = input.int(10, 'Trail lookback', step=5, group='Risk Management Settings', tooltip='Lookback period for the trailing stop') lev = input.float(1, 'Max Leverage', step=0.5, group='Risk Management Settings', tooltip='Max leverage sets maximum allowable leverage of total capital (initial capital + any net profit), capping maximum volatility adjusted position size') riskT = input.float(15, maxval=75, title='Annualised Volatility Target %', group='Risk Management Settings', tooltip='Specify annual risk target, used to determine volatility adjusted position size. Annualised daily volatility is referenced to this value and position size adjusted accordingly') comp = input(true, 'Compounding', inline='09', group='Risk Management Settings') Comppct = input.float(50, '%', step=5, inline='09', group='Risk Management Settings', tooltip='Toggle compounding of profit, and set % of profit to compound') // Backtesting period FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, inline='04', group='Backtest range') FromMonth = input.int(defval=1, title='From Mon', minval=1, maxval=12, inline='04', group='Backtest range') FromYear = input.int(defval=2018, title='From Yr', minval=1900, inline='04', group='Backtest range', tooltip='Set start of backtesting period') ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, inline='05', group='Backtest range') ToMonth = input.int(defval=1, title='To Mon', minval=1, maxval=12, inline='05', group='Backtest range') ToYear = input.int(defval=9999, title='To Yr', minval=1900, inline='05', group='Backtest range', tooltip='Set end of backtesting period') start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window = time >= start and time <= finish // Breakout strategy lower = ta.lowest(low[1], blength) upper = ta.highest(high[1], blength) basis = math.avg(upper, lower) signal = 20*(close - basis) / (upper - lower) // Trend strategy fEMA = ta.ema(close[1], length) sEMA = ta.ema(close[1], length*5) emadiff = fEMA - sEMA nemadiff = 5*emadiff/(ta.stdev(close - close[1], 252)) //Risk Management formulae strategy.initial_capital = 50000 tr = math.max(high - low, math.abs(high - close), math.abs(low - close)) //True range stopL = ta.sma(tr, 14) //Average true range stdev = ta.stdev(close-close[1], 14) //volatility of recent returns maxcapital = strategy.initial_capital+strategy.netprofit //Maximum capital available to invest - initial capital net of profit annvol = 100*math.sqrt(365)*stdev/close //converts recent volatility of returns into annualised volatility of returns - assumes daily timeframe risk = 1.1 if comp risk := (strategy.initial_capital+(Comppct*strategy.netprofit/100))//adjust investment capital to include compounding else risk := strategy.initial_capital shares = (risk * (riskT/annvol)) / close //calculates volatility adjusted position size, dependent on user specified annualised risk target if ((shares*close) > lev*maxcapital) //ensures position size does not exceed available capital multiplied by user specified maximum leverage shares := lev*maxcapital/close //To set the price at the entry point of trade Posopen() => math.abs(strategy.position_size[1]) <= 0 and math.abs(strategy.position_size) > 0 var float openN = na if Posopen() openN := stopL // Trailing stop tlower = ta.lowest(low[1], trail) tupper = ta.highest(high[1], trail) tbasis = math.avg(tupper, tlower) tsignal = 20*(close - tbasis) / (tupper - tlower) // Strategy Rules if EMAwt if long longCondition2 = (nemadiff >2 and nemadiff[1] <2) and window exitlong = tsignal <= -10 if (longCondition2) strategy.entry('Trend Long!', strategy.long, qty=shares) if strategy.position_size > 0 strategy.exit('Stop Long', from_entry = 'Trend Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple))) if (exitlong) strategy.close('Trend Long!', immediately = true) if short shortCondition2 = (nemadiff <-1 and nemadiff[1] >-1) and window exitshort = tsignal >= 10 if (shortCondition2) strategy.entry('Trend Short!', strategy.short, qty=shares) if strategy.position_size < 0 strategy.exit('Stop Short', from_entry = 'Trend Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple))) if (exitshort) strategy.close('Trend Short!', immediately = true) if breakwt if long longCondition1 = (signal >= 10) and window exitlong = tsignal <= -10 if (longCondition1) strategy.entry('Break Long!', strategy.long, qty=shares) if strategy.position_size > 0 strategy.exit('Stop Long', from_entry = 'Break Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple))) if (exitlong) strategy.close('Break Long!', immediately = true) if short shortCondition1 = (signal <= -10) and window exitshort = tsignal >= 10 if (shortCondition1) strategy.entry('Break Short!', strategy.short, qty=shares) if strategy.position_size < 0 strategy.exit('Stop Short', from_entry = 'Break Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple))) if (exitshort) strategy.close('Break Short!', immediately = true) // Visuals of trend and direction plot(nemadiff, title='EMA Forecast', color=color.black, display=display.none) plot(ta.sma(ta.median(math.sqrt(math.pow(nemadiff,2)), 700), 350), 'Forecast mean', color=color.rgb(245, 0, 0), display=display.none) MAColor = fEMA > sEMA ? #00ff00 : #ff0000 MA1 = plot(fEMA, title='Fast EMA', color=MAColor) MA2 = plot(sEMA, title='Slow EMA', color=MAColor) fill(MA1, MA2, title='Band Filler', color=MAColor)