এই অনন্য পদ্ধতিগত নিয়ম-ভিত্তিক ট্রেডিং কৌশলটি নিম্নলিখিত প্রবণতা বিভাগে রয়েছে। এটি কাঁচা টিকার মূল্য থেকে জেনারেট ট্রেডিং সিগন্যালগুলিতে রূপান্তরিত স্বাভাবিক মূল্য সিরিজ ব্যবহার করে। উন্নত অবস্থান আকার এবং ঝুঁকি ব্যবস্থাপনা কৌশলগুলি, সাধারণত প্রাতিষ্ঠানিক পোর্টফোলিও পরিচালনার জন্য সংরক্ষিত, এই কৌশলটিতে ব্যবহৃত হয় - প্রমাণিত অবস্থান এবং ঝুঁকি নিয়ন্ত্রণ প্রযুক্তি যেমন পণ্য ট্রেডিং উপদেষ্টা এবং পরিচালিত ফিউচার তহবিলের মতো আর্থিক উপদেষ্টাদের দ্বারা ব্যবহৃত।
মূল লেনদেনগুলি সহজ, স্বাভাবিক মূল্য ক্রসওভার এইচএমএ হলে দীর্ঘ, ক্রসওভারের অধীনে এইচএমএ হলে সংক্ষিপ্ত। নতুন সংকেতগুলি বিদ্যমান বিরোধী অবস্থানগুলি বন্ধ করে দেয়।
পজিশনের আকার গতিশীলভাবে সাম্প্রতিক মূল্যের অস্থিরতা এবং ব্যবহারকারীর সংজ্ঞায়িত বার্ষিক ঝুঁকি লক্ষ্যের উপর ভিত্তি করে সামঞ্জস্য করা হয়। পজিশনগুলি ঝুঁকি-ওয়েটেড, কম অস্থিরতার সাথে বৃহত্তর আকার এবং উচ্চতর অস্থিরতার সাথে ছোট। সাম্প্রতিক অস্থিরতা হ'ল গত 14 টি সময়কালে রিটার্নের স্ট্যান্ডার্ড বিচ্যুতি, তারপরে প্রত্যাশিত রিটার্ন হিসাবে বার্ষিক অস্থিরতায় এক্সট্রোপোল করা হয়। অস্থিরতা সমন্বিত পজিশন আকারের জন্য বার্ষিক ঝুঁকি লক্ষ্যটি রেফারেন্স হিসাবে ব্যবহৃত হয়। ডিফল্ট লক্ষ্য মোট মূলধনের 10%। প্রাথমিক মূলধন প্রতি ব্যবসায়ের সর্বাধিক ক্ষতি হিসাবে সেট করা উচিত। সর্বাধিক লিভারেজ অন্তর্নিহিত প্রাকৃতিক অস্থিরতা অপর্যাপ্ত হলে ঝুঁকি লক্ষ্য অর্জনের অনুমতি দেয় এবং অত্যধিক কম অস্থিরতা হ্রাস করে।
হার্ড স্টপগুলি সাম্প্রতিক মূল্যের গড় সত্য পরিসীমা গুণক, ব্যবহারকারীর কনফিগারযোগ্য উপর ভিত্তি করে।
ঝুঁকি নিয়ন্ত্রণের ব্যবস্থাগুলির মধ্যে রয়েছে বিকল্প চলমান গড় নির্বাচন, ঝুঁকি লক্ষ্যমাত্রা সামঞ্জস্য করা।
কৌশলটি নরমালাইজেশন, গতিশীল অবস্থানের সমন্বয়, ঝুঁকি নিয়ন্ত্রণের জন্য হার্ড স্টপগুলির মতো বিভিন্ন কৌশলকে একীভূত করে। ট্রেডিং সহজ প্রবণতা অনুসরণকারী নিয়মের উপর ভিত্তি করে। ব্যক্তিগত পছন্দ এবং বাজার ব্যবস্থার জন্য পরামিতিগুলি সামঞ্জস্য করা যেতে পারে। কার্যকর বাস্তব বিশ্বের প্রয়োগের জন্য আরও পরীক্ষা এবং যাচাইয়ের মূল্য।
/*backtest start: 2023-01-17 00:00:00 end: 2024-01-23 00:00:00 period: 1d basePeriod: 1h 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 Normalised Trend Strategy", shorttitle="Normalised Trend Strategy", overlay=false ) // Inputs and Parameters src = input(close, 'Source', group='Strategy Settings') length = input.int(title="Lookback period for price normalisation filter", defval=14, minval=2, group='Strategy Settings', tooltip='This sets the lookback period for the volatility adjustment of returns, which is used to transform the price series into the "real price"') hlength = input.int(title="Lookback period for Hull Moving Average", defval=100, minval=2, group='Strategy Settings') offset = input.int(title="HMA Offset", defval=0, minval=0, group='Strategy Settings') long = input(true, 'Long', inline='08', group='Strategy Settings') short = input(true, 'Short', inline='08', group='Strategy Settings', tooltip='Toggle long/short strategy on/off') stopMultiple = input.float(1, 'Stop multiple', step=0.25, group='Risk Management Settings', tooltip='Multiple for ATR, setting hard stop loss from entry price') 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(10, 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(false, '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 = true // Normalised returns calculation nRet = (src - src[1]) / ta.stdev((src - src[1]), length) nPrice = ta.cum(nRet) //Hull Moving Average - using normalised price series fHMA = ta.wma(2 * ta.wma(nPrice[offset], hlength / 2) - ta.wma(nPrice[offset], hlength), math.round(math.sqrt(hlength))) //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 // Strategy Rules if long longCondition = ta.crossover(nPrice, fHMA) and window exitlong = ta.crossunder(nPrice, fHMA) if (longCondition) strategy.entry('Go Long!', strategy.long, qty=shares) if strategy.position_size > 0 strategy.exit('Stop Long', from_entry = 'Go Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple))) if (exitlong) strategy.close('Go Long!', immediately = true) if short shortCondition = ta.crossunder(nPrice, fHMA) and window exitshort = ta.crossover(nPrice, fHMA) if (shortCondition) strategy.entry('Go Short!', strategy.short, qty=shares) if strategy.position_size < 0 strategy.exit('Stop Short', from_entry = 'Go Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple))) if (exitshort) strategy.close('Go Short!', immediately = true) // Visuals of trend and direction plot(nPrice, title='Real Price', color=color.black) MAColor = fHMA > fHMA[3] ? #00ff00 : #ff0000 MA1 = plot(fHMA, title='Hull MA', color=MAColor) MA2 = plot(fHMA[3], title='Hull MA Offset', color=MAColor) fill(MA1, MA2, title='Band Filler', color=MAColor)