Стратегия торговли фьючерсами на двойной скользящий средний кроссовер

Автор:Чао Чжан, Дата: 2023-11-15 16:48:02
Тэги:

img

Обзор

Эта стратегия использует принцип двойного пересечения скользящей средней, включает в себя индикатор ATR для остановки потерь и получения прибыли и добавляет контроль часов торговли для разработки внутридневной торговой стратегии, подходящей для фьючерсных контрактов.

Логика стратегии

Стратегия использует пересечение 5-периодных и 20-периодных линий WMA в качестве входных сигналов. Она длинна, когда 5-периодная линия превышает 20-периодную линию, и коротка, когда 5-периодная линия превышает 20-периодную линию. Она также использует 50-периодную линию WMA для определения направления тренда. Торговые сигналы запускаются только тогда, когда направление прорыва цены соответствует основной тенденции.

Кроме того, стратегия использует индикатор ATR для установки динамических уровней стоп-лосса и получения прибыли. ATR отражает волатильность рынка. Стратегия использует значение ATR, умноженное на фактор (например, 3) для определения стоп-лосса и получения прибыли, контролируя таким образом потери по торговле.

Наконец, стратегия запускает сделки только в торговые часы США (9:00-14:30 CST), чтобы избежать высокой волатильности вокруг открытия и закрытия рынка, где легко образуются ложные сигналы.

Анализ преимуществ

Стратегия имеет следующие преимущества:

  1. Двойной скользящий средний перекресток эффективно фиксирует поворотные моменты тренда для своевременного входа.

  2. Фильтр тренда избегает торговли против основного тренда и уменьшает ложные сигналы.

  3. Динамические средства контроля стоп-лосса на основе ATR для каждой сделки.

  4. Ограничение рабочего времени позволяет избежать волатильных периодов открытия и закрытия.

  5. Простые и понятные правила, которые легко понять и применить для начинающих.

  6. Настраиваемые параметры, такие как периоды MA, мультипликатор ATR, часы торговли и т. д. для оптимизации.

Анализ рисков

Стратегия также имеет следующие риски:

  1. Больше стоп-лосса на рынках с ограниченным диапазоном.

  2. У перекрестка с двойным MA есть задержка и может пропустить краткосрочные прорывы.

  3. Неправильное установление параметров ATR приводит к большой или маленькой потере остановки.

  4. Опираться только на технические показатели без фундаментального анализа.

  5. Эффективность зависит от правильного символа и сроков.

  6. Механическая система подвергается риску арбитража.

  7. Параметры необходимо корректировать для различных торговых сессий.

Их можно улучшить с помощью настройки параметров, комбинаций индикаторов, выборочного ручного вмешательства и т.д.

Руководство по оптимизации

Стратегия может быть улучшена в следующих аспектах:

  1. Испытать различные системы MA, такие как EMA, DMA и т.д.

  2. Добавьте другие технические фильтры, такие как MACD, RSI и т. д.

  3. Оптимизировать параметры ATR для улучшения стоп-лосса/прибыли.

  4. Включите индикаторы объема для поиска высококачественных сигналов входа.

  5. Настройка параметров на основе специфики символа.

  6. Интегрировать фундаментальные факторы, чтобы избежать торговли против рынка.

  7. Внедрить машинное обучение как нейронные сети для моделирования рынка.

  8. Исследуйте комбинации из нескольких временных рамок для получения большего количества возможностей.

  9. Создать стратегический ансамбль для повышения устойчивости.

Заключение

В целом, это простая и интуитивная стратегия, подходящая для начинающих практиковать прямую торговлю. В то же время, остается огромное пространство для оптимизации с помощью более технических индикаторов или машинного обучения. Ключевым является также настройка параметров на основе символов и динамики рынка. Стратегия предоставляет справочную базу для начинающих квантовой торговли, но требует неустанного тестирования и улучшения для стабильной прибыли.


/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 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/
// © james4392010

//@version=4

strategy(title="DayTradingFutures Cross-Strategy", overlay=true)




// === GENERAL INPUTS ===
Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
//highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn



wmaFastSource   = input(defval = close, title = "Fast WMA Source")
wmaFastLength   = input(defval = 5, title = "Fast WMA Period")
wmaSlowSource   = input(defval = close, title = "Slow WMA Source")
wmaSlowLength   = input(defval = 20, title = "Slow WMA Period")
wmaDirectionSource  = input(defval = close, title = "Trend 50 Period Source")
wmaDirectionLength  = input(defval = 50, title = "Trend 50 Period")
timeinrange(res, sess) => time(res, sess) != 0



// === SERIES SETUP ===
/// a couple of ma's..
wmaFast = wma(close, 5)
wmaSlow = wma(close, 20)
wmaDirection = wma(close, 50)





// === PLOTTING ===
fast = plot(series=wmaFast, color=color.white, linewidth=2)
slow = plot(series=wmaSlow, color=color.yellow, linewidth=2)
direction = plot(series=wmaDirection, color=color.red, linewidth=2)


// === INPUT BACKTEST RANGE ===

//fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
//fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
//fromYear = input(defval = 2022, title = "From Year", minval = 2022)
 
// To Date Inputs
//toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
//toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
//toYear = input(defval = 2022, title = "To Year", minval = 2022)
//startDate = timestamp(fromYear, fromMonth, fromDay)
//finishDate = timestamp(toYear, toMonth, toDay)
//inDateRange= (time >= fromDay, fromMonth, fromYear and time <= toDay, toMonth, toYear) 



// === FUNCTION EXAMPLE ===
//inDateRange = (time >= fromDay, fromMonth, fromYear) and (time <= toDay, toMonth, toYear)


// === LOGIC ===

enterLong = crossover(wmaFast, wmaSlow) and close > wmaDirection and timeinrange(timeframe.period, "0900-1430")
enterShort = crossunder(wmaFast, wmaSlow) and close < wmaDirection and timeinrange(timeframe.period, "0900-1430")

//trend := nz(trend[1], trend)
//trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
//upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)

buySignal = enterLong 
//plotshape(enterLong ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green)
plotshape(enterLong and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white)
//dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)

sellSignal = enterShort
//plotshape(enterShort ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red)
plotshape(enterShort and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white)
//mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
//longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
//shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
//fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
//fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="Buy", message="Buy!")
alertcondition(sellSignal, title="Sell", message="Sell!")
//changeCond = trend != trend[1]
//alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")



// Entry for strategy //

//tp=input(25,title="TakeProfit")
//sl=input(40,title="StopLoss")

strategy.entry("Long",1, when=buySignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)

strategy.entry("Short",1, when=sellSignal)
//strategy.exit("Exit",profit=tp,loss=sl)
//strategy.exit("TakeProfit",profit=tp)
//strategy.exit("StopLoss",loss=sl)
//strategy.exit("Exit", wmaFastwmaSlow)

//Buy and Sell Signals

//strategy.close_all(when =not timeinrange(timeframe.period, "1000-1430"))   


// === FILL ====

fill (fast, slow, color = wmaSlow > wmaDirection ? color.green : color.red)
//fill(when=enterLong, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterLong, sl, color = color.new(color.red, 90), title = "Loss area")
//fill(when=enterShort, tp, color = color.new(color.green, 90), title = "Profit area")
//fill(when=enterShort, sl, color = color.new(color.red, 90), title = "Loss area")






Больше