Многофакторная стратегия объединяет три различных типа стратегий: шоковой, трендовой и прорывной стратегии, которые используются в комбинации для достижения лучших результатов.
Многофакторная стратегия моделируется в основном на следующих аспектах:
Частично шокирующая стратегия использует случайные показатели для определения времени покупки и продажи. В частности, когда случайный показатель %K проходит через %D от зоны перепродажи, создается сигнал покупки; когда %K проходит через %D от зоны перепродажи, создается сигнал продажи.
Тренд-стратегия использует золотое кресло средней линии SMA для определения направления тренда. Когда быстрая линия сверху пересекает медленную линию, это создает сигнал покупки; когда быстрая линия сверху пересекает медленную линию, это создает сигнал продажи.
Стратегия прорыва частично отслеживает, не пробилась ли цена с наивысшей или наименьшей цены за указанный период. Покупают, когда цена превышает наивысшую цену; продают, когда цена ниже наименьшей цены.
Тренд-торговля проводится только тогда, когда тренд достаточно силен, в сочетании с индикатором ADX.
Создание линий остановки и остановки, установление разумного соотношения остановки и остановки.
В совокупности, многофакторные стратегии следуют следующей логике:
Когда ADX больше установленного порога, считается, что тенденция достаточно сильна, и тогда начинается исполнение трендовой стратегии; когда ADX меньше порога, считается, что находится в сборе, и тогда выполняется только шокирующая стратегия.
В трендовых ситуациях, когда SMA быстро медленно пересекается с золотом, покупают открытую позицию, а в случае мертвой форки - закрытую позицию.
В условиях шока, выполнение торгового сигнала на случайных индикаторах.
Прорывная стратегия применяется в обоих рыночных условиях для отслеживания каналов.
Настройка стоп-лосса и оптимальная прибыль.
Наибольшее преимущество многофакторной стратегии заключается в сочетании преимуществ различных типов стратегий, которые могут иметь лучшие стратегические эффекты в обеих рыночных средах. В частности, она имеет следующие преимущества:
В этом случае вы можете получить более высокую победную ставку в трендовых ситуациях.
По словам эксперта, в этом случае, как и в случае с другими компаниями, вполне вероятно, что они будут использовать свои инвестиции для получения прибыли в условиях кризиса, а не для удержания позиций.
С более высоким коэффициентом прибыли, установка стоп-стоп-лосса является разумной.
“Все, что мы делаем, - это принимаем во внимание силу тенденции, чтобы сократить убытки”.
В сочетании с несколькими показателями можно создать более сильный торговый сигнал.
Лучшие комбинации параметров могут быть получены с помощью оптимизации параметров.
Многофакторная стратегия также несет в себе определенные риски, в основном:
Неправильное сочетание множественных факторов может привести к путанице торговых сигналов, требуя многократного тестирования, чтобы найти оптимальное сочетание факторов.
Необходимо оптимизировать несколько параметров, оптимизация является сложной и требует достаточной поддержки исторических данных.
Невозможность своевременного прекращения позиций при обратном тренде может привести к большим потерям.
Индекс ADX отстает и, возможно, пропустит поворотный момент.
Прорывные сделки легко поддаются обману и требуют разумной стратегии стоп-лосса.
Для оптимизации этих рисков можно использовать следующие точки:
Тестирование стабильности различных факторов в исторических данных, выбор стабильных факторов.
Применение методов интеллектуальной оптимизации, таких как генетические алгоритмы, для поиска оптимальных параметров.
Устанавливайте разумную линию остановки для контроля максимального отвода.
В сочетании с дополнительными показателями, тенденция изменилась.
Оптимизируйте стратегию остановки убытков для прорывных сделок, чтобы избежать чрезмерных потерь.
Многофакторные стратегии имеют возможность для дальнейшей оптимизации:
Испытывайте больше типов факторов, чтобы найти лучшие комбинации. Другие факторы, такие как волатильность, количество сделок, могут быть учтены.
Поиск оптимальных стратегических весов с использованием методов машинного обучения.
Параметровая оптимизация может использоваться с помощью интеллектуальных алгоритмов для быстрого поиска оптимальных результатов.
Можно проверить доходность за разные периоды хранения позиций.
Можно рассматривать возможность динамической корректировки линий стоп-лосса.
Можно ввести дополнительные условия фильтрации, такие как резкое увеличение объема трафика, чтобы улучшить качество сигнала.
ADX-показатель может рассматривать параметры оптимизации или заменять более продвинутым индикатором определения тенденции.
Многофакторная стратегия учитывает множество торговых логик, таких как тенденции, потрясения, прорывы и т. Д. Она дает отличные результаты в обоих рыночных условиях. По сравнению с одной стратегией, многофакторная стратегия может получить более высокую стабильную прибыль и имеет хорошее пространство для масштабирования.
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
// Revision: 1
// Author: Jonas
// === INPUT ===
// > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)
// > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")
strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])
flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100
// > SMA <
fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)
// > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend
// > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)
// > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3
// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => // create function "within window of time"
time >= window_start and time <= window_finish ? true : false
//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)
// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus
ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)
//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
ts_sum = 0.0
for i = ts_fromIndex to ts_toIndex
ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
ts_sum
intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0
// > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0
// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)
// === STOCHASTICS ===
stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)
// === FILTER & CONDITIONS ===
// > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]
bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false
bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1
bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1
// > TREND <
bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]
bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2
bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2
bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1
bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3
bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1
plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line) // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line) // plot SlowMA
// > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25
bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5
bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5
bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1
bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1
//=== STRATEGIES ENTRIES & EXITS ===
// > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)
// > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
if (bolOS == true)
if (intTrend == 0)
if(strStrategy == "Long" or strStrategy == "Long & Short")
strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS) // buy long when "within window of time" AND crossover
if(strStrategy == "Short" or strStrategy == "Long & Short")
strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
strategy.close("Lng Osc", when=(bolLongCloseOS))
//strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
strategy.close("Short Osc", when=(bolShortCloseOS))
//strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
if (bolTS == true)
if (not(intTrend == 0))
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS) // buy long when "within window of time" AND crossover
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS)) // buy long when "within window of time" AND crossover
strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
strategy.close("Lng TD", when=bolLongCloseTS)
strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
strategy.close("Short TD", when=bolShortCloseTS)
if (bolBO == true)
if((strStrategy == "Long") or (strStrategy == "Long & Short"))
strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Lng BO", when=bolLongCloseBO)
//strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
if((strStrategy == "Short") or (strStrategy == "Long & Short"))
strategy.entry("Short BO", strategy.short, when=bolShortOpenBO) // buy long when "within window of time" AND crossover
strategy.close("Short BO", when=bolShortCloseBO)
//strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)