
Двойная пересекающаяся среднемесячная стратегия, использующая перемещающиеся средние с разными циклами, определяет направление ценового тренда и позволяет отслеживать тенденцию. При этом, когда короткие среднемесячные линии пересекают долгосрочные среднемесячные линии, они делают больше, а когда короткие среднемесячные линии пересекают долгосрочные среднемесячные линии, они делают больше.
Стратегия основана на показателях сдвигающейся средней (EMA) на 9 циклов, 21 цикл и 50 циклов. 9 циклов EMA представляет собой краткосрочную тенденцию, 21 цикл EMA представляет собой среднесрочную тенденцию, 50 циклов EMA представляет собой долгосрочную тенденцию.
Когда 9-циклическая ЭМА пересекает 21-циклическую ЭМА, то краткосрочный тренд переходит вверх, делая больше; когда 9-циклическая ЭМА пересекает 21-циклическую ЭМА, то краткосрочный тренд переходит вниз, делая меньше. Здесь используется перекрестная функция (crossover) для определения пересечения средней линии.
В коде установлена логика открытия, остановки и остановки позиций для длинных и пустых позиций. Условия открытия позиций являются равномерными или низкими. Многоголовное остановка - это входная цена × ((1 + входная стоп-процент), пустое остановка - это входная цена × ((1- входная стоп-процент).
Кроме того, в код добавлены некоторые условия фильтрации, такие как фильтрация тенденции, которая требует, чтобы K-линия не колебалась до того, как она прошла вниз по равной линии, и фильтрация использования средств, которая требует, чтобы стратегическая доля не была ниже N-дневных средних линий, чтобы избежать потерь. Эти условия фильтрации могут в некоторой степени предотвратить ложные сигналы.
В целом, стратегия использует двойные EMA-пересечения для определения направления ценового тренда, а также разумную логику стоп-стоп, чтобы захватить средне-длинную тенденцию. Однако, как однофакторная стратегия, ее сигнал может быть недостаточно стабильным, чтобы быть оптимизированным.
Что делать?
Эта стратегия может быть оптимизирована в следующих аспектах:
Оптимизируйте циклические параметры для подвижной средней и найдите оптимальную комбинацию циклов. Можно ввести адаптивные методы оптимизации, динамический оптимальный цикл.
Добавление других технических показателей фильтрации сигналов, таких как MACD, KD и т. Д., улучшение качества сигнала. Или введение машинного обучения для оценки сигналов, автоматической фильтрации ложных сигналов.
В сочетании с анализом объемов торгов. Не принимать сигналы, если они пересекают среднюю линию, но объем торгов недостаточен.
При появлении прорыва исследуются предшествующие колебания, такие как прорыв в зоне толчков, который может быть ложным прорывом.
Создание динамических механизмов остановки, таких как остановка с отслеживаемым типом, выход из Чанделиера, чтобы уменьшить расстояние остановки, но обеспечить эффективность остановки.
Оптимизация управления позициями, такие как фиксированные позиции, динамические позиции, ливерлированные позиции и т. Д., Чтобы получить более разумный процент прибыли и убытка.
Обеспечение максимальной прибыльности стратегии в реальной игре.
Общая структура стратегии разумна, принципы просты, направление тренда определяется с помощью перекрестных двойных ЭМА, и установлена логика остановки и убытка, которая может улавливать тренд. Но в качестве стратегии с одним фактором можно дополнительно оптимизировать параметры, фильтрацию сигналов и т. Д., Что делает стратегию более стабильной.
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 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/
// © TradingMentalist
//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")
//turn on/off / adjust trade filters (average range/average equity)
sidein2 = input(200, step=10, title='lookback for average range (bars)')
sidein = input(1, title='filter trades if range is less than (%)')/100
equityIn = input(40, title='filter trades if equity is below ema()')
sidewayssw = input(true, title='sideways filter?')
equitysw = input(true, title='equity filter?')
longtpin = input(1,step=0.1, title='long TP %')/100
longslin = input(0.4,step=0.1, title='long SL %')/100
shorttpin = input(1,step=0.1, title='short TP %')/100
shortslin = input(0.4,step=0.1, title='short SL %')/100
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1 = (close[1] + close[sidein2]) / 2
side2 = close[1] - close[sidein2]
side3 = side2 / side1
notsideways = side3 > sidein
equityMa = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon = strategy.equity >= equityMa
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)
plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1 = crossover(ma2,ma3)
longCondition2 = close[5] > close[10]
longCondition3 = close[1] > close[2]
shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]
closelong = shortCondition1
closeshort = longCondition1
//-------------------------------------------
//(leave as is)
longCondition1in = longCondition1
longCondition2in = lConSw2 ? longCondition2 : true
longCondition3in = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions = longCondition1in and longCondition2in and longCondition3in
shortConditions = shortCondition1in and shortCondition2in and shortCondition3in
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel = strategy.position_avg_price * (1 + longtpin)
longsllevel = strategy.position_avg_price * (1 - longslin)
shorttplevel = strategy.position_avg_price * (1 - shorttpin)
shortsllevel = strategy.position_avg_price * (1 + shortslin)
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear = 2000
startmonth = 1
startday = 1
stopyear = 9999
stopmonth = 12
stopday = 31
//-------------------------------------------
//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe() =>
time >= startperiod and time <= periodstop ? true : false
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
if longinc
if strategy.position_size == 0 or strategy.position_size > 0
strategy.entry(id="long", long=true, when=long, comment=" ")
strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
strategy.close(id="long", when=closelong, comment = " ")
if shotinc
if strategy.position_size == 0 or strategy.position_size < 0
strategy.entry(id="short", long=false, when=short, comment = " ")
strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
strategy.close(id="short", when=closeshort, comment = " ")