Эта стратегия - это стратегия, которая использует комбинацию индекса относительной силы (RSI) и объема для определения направления тренда и следования тенденциям.
В этой стратегии используются следующие показатели и параметры:
Когда цена входит в зону покупки или продажи, соответствующий ордер направления будет открыт. После этого устанавливаются линии стоп-лосса и стоп-лосса. Когда запускается линия стоп-лосса или стоп-лосса, позиция закрывается. Также устанавливается механизм повторного входа, чтобы можно было открывать новые ордера, когда сигнал снова запускается, если он настроен.
Преимущества этой стратегии включают:
Существуют также некоторые риски:
Решения:
Эта стратегия может быть оптимизирована путем:
В заключение, это количественный тренд, следующий за стратегией с использованием показателей RSI и объема. Он имеет двойную систему проверки для идентификации сигналов, стоп-лосс / прибыль, чтобы контролировать риски, и механизм повторного входа для повышения прибыльности. С настройкой параметров и оптимизацией алгоритма, он может стать очень практичной трендовой торговой стратегией.
/*backtest start: 2023-11-21 00:00:00 end: 2023-12-21 00:00:00 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/ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ,@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .@@@@@@@@@@@@@@@ @@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ *@@@@@@@@@@@@@@ @@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@. @@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@. @ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@, @ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ // @@@@@@@@@@@@@@@@@@@@@@@@@@@ @ // @@@@@@@@@@@@@@@@@@@@@@@@@ @@ // @@@@@@@@@@@@@@@@@@@@@@@ @@ // @@@@@@@@@@@@@@@@@@@@@@ @@@ // @@@@@@@@@@@@@@@@@@@@@* @@@@@ @@@@ // @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@ // @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ @@@@@@@ // @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@% @@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@ %@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // © YinYangAlgorithms //@version=5 strategy("YinYang RSI Volume Trend Strategy", shorttitle="YinYang RSVT Strategy", overlay=true ) // ~~~~~~~~~~~ INPUTS ~~~~~~~~~~~ // len = input.int(80, "Trend Length:", tooltip="How far back should we span this indicator?\nThis length effects all lengths of the indicator") purchaseSrc = input.source(close, "Purchase Source (Long and Short):", tooltip="What source needs to exit the purchase zone for a purchase to happen?") exitSrc = input.source(close, "Exit Source (Long and Short):", tooltip="What source needs to hit a exit condition to stop the trade (Take profit, Stop Loss or hitting the other sides Purchase Zone)?") useTakeProfit = input.bool(true, "Use Take Profit", tooltip="Should we take profit IF we cross the basis line and then cross it AGAIN?") useStopLoss = input.bool(true, "Use Stop Loss", tooltip="Stop loss will ensure you don't lose too much if its a bad call") stopLossMult = input.float(0.1, "Stoploss Multiplier %:", tooltip="How far from the purchase lines should the stop loss be") resetCondition = input.string("Entry", "Reset Purchase Availability After:", options=["Entry", "Stop Loss", "None"], tooltip="If we reset after a condition is hit, this means we can purchase again when the purchase condition is met. \n" + "Otherwise, we will only purchase after an opposite signal has appeared.\n" + "Entry: means when the close enters the purchase zone (buy or sell).\n" + "Stop Loss: means when the close hits the stop loss location (even when were out of a trade)\n" + "This allows us to get more trades and also if our stop loss initally was hit but it WAS a good time to purchase, we don't lose that chance.") // ~~~~~~~~~~~ VARIABLES ~~~~~~~~~~~ // var bool longStart = na var bool longAvailable = na var bool longTakeProfitAvailable = na var bool longStopLoss = na var bool shortStart = na var bool shortAvailable = na var bool shortTakeProfitAvailable = na var bool shortStopLoss = na resetAfterStopLoss = resetCondition == "Stop Loss" resetAfterEntry = resetCondition == "Entry" // ~~~~~~~~~~~ CALCULATIONS ~~~~~~~~~~~ // // Mid Line midHigh = ta.vwma(ta.highest(high, len), len) midLow = ta.vwma(ta.lowest(low, len), len) mid = math.avg(midHigh, midLow) midSmoothed = ta.ema(mid, len) //Volume Filtered avgVol = ta.vwma(volume, len) volDiff = volume / avgVol midVolSmoothed = ta.vwma(midSmoothed * volDiff, 3) //RSI Filtered midDifference = ta.sma(midHigh - midLow, len) midRSI = ta.rsi(midVolSmoothed, len) * 0.01 midAdd = midRSI * midDifference //Calculate Zones purchaseZoneHigh = midSmoothed + midAdd purchaseZoneLow = midSmoothed - midAdd purchaseZoneBasis = math.avg(purchaseZoneHigh, purchaseZoneLow) //Create Stop Loss Locations stopLossHigh = purchaseZoneHigh * (1 + (stopLossMult * 0.01)) stopLossLow = purchaseZoneLow * (1 - (stopLossMult * 0.01)) // ~~~~~~~~~~~ PURCHASE CALCULATIONS ~~~~~~~~~~~ // //Long longEntry = ta.crossunder(purchaseSrc, purchaseZoneLow) longStart := ta.crossover(purchaseSrc, purchaseZoneLow) and longAvailable longAvailable := ta.crossunder(purchaseSrc, purchaseZoneHigh) or (resetAfterStopLoss and longStopLoss) or (resetAfterEntry and longEntry) ? true : longStart ? false : longAvailable[1] longEnd = ta.crossover(exitSrc, purchaseZoneHigh) longStopLoss := ta.crossunder(exitSrc, stopLossLow) longTakeProfitAvailable := ta.crossover(exitSrc, purchaseZoneBasis) ? true : longEnd ? false : longTakeProfitAvailable[1] longTakeProfit = ta.crossunder(exitSrc, purchaseZoneBasis) and longTakeProfitAvailable //Short shortEntry = ta.crossover(purchaseSrc, purchaseZoneHigh) shortStart := ta.crossunder(purchaseSrc, purchaseZoneHigh) and shortAvailable shortAvailable := ta.crossover(purchaseSrc, purchaseZoneLow) or (resetAfterStopLoss and shortStopLoss) or (resetAfterEntry and shortEntry)? true : shortStart ? false : shortAvailable[1] shortEnd = ta.crossunder(exitSrc, purchaseZoneLow) shortStopLoss := ta.crossover(exitSrc, stopLossHigh) shortTakeProfitAvailable := ta.crossunder(exitSrc, purchaseZoneBasis) ? true : shortEnd ? false : shortTakeProfitAvailable[1] shortTakeProfit = ta.crossover(exitSrc, purchaseZoneBasis) and shortTakeProfitAvailable // ~~~~~~~~~~~ PLOTS ~~~~~~~~~~~ // shortLine = plot(purchaseZoneHigh, color=color.green) shortStopLossLine = plot(stopLossHigh, color=color.green) //color=color.rgb(0, 97, 3) fill(shortLine, shortStopLossLine, color = color.new(color.green, 90)) plot(purchaseZoneBasis, color=color.white) longLine = plot(purchaseZoneLow, color=color.red) longStopLossLine = plot(stopLossLow, color=color.red) //color=color.rgb(105, 0, 0) fill(longLine, longStopLossLine, color=color.new(color.red, 90)) // ~~~~~~~~~~~ STRATEGY ~~~~~~~~~~~ // if (longStart) strategy.entry("buy", strategy.long) else if (longEnd or (useStopLoss and longStopLoss) or (useTakeProfit and longTakeProfit)) strategy.close("buy") if (shortStart) strategy.entry("sell", strategy.short) else if (shortEnd or (useStopLoss and shortStopLoss) or (useTakeProfit and shortTakeProfit)) strategy.close("sell") // ~~~~~~~~~~~ ALERTS ~~~~~~~~~~~ // if longStart or (longEnd or (useStopLoss and longStopLoss) or (useTakeProfit and longTakeProfit)) or shortStart or (shortEnd or (useStopLoss and shortStopLoss) or (useTakeProfit and shortTakeProfit)) alert("{{strategy.order.action}} | {{ticker}} | {{close}}", alert.freq_once_per_bar)