Торговая стратегия на основе EMA


Дата создания: 2023-11-24 15:46:48 Последнее изменение: 2023-11-24 15:46:48
Копировать: 0 Количество просмотров: 1288
1
Подписаться
1617
Подписчики

Торговая стратегия на основе EMA

Обзор

Эта стратегия использует средние линии EMA с четырьмя различными циклами, которые формируют торговый сигнал в соответствии с их последовательностью, похожей на светофоры с красными, желтыми и зелеными трехцветными индикаторами, поэтому она получила название “Стратегия торговли светофорами”. Она анализирует рынок с точки зрения тенденций и обратных движений, чтобы повысить точность торговых решений.

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

  1. В качестве фильтра используйте 3 средних линии EMA (быстрая линия 8 циклов, средняя линия 14 циклов, медленная линия 16 циклов) и одну среднюю линию EMA (длинная линия 100 циклов).

  2. Оценить последовательность расположения средне-быстрых и средне-медленных линий и их пересечения с фильтрами, определить время лишнего и свободного времени:

  • При прохождении средней или средней линии через медленную линию на скоростной линии, рассматривается как многосигнал

  • Сигналы, пересекающие скоростную линию, оцениваются как равномерные.

  • При прохождении средней или медленной линии под средней линией, рассматривается как пустота

  • Сигналы о прохождении скоростной линии на центральной линии расцениваются как пустые.

  1. Определение направления и силы тренда с помощью последовательности быстрого и медленного 3 средних линий, в сочетании со средней линией и перекрестным определением точек обратного отсчета фильтров, обеспечивает органическое сочетание отслеживания тренда и обратного захвата.

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

Эта стратегия объединяет преимущества отслеживания тенденций и обратного трейдинга, что позволяет лучше использовать рыночные возможности. Основные преимущества:

  1. Использование множественных средних линий EMA, более высокий уровень рассудительности, снижение ложных сигналов
  2. Гибкость в настройках, чтобы избежать упущенных возможностей
  3. Треугольник с использованием средних длинных и коротких циклов, всестороннее суждение
  4. Настраиваемые условия остановки тормозной остановки, контроль риска

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

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

Основные риски этой стратегии заключаются в следующем:

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

Рекомендуется дальнейшее повышение стабильности стратегии, контроль риска путем оптимизации параметров, установки уровня стоп-лосса, осторожного действия и т. д.

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

Основные направления оптимизации стратегии:

  1. Периодические параметры средней линии EMA изменены для большего количества сортов
  2. Добавление фильтров для других показателей, таких как MACD, Брин-Бенд и т. д., для повышения точности суждения
  3. Оптимизация Stop Loss Ratio для достижения оптимального баланса между рисками и доходами
  4. Добавление адаптивных механизмов остановки убытков, таких как остановка ATR, для дальнейшего контроля нисходящего риска

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

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

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

