Количественная торговая стратегия с использованием экспоненциального скользящего среднего пересечения


Дата создания: 2024-03-29 10:59:57 Последнее изменение: 2024-03-29 10:59:57
Копировать: 1 Количество просмотров: 517
1
Подписаться
1617
Подписчики

Количественная торговая стратегия с использованием экспоненциального скользящего среднего пересечения

Обзор

Стратегия использует как сигнал для покупки и продажи пересечение двух индексов с движущимися средними ((EMA)). При пересечении более длинных EMA с более коротких периодов она создает сигнал для покупки; наоборот, при пересечении более длинных EMA с более коротких периодов она создает сигнал для продажи. В то же время, стратегия также определяет, является ли пересечение наивысшей или наименьшей ценой за последние 10 торговых циклов, чтобы определить силу тренда. Если пересечение является наивысшим, цена отображается на фоне зеленым цветом, а если оно является наименьшим, то - красным цветом.

Стратегический принцип

  1. Вычислить EMA для двух различных циклов, по умолчанию 5 и 10 ◦.
  2. Если краткосрочная ЭМА сверху проходит длинную ЭМА, то появляется сигнал покупки; если краткосрочная ЭМА сверху проходит длинную ЭМА, то появляется сигнал продажи.
  3. При появлении перекрестного сигнала следует определить, является ли текущая точка перекрестка наивысшей или наименьшей ценой за последние 10 торговых циклов. Если это наивысшая цена, считается, что она имеет сильную тенденцию к росту; если это наименьшая цена, считается, что она имеет сильную тенденцию к снижению.
  4. Если появляется сигнал покупать и в настоящее время нет позиций, открывается дополнительный ордер; если появляется сигнал продавать и в настоящее время нет позиций, открывается пустой ордер.
  5. Если у вас уже есть несколько позиций, и краткосрочная ЭМА сверху вниз проходит через долгосрочную ЭМА, вы можете купить несколько позиций; если у вас уже есть пустые позиции, и краткосрочная ЭМА сверху вверх проходит через долгосрочную ЭМА, вы можете купить пустые позиции.

Стратегические преимущества

  1. Показательная скользящая средняя способна быстрее реагировать на изменения цены, чем простая скользящая средняя, что позволяет создавать более своевременные торговые сигналы.
  2. Судя по тому, является ли пересечение недавним максимумом или минимумом, можно отсеять торговые возможности с более высокой интенсивностью тренда и повысить стратегическую прибыль.
  3. На графике указаны цены в точках пересечения, что дает трейдерам более интуитивно понятные торговые ссылки.
  4. Логика кода ясна, легко понятна и реализуема.

Стратегический риск

  1. Сигналы, генерируемые скрещиванием EMA, могут быть задержаны, что приводит к пропуску оптимального времени торговли.
  2. В условиях нестабильных рынков пересечение EMA может происходить часто, что приводит к чрезмерному количеству сделок и увеличению их стоимости.
  3. При отсутствии стоп-лосс в стратегии может возникнуть большая вероятность отмены, если ошибки будут допущены.

Направление оптимизации стратегии

  1. Введение новых технических показателей, таких как RSI, MACD и т. д., которые помогут определить силу и направление тренда, повышая точность сигналов.
  2. Установка разумных стоп-лосс и стоп-пойнтов для контроля риска в одноразовой сделке.
  3. Оптимизация торговых параметров, таких как циклы EMA, окна перекрестного подтверждения времени и т. д., для повышения адаптивности стратегии.
  4. Фильтрация торговых сигналов в сочетании с индикаторами рыночных настроений, такими как VIX, уменьшает ошибочные сигналы.
  5. Рассматривается возможность добавления модулей управления позициями и управления капиталом, динамического регулирования объема капитала в каждой сделке, повышения эффективности использования капитала.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-29 23:59:59
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/
// © ZenAndTheArtOfTrading
// @version=5
strategy("ema giao nhau", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Get user input
emaLength1 = input.int(title="EMA #1 Length", defval=5)
emaLength2 = input.int(title="EMA #2 Length", defval=10)

// Get MAs
ema1 = ta.ema(close, emaLength1)
ema2 = ta.ema(close, emaLength2)

// Draw MAs
plot(ema1, color=color.blue, title="EMA 1")
plot(ema2, color=color.red, title="EMA 2")

// Detect crossovers
bool crossOver = ta.crossover(ema1, ema2)
bool crossUnder = ta.crossunder(ema1, ema2)
bool cross = crossOver or crossUnder
//float crossPrice = ta.valuewhen(cross, close, 0)
float crossPrice = cross ? close : na

// Check if the crossover price is the highest price over the past 10 bars
bool highestPrice = crossOver
for i = 1 to 10
    if crossPrice <= close[i]
        highestPrice := false
        break

// Check if the crossover price is the lowest price over the past 10 bars
bool lowestPrice = crossUnder
for i = 1 to 10
    if crossPrice >= close[i]
        lowestPrice := false
        break

// Flag the bar if it is a high/low close
bgcolor(highestPrice ? color.new(color.green, 50) : na)
bgcolor(lowestPrice ? color.new(color.red, 50) : na)

// Display crossover price
if cross
    highestEmaPrice = ema1 > ema2 ? ema1 : ema2
    label myLabel = label.new(bar_index, highestEmaPrice, "CrossPrice=" + str.tostring(crossPrice), color=color.white)
    if highestPrice and strategy.position_size == 0
        strategy.entry(id="Buy", direction=strategy.long)
    if lowestPrice and strategy.position_size == 0
        strategy.entry(id="Sell", direction=strategy.short)

// Exit trades when short-term EMA is breached
if strategy.position_size > 0 and crossUnder
    strategy.close("Buy")
if strategy.position_size < 0 and crossOver
    strategy.close("Sell")