В этой стратегии используется динамический виток, чтобы оценить рыночные тенденции в соответствии с показателем Stoch RSI и осуществить виточную торговлю. Когда индикатор показывает, что он перекупил, он делает пустой, а когда он перепродает, он делает больше.
Эта стратегия имеет следующие преимущества:
В этой стратегии также есть некоторые риски, о которых следует помнить:
Эта стратегия также может быть оптимизирована в следующих направлениях:
Эта стратегия в целом использует более сложную концепцию динамического ротации, используя Stoch RSI в качестве основного торгового показателя, в сочетании с кривой для управления риском. Это надежная стратегия для отслеживания тенденций. С помощью оптимизации параметров и расширения модулей можно дополнительно повысить стабильность и адаптивность стратегии.
/*backtest
start: 2023-09-11 00:00:00
end: 2023-09-13 13:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This script was created for educational purposes only.
// © mcristianrios
// FEEL FREE TO DROP A COMMENT AND A LIKE IF YOU USE IT OR IT SERVES YOU WELL
//@version=4
//strategy(title="Pyramiding Strategy To Study [mcristianrios]", commission_type=strategy.commission.cash_per_contract, commission_value=0.0002, overlay=true, default_qty_value=1000, initial_capital=100, calc_on_order_fills=false, currency="USD", overlay=true, pyramiding=5)
// study(title="Pyramiding Strategy To Study [mcristianrios]", overlay=true)
int pyramiding = input(1, 'Pyramiding', minval=1, maxval=5)
int slPips = input(80, 'SL Pips')
int ttPips = input(60, 'Trail Trig')
int trailOffset = input(60, 'Trail Offset')
// === PYRAMIDING DECLARATION === {
var int longPyramiding = 0
var int shortPyramiding = 0
// To save init of operation price
var float close1 = na
var float close2 = na
var float close3 = na
var float close4 = na
var float close5 = na
// How far did the Trailing Stop Get?
var float far1 = na
var float far2 = na
var float far3 = na
var float far4 = na
var float far5 = na
// }
// === STOCHASTIC RSI === {
smoothK = input(3, minval=1)
smoothD = input(1, minval=1)
lengthRSI = input(14, minval=1)
lengthStoch = input(14, minval=1)
src = input(close, title="RSI Source")
rsi1 = rsi(src, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)
// }
// === SOME CONDITION TO TAKE A POSITION === {
goLong = k[1] < 80 and k >= 80 and longPyramiding < pyramiding
goShort = k[1] > 20 and k <= 20 and shortPyramiding < pyramiding
// }
// === PYRAMIDING SIMULATION === {
var string lastOperation = ''
if (goLong and lastOperation != 'LONG') or (goShort and lastOperation != 'SHORT')
// RESET
longPyramiding := 0
shortPyramiding := 0
far1 := na
far2 := na
far3 := na
far4 := na
far5 := na
close1 := na
close2 := na
close3 := na
close4 := na
close5 := na
// === SUM ONE INTO 'LONG' OR 'SHORT' PYRAMIDING AND REMEMBER LAST OPERATION TYPE === {
isCallOrShort = if goLong and longPyramiding < pyramiding
lastOperation := 'LONG'
longPyramiding := longPyramiding + 1
true
else
isShort = if goShort and shortPyramiding < pyramiding
lastOperation := 'SHORT'
shortPyramiding := shortPyramiding + 1
true
else
false
isShort
// }
// === SAVE CURRENT PRICE === {
if isCallOrShort
if na(close1)
close1 := close
else
if na(close2)
close2 := close
else
if na(close3)
close3 := close
else
if na(close4)
close4 := close
else
if na(close5)
close5 := close
// }
if longPyramiding > 0
// If Trail Stop was not triggered and distance is achieved saved it
if na(far1) and high > close1 + syminfo.mintick * 10 * ttPips
far1 := high
if na(far2) and high > close2 + syminfo.mintick * 10 * ttPips
far2 := high
if na(far3) and high > close3 + syminfo.mintick * 10 * ttPips
far3 := high
if na(far4) and high > close4 + syminfo.mintick * 10 * ttPips
far4 := high
if na(far5) and high > close5 + syminfo.mintick * 10 * ttPips
far5 := high
// Update how far our position went
if not na(far1) and high > far1
far1 := high
if not na(far2) and high > far2
far2 := high
if not na(far3) and high > far3
far3 := high
if not na(far4) and high > far4
far4 := high
if not na(far5) and high > far5
far5 := high
/// === SL not na(trailing stop) ? Use Trailing Stop : Use Default Stop Loss === {
if not na(close1) and (not na(far1) ? low <= far1 - syminfo.mintick * 10 * trailOffset : low <= close1 - syminfo.mintick * 10 * slPips)
longPyramiding := longPyramiding - 1
close1 := na
far1 := na
if not na(close2) and (not na(far2) ? low <= far2 - syminfo.mintick * 10 * trailOffset : low <= close2 - syminfo.mintick * 10 * slPips)
longPyramiding := longPyramiding - 1
close2 := na
far2 := na
if not na(close3) and (not na(far3) ? low <= far3 - syminfo.mintick * 10 * trailOffset : low <= close3 - syminfo.mintick * 10 * slPips)
longPyramiding := longPyramiding - 1
close3 := na
far3 := na
if not na(close4) and (not na(far4) ? low <= far4 - syminfo.mintick * 10 * trailOffset : low <= close4 - syminfo.mintick * 10 * slPips)
longPyramiding := longPyramiding - 1
close4 := na
far4 := na
if not na(close5) and (not na(far5) ? low <= far5 - syminfo.mintick * 10 * trailOffset : low <= close5 - syminfo.mintick * 10 * slPips)
longPyramiding := longPyramiding - 1
close5 := na
far5 := na
// }
// Log when long pyramiding changed
if longPyramiding[1] != longPyramiding[2]
label.new(bar_index, high, tostring(longPyramiding[1]), xloc.bar_index, yloc.price, size = size.normal, color=color.blue, textcolor=color.white)
if shortPyramiding > 0
// If Trail Stop was not triggered and distance is achieved saved it
if na(far1) and low < close1 - syminfo.mintick * 10 * ttPips
far1 := low
if na(far2) and low < close2 - syminfo.mintick * 10 * ttPips
far2 := low
if na(far3) and low < close3 - syminfo.mintick * 10 * ttPips
far3 := low
if na(far4) and low < close4 - syminfo.mintick * 10 * ttPips
far4 := low
if na(far5) and low < close5 - syminfo.mintick * 10 * ttPips
far5 := low
// Update how far our position went
if not na(far1) and low < far1
far1 := low
if not na(far2) and low < far2
far2 := low
if not na(far3) and low < far3
far3 := low
if not na(far4) and low < far4
far4 := low
if not na(far5) and low < far5
far5 := low
/// === SL not na(trailing stop) ? Use Trailing Stop : Use Default Stop Loss === {
if not na(close1) and (not na(far1) ? high >= far1 + syminfo.mintick * 10 * trailOffset : high >= close1 + syminfo.mintick * 10 * slPips)
shortPyramiding := shortPyramiding - 1
close1 := na
far1 := na
if not na(close2) and (not na(far2) ? high >= far2 + syminfo.mintick * 10 * trailOffset : high >= close2 + syminfo.mintick * 10 * slPips)
shortPyramiding := shortPyramiding - 1
close2 := na
far2 := na
if not na(close3) and (not na(far3) ? high >= far3 + syminfo.mintick * 10 * trailOffset : high >= close3 + syminfo.mintick * 10 * slPips)
shortPyramiding := shortPyramiding - 1
close3 := na
far3 := na
if not na(close4) and (not na(far4) ? high >= far4 + syminfo.mintick * 10 * trailOffset : high >= close4 + syminfo.mintick * 10 * slPips)
shortPyramiding := shortPyramiding - 1
close4 := na
far4 := na
if not na(close5) and (not na(far5) ? high >= far5 + syminfo.mintick * 10 * trailOffset : high >= close5 + syminfo.mintick * 10 * slPips)
shortPyramiding := shortPyramiding - 1
close5 := na
far5 := na
// }
// Log when long pyramiding changed
if shortPyramiding[1] != shortPyramiding[2]
label.new(bar_index, high + syminfo.mintick * 10 * 22, tostring(shortPyramiding[1]), xloc.bar_index, yloc.price, size = size.normal, color=color.red, textcolor=color.white)
// }
// === COMMENT IF STUDY === {
strategy.entry("Long", strategy.long, when = goLong and longPyramiding <= pyramiding)
strategy.entry("Short", strategy.short, when = goShort and shortPyramiding <= pyramiding)
strategy.exit("Exit Long", "Long", loss=slPips * 10, trail_points=ttPips * 10, trail_offset=trailOffset * 10)
strategy.exit("Exit Short", "Short", loss=slPips * 10, trail_points=ttPips * 10, trail_offset=trailOffset * 10)
// }
// === UNCOMMENT IF STUDY === {
// plot(ttPips, title='TrailTrig', color=na, display=display.none)
// plot(trailOffset, title='TrailOffset', color=na, display=display.none)
// plot(slPips, title='LossPips', color=na, display=display.none)
// string longTradeId = 'tradeid=long{{ticker}}_PYRAMIDING_[MCRISTIANRIOS]'
// string shortTradeId = 'tradeid=short{{ticker}}_PYRAMIDING_[MCRISTIANRIOS]'
// string basicTrade = 'tradesymbol={{ticker}} sl={{plot("LossPips")}} trailtrig={{plot("TrailTrig")}} traildist={{plot("TrailOffset")}}'
// alertcondition(goLong and longPyramiding <= pyramiding, title='Long', message='long ' + basicTrade + ' ' + longTradeId)
// alertcondition(goShort and shortPyramiding <= pyramiding, title='Short', message='short ' + basicTrade + ' ' + shortTradeId)
// alertcondition(goLong and longPyramiding <= pyramiding, title='XShort', message='closepart part=1 ' + shortTradeId)
// alertcondition(goShort and shortPyramiding <= pyramiding, title='XLong', message='closepart part=1 ' + longTradeId)
// }
// Background color for backtest
bgcolor(goLong[1] ? color.lime : goShort[1] ? color.red : na, transp=70)