اس حکمت عملی میں قیمتوں کے رجحانات کی نشاندہی کرنے اور رجحانات کے الٹ ہونے پر بروقت پوزیشن لینے کے لئے دوہری ای ایم اے اور آر ایس آئی اشارے کے استعمال کو جوڑ دیا گیا ہے۔ خاص طور پر ، یہ حکمت عملی اہم رجحان کی سمت کا فیصلہ کرنے کے لئے ایک طویل سائیکل ای ایم اے کا استعمال کرتی ہے ، جبکہ مختصر مدت میں زیادہ خریدنے اور زیادہ فروخت ہونے والے حالات کا تعین کرنے کے لئے آر ایس آئی اشارے کا استعمال کرتی ہے۔ یہ آر ایس آئی اشارے کے ذریعہ تجارتی سگنل تیار کرتی ہے جب قیمتیں اس کے مطابق طویل یا مختصر اندراجات کے لئے اہم رجحان کی سمت میں پیچھے ہٹ جاتی ہیں۔
اہم رجحان کی سمت کا تعین کرنے کے لئے 200 مدت کے ای ایم اے کا استعمال کریں۔ ای ایم اے لائن سے اوپر کی قیمت عبور کرنے سے تیزی کا اشارہ ہوتا ہے ، جبکہ اس سے نیچے کی حد عبور کرنے سے bearish نقطہ نظر کا اشارہ ہوتا ہے۔
RSI اشارے کے پیرامیٹر کو 10 ادوار پر مقرر کیا گیا ہے۔ RSI 40 سگنل سے اوپر کی حد کو عبور کرتا ہے جبکہ 60 سگنل سے نیچے کی حد کو عبور کرتا ہے۔
جب اہم رجحان اوپر ہے (قیمت ای ایم اے لائن سے اوپر) اور آر ایس آئی کراسنگ 40 سے نیچے oversold سگنل ہوتا ہے، تو طویل عرصے تک جانا.
جب اہم رجحان نیچے ہے (قیمت ای ایم اے لائن سے نیچے ہے) اور آر ایس آئی 60 سے اوپر کی حد کو عبور کرتا ہے تو ، مختصر ہوجائیں۔
اسٹاپ نقصان کو اے ٹی آر اشارے کے 4 گنا مقرر کریں۔ 2: 1 رسک انعام تناسب کے لئے منافع کو اسٹاپ نقصان کے 2 گنا مقرر کریں۔
اس حکمت عملی کا سب سے بڑا فائدہ رجحان اور الٹ اشارے دونوں کا امتزاج ہے ، جو رجحان کے اندر واپسی کے وقت بروقت اندراج کی اجازت دیتا ہے ، اس طرح بہتر کارکردگی حاصل کی جاسکتی ہے۔ مخصوص فوائد میں شامل ہیں:
مؤثر رجحان ٹریکنگ کے لئے بنیادی رجحان کی سمت کا تعین کرنے کے لئے دوہری EMA نظام کا استعمال.
RSI اشارے مختصر مدت میں overbought / oversold حالات کی نشاندہی کرتا ہے، داخلہ وقت کی مدد کرتا ہے.
سٹاپ نقصان کا تعین اے ٹی آر اشارے کے ذریعے بہتر رسک کنٹرول کے لیے مارکیٹ کی اتار چڑھاؤ کے مطابق کیا جاتا ہے۔
ٹرینڈ ٹریڈنگ کے اصولوں پر سختی سے عمل کرنے سے غیر ضروری تجارت اور سسٹم کا خطرہ کم ہوتا ہے۔
اس حکمت عملی کے اہم خطرات میں شامل ہیں:
جب رجحان کمزور ہوتا ہے اور قیمتیں اتار چڑھاؤ کرتی ہیں تو غلط تجارتی سگنل سامنے آسکتے ہیں۔ ان اوقات میں محتاط تجارت کریں۔
اے ٹی آر کے ذریعہ مقرر کردہ اسٹاپ نقصان انتہائی مارکیٹ کے حالات میں بہت وسیع یا بہت تنگ ہوسکتا ہے۔ متحرک ایڈجسٹمنٹ یا دیگر اسٹاپ نقصان کے طریقہ کار پر غور کیا جانا چاہئے۔
ممکنہ طور پر اعلی سگنل فریکوئنسی کے لئے ذاتی ٹریڈنگ فریکوئنسی کی ترجیحات کو مماثل کرنا ضروری ہے۔
آر ایس آئی پیرامیٹر کی مناسبیت کی نگرانی کی ضرورت ہے تاکہ بروقت اصلاح کی جاسکے۔
اصلاح کی اہم سمتوں میں شامل ہیں:
ٹیسٹ میں رجحان کا فیصلہ کرنے میں مدد کے لئے MACD جیسے دیگر رجحان کے اشارے شامل کرنا۔
بہتر سگنلز کے لئے RSI کو دیگر الٹ اشارے جیسے KDJ، بولنگر بینڈ کے ساتھ مل کر ٹیسٹ کریں۔
متحرک پیرامیٹر ایڈجسٹمنٹ اور موافقت پذیر اسٹاپ نقصان / منافع لینے کے لئے مشین لرننگ الگورتھم متعارف کروائیں۔
نظام کی مضبوطی کے لیے جذبات، خبروں جیسے مزید عوامل شامل کریں۔
مجموعی طور پر یہ ایک بہت ہی عام قلیل مدتی حکمت عملی ہے جس میں رجحان کی پیروی اور الٹ اشارے ملتے ہیں۔ یہ ڈبل ای ایم اے کے ساتھ بڑے رجحان کا فیصلہ کرتا ہے اور آر ایس آئی کی الٹ کی خصوصیات کا استعمال کرتے ہوئے رجحانات کے اندر واپسی کے مواقع کو پکڑتا ہے۔ اصول میں ، یہ حکمت عملی بہت اچھے تکمیلی اثرات کے ل different مختلف اشارے کی طاقت کو جوڑتی ہے۔ پیرامیٹرز کی اصلاح ، ماڈل فیوژن وغیرہ میں مزید بہتری اس کی کارکردگی کو نمایاں طور پر بڑھا سکتی ہے۔
/*backtest start: 2024-01-10 00:00:00 end: 2024-01-14 13:00:00 period: 5m 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/ // © kevinmck100 // @description // This strategy is intended to be used as a base template for building new strategies. // // It incorporates the following features: // // - Risk management: Configurable X% loss per stop loss // Configurable R:R ratio // // - Trade entry: Calculated position size based on risk tolerance // // - Trade exit: Stop Loss currently configurable ATR multiplier but can be replaced based on strategy // Take Profit calculated from Stop Loss using R:R ratio // // - Backtesting: Configurable backtesting range by date // // - Trade drawings: TP/SL boxes drawn for all trades. Can be turned on and off // Trade exit information labels. Can be turned on and off // NOTE: Trade drawings will only be applicable when using overlay strategies // // - Debugging: Includes section with useful debugging techniques // // Strategy conditions: // // - Trade entry: LONG: C1: Price is above EMA line // C2: RSI is crossing out of oversold area // SHORT: C1: Price is below EMA line // C2: RSI is crossing out of overbought area // // - Trade exit: Stop Loss: Stop Loss ATR multiplier is hit // Take Profit: R:R multiplier * Stop Loss is hit // // The idea is to use RSI to catch pullbacks within the main trend. Note that // this strategy is intended to be a simple base strategy for building upon. // It was not designed to be traded in its current form. //@version=5 INITIAL_CAPITAL = 1000 DEFAULT_COMMISSION = 0.02 MAX_DRAWINGS = 500 IS_OVERLAY = true strategy("Risk Management Strategy Template", "Strategy Template", overlay = IS_OVERLAY, initial_capital = INITIAL_CAPITAL, currency = currency.NONE, max_labels_count = MAX_DRAWINGS, max_boxes_count = MAX_DRAWINGS, max_lines_count = MAX_DRAWINGS, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = DEFAULT_COMMISSION) // ============================================================================= // INPUTS // ============================================================================= // ------------------------ Replacable section - Start ------------------------- // ------------------ // Indicator Settings // ------------------ emaLength = input.int (200, "EMA Length ", group = "Indicators: Settings", inline = "IS1", minval = 1, tooltip = "EMA line to identify trend direction. Above EMA trend line is bullish. Below EMA trend line is bearish") rsiLength = input.int (10, "RSI Length ", group = "Indicators: Settings", inline = "IS2", minval = 1) // ---------------------- // Trade Entry Conditions // ---------------------- rsiOverbought = input.int (60, "RSI Overbought ", group = "Strategy: Conditions", inline = "SC1", minval = 50, maxval = 100, tooltip = "RSI overbought level used to identify pullbacks within the main trend. RSI crossing BELOW this level triggers a SHORT when in a DOWN trend") rsiOversold = input.int (40, "RSI Oversold ", group = "Strategy: Conditions", inline = "SC2", minval = 0, maxval = 50, tooltip = "RSI overbought level used to identify pullbacks within the main trend. RSI crossing ABOVE this level triggers a LONG when in an UP trend") // --------------------- // Trade Exit Conditions // --------------------- atrLength = input.int (14, "Stop Loss ATR Length ", group = "Strategy: Exit Conditions", inline = "EC1", minval = 0, tooltip = "Length of ATR used to calculate Stop Loss.") slAtrMultiplier = input.float(4, "Stop Loss ATR Multiplier ", group = "Strategy: Exit Conditions", inline = "EC2", minval = 0, step = 0.1, tooltip = "Size of StopLoss is determined by multiplication of ATR value. Take Profit is derived from this also by multiplying the StopLoss value by the Risk:Reward multiplier.") // ------------------------- Replacable section - End -------------------------- // --------------- // Risk Management // --------------- riskReward = input.float(2, "Risk : Reward 1 :", group = "Strategy: Risk Management", inline = "RM1", minval = 0, step = 0.1, tooltip = "Previous high or low (long/short dependant) is used to determine TP level. 'Risk : Reward' ratio is then used to calculate SL based of previous high/low level.\n\nIn short, the higher the R:R ratio, the smaller the SL since TP target is fixed by previous high/low price data.") accountRiskPercent = input.float(1, "Portfolio Risk % ", group = "Strategy: Risk Management", inline = "RM1", minval = 0, step = 0.1, tooltip = "Percentage of portfolio you lose if trade hits SL.\n\nYou then stand to gain\n Portfolio Risk % * Risk : Reward\nif trade hits TP.") // ---------- // Date Range // ---------- startYear = input.int (2022, "Start Date ", group = 'Strategy: Date Range', inline = 'DR1', minval = 1900, maxval = 2100) startMonth = input.int (1, "", group = 'Strategy: Date Range', inline = 'DR1', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) startDate = input.int (1, "", group = 'Strategy: Date Range', inline = 'DR1', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]) endYear = input.int (2100, "End Date ", group = 'Strategy: Date Range', inline = 'DR2', minval = 1900, maxval = 2100) endMonth = input.int (1, "", group = 'Strategy: Date Range', inline = 'DR2', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) endDate = input.int (1, "", group = 'Strategy: Date Range', inline = 'DR2', options = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]) // ---------------- // Drawing Settings // ---------------- showTpSlBoxes = input.bool(false, "Show TP / SL Boxes", group = "Strategy: Drawings", inline = "D1", tooltip = "Show or hide TP and SL position boxes.\n\nNote: TradingView limits the maximum number of boxes that can be displayed to 500 so they may not appear for all price data under test.") showLabels = input.bool(false, "Show Trade Exit Labels", group = "Strategy: Drawings", inline = "D2", tooltip = "Useful labels to identify Profit/Loss and cumulative portfolio capital after each trade closes.\n\nAlso note that TradingView limits the max number of 'boxes' that can be displayed on a chart (max 500). This means when you lookback far enough on the chart you will not see the TP/SL boxes. However you can check this option to identify where trades exited.") // ============================================================================= // INDICATORS // ============================================================================= // ------------------------ Replacable section - Start ------------------------- // --- // EMA // --- ema = ta.ema(close, emaLength) plot(ema, "EMA Trend Line", color.white) // --- // RSI // --- rsi = ta.rsi(close, rsiLength) // ------------------------- Replacable section - End -------------------------- // ============================================================================= // STRATEGY LOGIC // ============================================================================= // --------- // FUNCTIONS // --------- percentAsPoints(pcnt) => math.round(pcnt / 100 * close / syminfo.mintick) calcStopLossPrice(pointsOffset, isLong) => priceOffset = pointsOffset * syminfo.mintick if isLong close - priceOffset else close + priceOffset calcProfitTrgtPrice(pointsOffset, isLong) => calcStopLossPrice(-pointsOffset, isLong) printLabel(barIndex, msg) => label.new(barIndex, close, msg) printTpSlHitBox(left, right, slHit, tpHit, entryPrice, slPrice, tpPrice) => if showTpSlBoxes box.new (left = left, top = entryPrice, right = right, bottom = slPrice, bgcolor = slHit ? color.new(color.red, 60) : color.new(color.gray, 90), border_width = 0) box.new (left = left, top = entryPrice, right = right, bottom = tpPrice, bgcolor = tpHit ? color.new(color.green, 60) : color.new(color.gray, 90), border_width = 0) line.new(x1 = left, y1 = entryPrice, x2 = right, y2 = entryPrice, color = color.new(color.yellow, 20)) line.new(x1 = left, y1 = slPrice, x2 = right, y2 = slPrice, color = color.new(color.red, 20)) line.new(x1 = left, y1 = tpPrice, x2 = right, y2 = tpPrice, color = color.new(color.green, 20)) printTpSlNotHitBox(left, right, entryPrice, slPrice, tpPrice) => if showTpSlBoxes box.new (left = left, top = entryPrice, right = right, bottom = slPrice, bgcolor = color.new(color.gray, 90), border_width = 0) box.new (left = left, top = entryPrice, right = right, bottom = tpPrice, bgcolor = color.new(color.gray, 90), border_width = 0) line.new(x1 = left, y1 = entryPrice, x2 = right, y2 = entryPrice, color = color.new(color.yellow, 20)) line.new(x1 = left, y1 = slPrice, x2 = right, y2 = slPrice, color = color.new(color.red, 20)) line.new(x1 = left, y1 = tpPrice, x2 = right, y2 = tpPrice, color = color.new(color.green, 20)) printTradeExitLabel(x, y, posSize, entryPrice, pnl) => if showLabels labelStr = "Position Size: " + str.tostring(math.abs(posSize), "#.##") + "\nPNL: " + str.tostring(pnl, "#.##") + "\nCapital: " + str.tostring(strategy.equity, "#.##") + "\nEntry Price: " + str.tostring(entryPrice, "#.##") label.new(x = x, y = y, text = labelStr, color = pnl > 0 ? color.new(color.green, 60) : color.new(color.red, 60), textcolor = color.white, style = label.style_label_down) // ---------- // CONDITIONS // ---------- inDateRange = time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0) and time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0) // ------------------------ Replacable section - Start ------------------------- // Condition 1: Price above EMA indicates bullish trend, price below EMA indicates bearish trend bullEma = close > ema bearEma = close < ema // Condition 2: RSI crossing back from overbought/oversold indicates pullback within trend bullRsi = ta.crossover (rsi, rsiOversold) bearRsi = ta.crossunder (rsi, rsiOverbought) // Combine all entry conditions goLong = inDateRange and bullEma and bullRsi goShort = inDateRange and bearEma and bearRsi // ------------------------- Replacable section - End -------------------------- // Trade entry and exit variables var tradeEntryBar = bar_index var profitPoints = 0. var lossPoints = 0. var slPrice = 0. var tpPrice = 0. var inLong = false var inShort = false // Entry decisions openLong = (goLong and not inLong) openShort = (goShort and not inShort) flippingSides = (goLong and inShort) or (goShort and inLong) enteringTrade = openLong or openShort inTrade = inLong or inShort // ------------------------ Replacable section - Start ------------------------- // Exit calculations atr = ta.atr(atrLength) slAmount = atr * slAtrMultiplier slPercent = math.abs((1 - (close - slAmount) / close) * 100) tpPercent = slPercent * riskReward // ------------------------- Replacable section - End -------------------------- // Risk calculations riskAmt = strategy.equity * accountRiskPercent / 100 entryQty = math.abs(riskAmt / slPercent * 100) / close if openLong if strategy.position_size < 0 printTpSlNotHitBox(tradeEntryBar + 1, bar_index + 1, strategy.position_avg_price, slPrice, tpPrice) printTradeExitLabel(bar_index + 1, math.max(tpPrice, slPrice), strategy.position_size, strategy.position_avg_price, strategy.openprofit) strategy.entry("Long", strategy.long, qty = entryQty, alert_message = "Long Entry") enteringTrade := true inLong := true inShort := false if openShort if strategy.position_size > 0 printTpSlNotHitBox(tradeEntryBar + 1, bar_index + 1, strategy.position_avg_price, slPrice, tpPrice) printTradeExitLabel(bar_index + 1, math.max(tpPrice, slPrice), strategy.position_size, strategy.position_avg_price, strategy.openprofit) strategy.entry("Short", strategy.short, qty = entryQty, alert_message = "Short Entry") enteringTrade := true inShort := true inLong := false if enteringTrade profitPoints := percentAsPoints(tpPercent) lossPoints := percentAsPoints(slPercent) slPrice := calcStopLossPrice(lossPoints, openLong) tpPrice := calcProfitTrgtPrice(profitPoints, openLong) tradeEntryBar := bar_index strategy.exit("TP/SL", profit = profitPoints, loss = lossPoints, comment_profit = "TP Hit", comment_loss = "SL Hit", alert_profit = "TP Hit Alert", alert_loss = "SL Hit Alert") // ============================================================================= // DRAWINGS // ============================================================================= // ----------- // TP/SL Boxes // ----------- slHit = (inShort and high >= slPrice) or (inLong and low <= slPrice) tpHit = (inLong and high >= tpPrice) or (inShort and low <= tpPrice) exitTriggered = slHit or tpHit entryPrice = strategy.closedtrades.entry_price (strategy.closedtrades - 1) pnl = strategy.closedtrades.profit (strategy.closedtrades - 1) posSize = strategy.closedtrades.size (strategy.closedtrades - 1) // Print boxes for trades closed at profit or loss if (inTrade and exitTriggered) inShort := false inLong := false printTpSlHitBox(tradeEntryBar + 1, bar_index, slHit, tpHit, entryPrice, slPrice, tpPrice) printTradeExitLabel(bar_index, math.max(tpPrice, slPrice), posSize, entryPrice, pnl) // Print TP/SL box for current open trade if barstate.islastconfirmedhistory and strategy.position_size != 0 printTpSlNotHitBox(tradeEntryBar + 1, bar_index + 1, strategy.position_avg_price, slPrice, tpPrice) // ============================================================================= // DEBUGGING // ============================================================================= // Data window plots plotchar(slPrice, "Stop Loss Price", "") plotchar(tpPrice, "Take Profit Price", "") // Label plots plotDebugLabels = false if plotDebugLabels if bar_index == tradeEntryBar printLabel(bar_index, "Position size: " + str.tostring(entryQty * close, "#.##"))