Это пирамидальная торговая стратегия, основанная на нескольких индикаторах Supertrend. Она определяет высоковероятные торговые возможности с использованием трех индикаторов Supertrend с разными периодами и мультипликаторами. Стратегия использует динамические пирамидальные записи, позволяющие до трех позиций, в сочетании с динамическими условиями стоп-лосса и гибкими условиями выхода для максимизации прибыли при одновременном контроле рисков.
Стратегия использует три индикатора супертенденции с различными параметрами: быстрыми, средними и медленными. Сигналы входа основаны на перекрестках и направлениях тренда этих индикаторов, реализуя трехслойный пирамидальный подход: первый вход, когда быстрый индикатор указывает вниз, а средний указывает вверх и замедляет точки вниз; второй вход через прорыв, когда как быстрые, так и средние индикаторы указывают вниз; третий вход через прорыв, когда цена достигает новых максимумов. Выходы управляются посредством нескольких механизмов, включая динамическую стоп-лосс, среднюю стоп-цену и общую обратную тенденцию.
Стратегия охватывает возможности тренда с помощью нескольких индикаторов Supertrend и пирамидальных записей, контролируя риски с помощью динамических стоп-лосс и гибких механизмов выхода.
/*backtest start: 2019-12-23 08:00:00 end: 2025-01-04 08:00:00 period: 1d basePeriod: 1d exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=6 strategy('4Vietnamese 3x Supertrend', overlay=true, max_bars_back=1000, initial_capital = 10000000000, slippage = 2, commission_type = strategy.commission.percent, commission_value = 0.013, default_qty_type=strategy.percent_of_equity, default_qty_value = 33.33, pyramiding = 3, margin_long = 0, margin_short = 0) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Inputs // Supertrend Settings STATRLENGTH1 = input.int(10, title='Fast Supertrend ATR Length', group='SUPERTREND SETTINGS') STATRMULT1 = input.float(1, title='Fast Supertrend ATR Multiplier', group='SUPERTREND SETTINGS') STATRLENGTH2 = input.int(11, title='Medium Supertrend ATR Length', group='SUPERTREND SETTINGS') STATRMULT2 = input.float(2, title='Medium Supertrend ATR Multiplier', group='SUPERTREND SETTINGS') STATRLENGTH3 = input.int(12, title='Slow Supertrend ATR Length', group='SUPERTREND SETTINGS') STATRMULT3 = input.float(3, title='Slow Supertrend ATR Multiplier', group='SUPERTREND SETTINGS') isUseHighestOf2RedCandleSetup = input.bool(false, group = "Setup Filters") /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Calculations [superTrend1, dir1] = ta.supertrend(STATRMULT1, STATRLENGTH1) [superTrend2, dir2] = ta.supertrend(STATRMULT2, STATRLENGTH2) [superTrend3, dir3] = ta.supertrend(STATRMULT3, STATRLENGTH3) // directionST1 = dir1 == 1 and dir1[1] == 1 ? false : dir1 == -1 and dir1[1] == -1 ? true : false // directionST2 = dir2 == 1 and dir2[1] == 1 ? false : dir2 == -1 and dir2[1] == -1 ? true : false // directionST3 = dir3 == 1 and dir3[1] == 1 ? false : dir3 == -1 and dir3[1] == -1 ? true : false /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Calculate highest from supertrend1 uptrend var float highestGreen = 0 if dir1 < 0 and highestGreen == 0 and (isUseHighestOf2RedCandleSetup ? close < open : true) highestGreen := high if highestGreen > 0 and (isUseHighestOf2RedCandleSetup ? close < open : true) if high > highestGreen highestGreen := high if dir1 >= 0 highestGreen := 0 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Entry SL var entrySL4Long1 = false var entrySL4Long2 = false var entrySL4Long3 = false isUseEntrySL = input.bool(true, group = "Entry SL Option") dataToCalculate = input.source(low, group = "Entry SL Option") if isUseEntrySL and (dir1 > 0 and dir2 < 0 and dir3 < 0) if strategy.opentrades >= 1 if dataToCalculate > strategy.opentrades.entry_price(0) entrySL4Long1 := true else entrySL4Long1 := false if entrySL4Long1 and close > strategy.opentrades.entry_price(0) strategy.exit('exit1', from_entry = 'long1', stop = strategy.opentrades.entry_price(0)) if strategy.opentrades >= 2 if dataToCalculate > strategy.opentrades.entry_price(1) entrySL4Long2 := true else entrySL4Long2 := false if entrySL4Long2 and close > strategy.opentrades.entry_price(1) strategy.exit('exit2', from_entry = 'long2', stop = strategy.opentrades.entry_price(1)) if strategy.opentrades >= 3 if dataToCalculate > strategy.opentrades.entry_price(2) entrySL4Long3 := true else entrySL4Long3 := false if entrySL4Long3 and close > strategy.opentrades.entry_price(2) strategy.exit('exit3', from_entry = 'long3', stop = strategy.opentrades.entry_price(2)) if strategy.closedtrades > strategy.closedtrades[1] if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit3' entrySL4Long3 := false if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit2' entrySL4Long2 := false if strategy.closedtrades.exit_id(strategy.closedtrades-1) == 'exit1' entrySL4Long1 := false /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Entry if dir3 < 0 if dir2 > 0 and dir1 < 0 strategy.entry('long1', strategy.long) else if dir2 < 0 strategy.entry('long2', strategy.long, stop=superTrend1) else if dir1 < 0 and highestGreen > 0 strategy.entry('long3', strategy.long, stop=highestGreen) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Exit isUseAllDowntrendExit = input.bool(true, group = "Exit Type") if isUseAllDowntrendExit and dir3 > 0 and dir2 > 0 and dir1 > 0 and close < open strategy.close_all() isUseAvgPriceInLoss = input.bool(true, group = "Exit Type") if isUseAvgPriceInLoss and strategy.position_avg_price > close //and strategy.position_avg_price <= close[1] // and (dir1 > 0 or dir2 > 0 or dir3 > 0) // and strategy.opentrades >= 1 // and strategy.opentrades >= 3 strategy.close_all() isUseAllPositionsInLoss = input.bool(false, group = "Exit Type") if isUseAllPositionsInLoss and ( false or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close)) or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close) and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close)) or (strategy.opentrades == 1 and ((not na(strategy.opentrades.entry_price(0))) and strategy.opentrades.entry_price(0) > close) and ((not na(strategy.opentrades.entry_price(1))) and strategy.opentrades.entry_price(1) > close) and ((not na(strategy.opentrades.entry_price(2))) and strategy.opentrades.entry_price(2) > close)) ) strategy.close_all() /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Plot plot(superTrend1, title='Fast Supertrend', color=dir1 == 1 and dir1[1] == 1 ? color.red : dir1 == -1 and dir1[1] == -1 ? color.green : na) plot(superTrend2, title='Medium Supertrend', color=dir2 == 1 and dir2[1] == 1 ? color.red : dir2 == -1 and dir2[1] == -1 ? color.green : na) plot(superTrend3, title='Slow Supertrend', color=dir3 == 1 and dir3[1] == 1 ? color.red : dir3 == -1 and dir3[1] == -1 ? color.green : na)