Это относительно сложная стратегия прорыва импульса, которая включает в себя множество технических индикаторов для суждения и реализует многоступенчатые пирамидальные ордера в разных направлениях и фазах для достижения цели масштабирования и выхода.
Стратегия в основном сочетает в себе индикатор импульса MACD, индикатор перекупленности и перепродажи RSI и полосы Боллинджера для направленного суждения. Когда линия MACD выше 0, а RSI ниже линии перепродажи, это длинный сигнал. Когда линия MACD ниже 0, а RSI выше линии перекупленности, это короткий сигнал.
В конкретной реализации стратегия сначала оценивает производительность линии MACD и RSI, чтобы подтвердить фундаментальные показатели. Затем, в соответствии с прорывом верхней и нижней рельсов Болинджеровских полос, он принимает пирамидальные ордера в разных размерах.
Между тем, стратегия также отслеживает самую высокую и самую низкую цену для установки стоп-лосса и получения прибыли, соответствующим образом управляя ордерами.
Объединение нескольких индикаторов позволяет избежать ошибочных оценок одного инструмента.
Масштабирование с несколькими этапами может увеличить прибыль.
Установка стоп-лосса и прибыли помогает избежать потерь от высоких пиков.
Контролируемое сокращение, не будет больших потерь.
Прорыв верхней и нижней рельсы не является на 100% надежным, может показать некоторые ложные сигналы.
Поэтапная пирамида требует точного понимания рыночного темпа, быстрые изменения могут привести к огромным потерям.
Необходимо следить за ликвидностью торговых инструментов, низкая ликвидность не подходит для крупных партий пирамиды.
Backtest ≠ live, расходы, такие как спред и комиссия, должны быть учтены в режиме реального времени.
Можно проверить различные комбинации параметров, такие как период Боллинджера, мультипликатор СТД, параметры RSI, чтобы найти оптимальный.
Может исследовать другие методы масштабирования, такие как фиксированная дроби, критерий Келли и т.д.
Может реализовать динамическую оптимизацию параметров с помощью машинного обучения и т.д.
Может включать больше источников данных, таких как анализ настроений, социальные данные, чтобы помочь в суждении.
Может исследовать фьючерсный календарь для арбитража, расширять пространство прибыли.
Эта стратегия комплексно использует несколько технических индикаторов, принимает поэтапную пирамиду, управляет рисками с остановкой потери и получением прибыли, что делает ее относительно полным трендом после стратегии. Но риски, такие как ложные сигналы и быстрые обратные действия, должны быть предупреждены, правильное регулирование параметров и размещения позиций может привести к более устойчивым избыточным доходам. Дальнейшая оптимизация с помощью машинного обучения и т. д. может улучшить эффективность стратегии.
/*backtest start: 2022-10-11 00:00:00 end: 2023-10-17 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy(title="Incremental Order size +", shorttitle="Strategy", overlay=true, default_qty_value=1, pyramiding=10) //Heiken Ashi isHA = input(false, "HA Candles", bool) //MACD fastLength = 12 slowlength = 26 MACDLength = 9 MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD //Bollinger Bands Exponential src = open len = 18 e = ema(src,len) evar = (src - e)*(src - e) evar2 = (sum(evar,len))/len std = sqrt(evar2) Multiplier = input(3, minval = 0.01, title = "# of STDEV's") upband = e + (Multiplier * std) dnband = e - (Multiplier * std) //EMA ema3 = ema(close, 3) //RSIplot length = 45 overSold = 90 overBought = 10 price = close vrsi = rsi(price, length) notna = not na(vrsi) macdlong = crossover(delta, 0) macdshort = crossunder(delta, 0) rsilong = notna and crossover(vrsi, overSold) rsishort = notna and crossunder(vrsi, overBought) lentt = input(14, "Pivot Length") //The length defines how many periods a high or low must hold to be a "relevant pivot" h = highest(lentt) //The highest high over the length h1 = dev(h, lentt) ? na : h //h1 is a pivot of h if it holds for the full length hpivot = fixnan(h1) //creates a series which is equal to the last pivot l = lowest(lentt) l1 = dev(l, lentt) ? na : l lpivot = fixnan(l1) //repeated for lows last_hpivot = h1 ? time : nz(last_hpivot[1]) last_lpivot = l1 ? time : nz(last_lpivot[1]) long_time = last_hpivot > last_lpivot ? 0:1 //FIBS z = input(100, "Z-Index") p_offset= 2 transp = 60 a=(lowest(z)+highest(z))/2 b=lowest(z) c=highest(z) fibonacci = input(0, "Fibonacci") / 100 //Fib Calls fib0 = (((hpivot - lpivot)* fibonacci) + lpivot) fib1 = (((hpivot - lpivot)*.21) + lpivot) fib2 = (((hpivot - lpivot)*.3) + lpivot) fib3 = (((hpivot - lpivot)*.5) + lpivot) fib4 = (((hpivot - lpivot)*.62) + lpivot) fib5 = (((hpivot - lpivot)*.7) + lpivot) fib6 = (((hpivot - lpivot)* 1.00) + lpivot) fib7 = (((hpivot - lpivot)* 1.27) + lpivot) fib8 = (((hpivot - lpivot)* 2) + lpivot) fib9 = (((hpivot - lpivot)* -.27) + lpivot) fib10 = (((hpivot - lpivot)* -1) + lpivot) //Heiken Ashi Candles data2 = isHA ? heikenashi(syminfo.tickerid) : syminfo.tickerid res5 = input("5", "Resolution") //HT Fibs hfib0 = security(data2, res5, fib0[1]) hfib1 = security(data2, res5, fib1[1]) hfib2 = security(data2, res5, fib2[1]) hfib3 = security(data2, res5, fib3[1]) hfib4 = security(data2, res5, fib4[1]) hfib5 = security(data2, res5, fib5[1]) hfib6 = security(data2, res5, fib6[1]) hfib7 = security(data2, res5, fib7[1]) hfib8 = security(data2, res5, fib8[1]) hfib9 = security(data2, res5, fib9[1]) hfib10 = security(data2, res5, fib10[1]) vrsiup = vrsi > vrsi[1] and vrsi[1] > vrsi[2] vrsidown = vrsi < vrsi[1] and vrsi[1] < vrsi[2] long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long2 = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short2 = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown // long = cross(close, fib0) and delta > 0 and vrsi < overSold and vrsiup // short = cross(close, fib6) and delta < 0 and vrsi > overBought and vrsidown reverseOpens = input(false, "Reverse Orders", bool) if (reverseOpens) tmplong = long long := short short := tmplong //Strategy ts = input(99999, "TS") tp = input(30, "TP") sl = input(10, "SL") last_long = long ? time : nz(last_long[1]) last_short = short ? time : nz(last_short[1]) in_long = last_long > last_short in_short = last_short > last_long long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long = long ? open : nz(last_open_long[1]) last_open_short = short ? open : nz(last_open_short[1]) last_open_long_signal = long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal = short_signal ? open : nz(last_open_short_signal[1]) last_high = not in_long ? na : in_long and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low = not in_short ? na : in_short and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) long_ts = not na(last_high) and high <= (last_high - ts) and high >= last_open_long_signal short_ts = not na(last_low) and low >= (last_low + ts) and low <= last_open_short_signal long_tp = high >= (last_open_long + tp) and long[1] == 0 short_tp = low <= (last_open_short - tp) and short[1] == 0 long_sl = low <= (last_open_long - sl) and long[1] == 0 short_sl = high >= (last_open_short + sl) and short[1] == 0 last_hfib_long = long_signal ? fib1 : nz(last_hfib_long[1]) last_hfib_short = short_signal ? fib5 : nz(last_hfib_short[1]) last_fib7 = long ? fib7 : nz(last_fib7[1]) last_fib10 = long ? fib10 : nz(last_fib10[1]) last_fib8 = short ? fib8 : nz(last_fib8[1]) last_fib9 = short ? fib9 : nz(last_fib9[1]) last_long_signal = long_signal ? time : nz(last_long_signal[1]) last_short_signal = short_signal ? time : nz(last_short_signal[1]) last_long_tp = long_tp ? time : nz(last_long_tp[1]) last_short_tp = short_tp ? time : nz(last_short_tp[1]) last_long_ts = long_ts ? time : nz(last_long_ts[1]) last_short_ts = short_ts ? time : nz(last_short_ts[1]) long_ts_signal = crossover(last_long_ts, last_long_signal) short_ts_signal = crossover(last_short_ts, last_short_signal) last_long_sl = long_sl ? time : nz(last_long_sl[1]) last_short_sl = short_sl ? time : nz(last_short_sl[1]) long_tp_signal = crossover(last_long_tp, last_long) short_tp_signal = crossover(last_short_tp, last_short) long_sl_signal = crossover(last_long_sl, last_long) short_sl_signal = crossover(last_short_sl, last_short) last_long_tp_signal = long_tp_signal ? time : nz(last_long_tp_signal[1]) last_short_tp_signal = short_tp_signal ? time : nz(last_short_tp_signal[1]) last_long_sl_signal = long_sl_signal ? time : nz(last_long_sl_signal[1]) last_short_sl_signal = short_sl_signal ? time : nz(last_short_sl_signal[1]) last_long_ts_signal = long_ts_signal ? time : nz(last_long_ts_signal[1]) last_short_ts_signal = short_ts_signal ? time : nz(last_short_ts_signal[1]) true_long_signal = long_signal and last_long_sl_signal > last_long_signal[1] or long_signal and last_long_tp_signal > last_long_signal[1] or long_signal and last_long_ts_signal > last_long_signal[1] true_short_signal = short_signal and last_short_sl_signal > last_short_signal[1] or short_signal and last_short_tp_signal > last_short_signal[1] or short_signal and last_short_ts_signal > last_short_signal[1] // strategy.entry("BLUE", strategy.long, when=long) // strategy.entry("RED", strategy.short, when=short) g = delta > 0 and vrsi < overSold and vrsiup r = delta < 0 and vrsi > overBought and vrsidown long1 = cross(close, fib1) and g and last_long_signal[1] > last_short_signal// and last_long_signal > long short1 = cross(close, fib5) and r and last_short_signal[1] > last_long_signal// and last_short_signal > short last_long1 = long1 ? time : nz(last_long1[1]) last_short1 = short1 ? time : nz(last_short1[1]) last_open_long1 = long1 ? open : nz(last_open_long1[1]) last_open_short1 = short1 ? open : nz(last_open_short1[1]) long1_signal = crossover(last_long1, last_long_signal) short1_signal = crossover(last_short1, last_short_signal) last_long1_signal = long1_signal ? time : nz(last_long1_signal[1]) last_short1_signal = short1_signal ? time : nz(last_short1_signal[1]) long2 = cross(close, fib2) and g and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short2 = cross(close, fib4) and r and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long2 = long2 ? time : nz(last_long2[1]) last_short2 = short2 ? time : nz(last_short2[1]) last_open_short2 = short2 ? open : nz(last_open_short2[1]) long2_signal = crossover(last_long2, last_long1_signal) and long1_signal==0 short2_signal = crossover(last_short2, last_short1_signal) and short1_signal==0 last_long2_signal = long2_signal ? time : nz(last_long2_signal[1]) last_short2_signal = short2_signal ? time : nz(last_short2_signal[1]) //Trade 4 long3 = cross(close, fib3) and g and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short3 = cross(close, fib3) and r and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long3 = long3 ? time : nz(last_long3[1]) last_short3 = short3 ? time : nz(last_short3[1]) last_open_short3 = short3 ? open : nz(last_open_short3[1]) long3_signal = crossover(last_long3, last_long2_signal) and long2_signal==0 short3_signal = crossover(last_short3, last_short2_signal) and short2_signal==0 last_long3_signal = long3_signal ? time : nz(last_long3_signal[1]) last_short3_signal = short3_signal ? time : nz(last_short3_signal[1]) //Trade 5 long4 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short4 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long4 = long4 ? time : nz(last_long4[1]) last_short4 = short4 ? time : nz(last_short4[1]) long4_signal = crossover(last_long4, last_long3_signal) and long2_signal==0 and long3_signal==0 short4_signal = crossover(last_short4, last_short3_signal) and short2_signal==0 and short3_signal==0 last_long4_signal = long4_signal ? time : nz(last_long4_signal[1]) last_short4_signal = short4_signal ? time : nz(last_short4_signal[1]) //Trade 6 long5 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short5 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long5 = long5 ? time : nz(last_long5[1]) last_short5 = short5 ? time : nz(last_short5[1]) long5_signal = crossover(last_long5, last_long4_signal) and long3_signal==0 and long4_signal==0 short5_signal = crossover(last_short5, last_short4_signal) and short3_signal==0 and short4_signal==0 last_long5_signal = long5_signal ? time : nz(last_long5_signal[1]) last_short5_signal = short5_signal ? time : nz(last_short5_signal[1]) //Trade 7 long6 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short6 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long6 = long6 ? time : nz(last_long6[1]) last_short6 = short6 ? time : nz(last_short6[1]) long6_signal = crossover(last_long6, last_long5_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 short6_signal = crossover(last_short6, last_short5_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 last_long6_signal = long6_signal ? time : nz(last_long6_signal[1]) last_short6_signal = short6_signal ? time : nz(last_short6_signal[1]) //Trade 8 long7 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short7 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long7 = long7 ? time : nz(last_long7[1]) last_short7 = short7 ? time : nz(last_short7[1]) long7_signal = crossover(last_long7, last_long6_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 short7_signal = crossover(last_short7, last_short6_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 last_long7_signal = long7_signal ? time : nz(last_long7_signal[1]) last_short7_signal = short7_signal ? time : nz(last_short7_signal[1]) //Trade 9 long8 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short8 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long8 = long8 ? time : nz(last_long8[1]) last_short8 = short8 ? time : nz(last_short8[1]) long8_signal = crossover(last_long8, last_long7_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 and long7_signal==0 short8_signal = crossover(last_short8, last_short7_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 and short7_signal==0 last_long8_signal = long8_signal ? time : nz(last_long8_signal[1]) last_short8_signal = short8_signal ? time : nz(last_short8_signal[1]) //Trade 10 long9 = long and last_long1_signal > last_long_signal[1] and long1_signal == 0 and last_long_signal[1] > last_short_signal short9 = short and last_short1_signal > last_short_signal[1] and short1_signal == 0 and last_short_signal[1] > last_long_signal last_long9 = long9 ? time : nz(last_long9[1]) last_short9 = short9 ? time : nz(last_short9[1]) long9_signal = crossover(last_long9, last_long8_signal) and long2_signal==0 and long4_signal==0 and long5_signal==0 and long6_signal==0 and long7_signal==0 and long8_signal==0 short9_signal = crossover(last_short9, last_short8_signal) and short2_signal==0 and short4_signal==0 and short5_signal==0 and short6_signal==0 and short7_signal==0 and short8_signal==0 last_long9_signal = long9_signal ? time : nz(last_long9_signal[1]) last_short9_signal = short9_signal ? time : nz(last_short9_signal[1]) strategy.entry("Long", strategy.long, qty=1, when=long_signal) strategy.entry("Short", strategy.short, qty=1, when=short_signal) strategy.entry("Long", strategy.long, qty=2, when=long1_signal) strategy.entry("Short1", strategy.short, qty=2, when=short1_signal) strategy.entry("Long", strategy.long, qty=4, when=long2_signal) strategy.entry("Short2", strategy.short, qty=4, when=short2_signal) strategy.entry("Long", strategy.long, qty=8, when=long3_signal) strategy.entry("Short3", strategy.short, qty=8, when=short3_signal) strategy.entry("Long", strategy.long, qty=5, when=long4_signal) strategy.entry("Short", strategy.short, qty=5, when=short4_signal) strategy.entry("Long", strategy.long, qty=6, when=long5_signal) strategy.entry("Short", strategy.short, qty=6, when=short5_signal) strategy.entry("Long", strategy.long, qty=7, when=long6_signal) strategy.entry("Short", strategy.short, qty=7, when=short6_signal) strategy.entry("Long", strategy.long, qty=8, when=long7_signal) strategy.entry("Short", strategy.short, qty=8, when=short7_signal) strategy.entry("Long", strategy.long, qty=9, when=long8_signal) strategy.entry("Short", strategy.short, qty=9, when=short8_signal) strategy.entry("Long", strategy.long, qty=10, when=long9_signal) strategy.entry("Short", strategy.short, qty=10, when=short9_signal) short1_tp = low <= (last_open_short1 - tp) and short1[1] == 0 short2_tp = low <= (last_open_short2 - tp) and short2[1] == 0 short3_tp = low <= (last_open_short3 - tp) and short3[1] == 0 short1_sl = high >= (last_open_short1 + sl) and short1[1] == 0 short2_sl = high >= (last_open_short2 + sl) and short2[1] == 0 short3_sl = high >= (last_open_short3 + sl) and short3[1] == 0 close_long = cross(close, fib6) close_short = cross(close, fib0) // strategy.close("Long", when=close_long) // strategy.close("Long", when=long_tp) // strategy.close("Long", when=long_sl) // strategy.close("Short", when=long_signal) // strategy.close("Short1", when=long_signal) // strategy.close("Short2", when=long_signal) // strategy.close("Short3", when=long_signal) strategy.close("Short", when=short_tp) strategy.close("Short1", when=short1_tp) strategy.close("Short2", when=short2_tp) strategy.close("Short3", when=short3_tp) strategy.close("Short", when=short_sl) strategy.close("Short1", when=short1_sl) strategy.close("Short2", when=short2_sl) strategy.close("Short3", when=short3_sl)