Исходный код стратегии
/*backtest
start: 2023-01-01 00:00:00
end: 2023-11-23 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/
// © maxits

// 4HS Crypto Market Strategy
// This strategy uses 4 ema to get Long or Short Signals
// Length are: 8, 14, 16, 100
// We take long positions when the order of the emas is the following:
// green > yellow > red (As the color of Traffic Lights) and they are above white ema (Used as a filter for long positions)
  
// We take short positions when the order of the emas is the following:
// green < yellow < red (As the color of inverse Traffic Lights) and they are below white ema (Used as a filter for short positions)

//@version=4
strategy(title="Trafic Lights Strategy",
         shorttitle="TLS",
         overlay=true,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0
         )

// User Inputs
// i_time         = input(defval = timestamp("28 May 2017 13:30 +0000"), title = "Start Time", type = input.time) //Starting time for Backtesting

sep1           = input(title="============ System Conditions ============", type=input.bool, defval=false)

enable_Long    = input(true, title="Enable Long Positions")   // Enable long  Positions
enable_Short   = input(true, title="Enable Short Positions") // Enable short Positions

sep2           = input(title="============ Indicator Parameters ============", type=input.bool, defval=false)

f_length       = input(title="Fast EMA Length",   type=input.integer, defval=8,   minval=1) 
m_length       = input(title="Medium EMA Length", type=input.integer, defval=14,   minval=1) 
s_length       = input(title="Slow EMA Length",   type=input.integer, defval=16,  minval=1) 
filter_L       = input(title="EMA Filter",        type=input.integer, defval=100, minval=1) 
filterRes      = input(title="Filter Resolution", type=input.resolution, defval="D")        // ema Filter Time Frame

sep3           = input(title="============LONG Profit-Loss Parameters============", type=input.bool, defval=false)

e_Long_TP      = input(true, title="Enable a Profit Level?")
e_Long_SL      = input(false, title="Enable a S.Loss Level?")
e_Long_TS      = input(true, title="Enable a Trailing Stop?")           
long_TP_Input  = input(40.0,   title='Take Profit %',   type=input.float,   minval=0)/100
long_SL_Input  = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100 
atrLongMultip  = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)   // Parameters to calculate Trailing Stop Loss
atrLongLength  = input(14,    title='ATR Length',      type=input.integer, minval=1)

sep4           = input(title="============SHORT Profit-Loss Parameters============", type=input.bool, defval=false)

e_Short_TP     = input(true, title="Enable a Profit Level?")
e_Short_SL     = input(false, title="Enable a S.Loss Level?")
e_Short_TS     = input(true, title="Enable a Trailing Stop?")
short_TP_Input = input(30.0,   title='Take Profit %',   type=input.float,   minval=0)/100
short_SL_Input = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100
atrShortMultip = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)
atrShortLength = input(14,    title='ATR Length',      type=input.integer, minval=1)

// Indicators

fema   = ema(close, f_length)
mema   = ema(close, m_length)
sema   = ema(close, s_length)
filter = security(syminfo.tickerid, filterRes, ema(close, filter_L))

plot(fema,   title="Fast EMA",   color=color.new(color.green,  0))
plot(mema,   title="Medi EMA",   color=color.new(color.yellow, 0))
plot(sema,   title="Slow EMA",   color=color.new(color.red,    0))
plot(filter, title="EMA Filter", color=color.new(color.white,  0))

// Entry Conditions

longTrade  = strategy.position_size >  0
shortTrade = strategy.position_size <  0
notInTrade = strategy.position_size == 0
inTrade    = strategy.position_size != 0
priceEntry = strategy.position_avg_price

goLong  = fema > mema and mema > sema and fema > filter and  enable_Long  and (crossover (fema, mema) or crossover (mema, sema) or crossover (sema, filter))
goShort = fema < mema and mema < sema and fema < filter and  enable_Short and (crossunder (fema, mema) or crossunder (mema, sema) or crossunder (sema, filter))

close_L = crossunder(fema, mema)
close_S = crossover (fema, mema)

// Profit and Loss conditions

// Long
 
long_TP = priceEntry * (1 + long_TP_Input)  // Long Position Take Profit Calculation
long_SL = priceEntry * (1 - long_SL_Input)  // Long Position Stop Loss Calculation
atrLong = atr(atrLongLength)                // Long Position ATR Calculation
long_TS = low - atrLong * atrLongMultip

long_T_stop  = 0.0                          // Code for calculating Long Positions Trailing Stop Loss/
long_T_stop := if (longTrade)
    longStop = long_TS
    max(long_T_stop[1], longStop)
else 
    0
    
//Short

short_TP = priceEntry * (1 - short_TP_Input) // Long  Position Take Profit Calculation
short_SL = priceEntry * (1 + short_SL_Input) // Short Position Stop Loss Calculation
atrShort = atr(atrShortLength)               // Short Position ATR Calculation
short_TS = high + atrShort * atrShortMultip

short_T_stop   = 0.0                // Code for calculating Short Positions Trailing Stop Loss/
short_T_stop  := if shortTrade
    shortStop  = short_TS
    min(short_T_stop[1], shortStop)
else 
    9999999

// Strategy Long Entry

if goLong and notInTrade 
    strategy.entry("Go Long", long=strategy.long, comment="Go Long", alert_message="Open Long Position")

if longTrade and close_L
    strategy.close("Go Long", when=close_L, comment="Close Long", alert_message="Close Long Position")
    
if e_Long_TP    // Algorithm for Enabled Long Position Profit Loss Parameters
    if (e_Long_TS and not e_Long_SL)
        strategy.exit("Long TP & TS", "Go Long", limit = long_TP, stop = long_T_stop)
    else
        if (e_Long_SL and not e_Long_TS)
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP)
else
    if not e_Long_TP 
        if (e_Long_TS and not e_Long_SL)
            strategy.exit("Long TP & TS", "Go Long", stop = long_T_stop)
        else
            if (e_Long_SL and not e_Long_TS)
                strategy.exit("Long TP & TS", "Go Long",stop = long_SL)
    

// Strategy Short Entry

if goShort and notInTrade 
    strategy.entry("Go Short", long=strategy.short, comment="Go Short", alert_message="Open Short Position")

if shortTrade and close_S
    strategy.close("Go Short", comment="Close Short", alert_message="Close Short Position")

if e_Short_TP   // Algorithm for Enabled Short Position Profit Loss Parameters
    if (e_Short_TS and not e_Short_SL)
        strategy.exit("Short TP & TS", "Go Short", limit = short_TP, stop = short_T_stop)
    else
        if (e_Short_SL and not e_Short_TS)
            strategy.exit("Short TP & SL", "Go Short",limit = short_TP, stop = short_SL)
        else 
            strategy.exit("Short TP & TS", "Go Short",limit = short_TP)
else
    if not e_Short_TP 
        if (e_Short_TS and not e_Short_SL)
            strategy.exit("Short TS", "Go Short", stop = short_T_stop)
        else
            if (e_Short_SL and not e_Short_TS)
                strategy.exit("Short SL", "Go Short",stop = short_SL)

// Long  Position Profit and Loss Plotting

plot(longTrade and e_Long_TP  and long_TP                          ? long_TP      : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_SL  and long_SL and not e_Long_TS        ? long_SL      : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_TS  and long_T_stop and not e_Long_SL    ? long_T_stop  : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)

// Short Position Profit and Loss Plotting

plot(shortTrade and e_Short_TP and short_TP                        ? short_TP     : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_SL and short_SL and not e_Short_TS     ? short_SL     : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_TS and short_T_stop and not e_Short_SL ? short_T_stop : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)