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


Дата создания: 2023-10-10 15:21:45 Последнее изменение: 2023-10-10 15:21:45
Копировать: 1 Количество просмотров: 649
1
Подписаться
1617
Подписчики

Обзор

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

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

  1. Вычислите средние скоростные и средние замедленные движения. Параметры средних скоростных движений по умолчанию 21, а средних замедленных движений по умолчанию 34.

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

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

  4. Привлечение прибыли от динамического отслеживания тенденций рынка путем автоматической корректировки параметров длины движущейся средней линии.

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

  1. Стратегия проста, ясна и понятна.

  2. Это позволяет эффективно отслеживать рыночные тенденции и имеет большой потенциал для получения прибыли.

  3. Динамически корректируя параметры, можно адаптироваться к изменениям ситуации.

  4. Конфигурируемый мобильный среднелинейный алгоритм для повышения гибкости стратегии.

  5. Свободная конфигурация, логика, гибкое применение.

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

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

  2. При резких колебаниях в торговле, движущаяся средняя линия задерживается и может пропустить оптимальный момент покупки или продажи.

  3. Неправильная конфигурация может привести к неэффективности стратегии.

  4. Необходимо строго контролировать убытки, чтобы предотвратить их увеличение.

  5. Если тенденция изменится, это может привести к огромным убыткам.

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

  1. Оптимизация параметров движущихся средних, чтобы они были более чувствительными и своевременно улавливали изменения тенденций.

  2. Добавлена логика сдерживания убытков, строго контролируются единичные убытки.

  3. Повышение показателей оценки трендов, чтобы избежать убытков от обратного тренда.

  4. Оптимизация мобильной стратегии корректировки средней линии, чтобы сделать ее более умной и автоматизированной.

  5. Добавление модуля оптимизации параметров, автоматическая оптимизация с использованием методов машинного обучения.

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

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

Исходный код стратегии
/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy, 
// A simple strategy based on crossing Moving Averages of 
// different lengths (a fast moving average and slow one)
//

strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)

// 
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len  = input(title = "Fast MA Length",  defval = 21,    type = input.integer, minval = 1, step = 1)
var _slowMA_len  = input(title = "Slow MA Length",  defval = 34,    type = input.integer, minval = 1, step = 1)
var _ma_algo_id  = input(title = "MA Algorithm",    defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear   = input(defval = 2020, title = "Start Year",  type = input.integer, minval = 1976)
var _startMonth  = input(defval = 1,    title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay    = input(defval = 1,    title = "Start Day",   type = input.integer, minval = 1, maxval = 31)
var _closeYear   = input(defval = 2020, title = "Close Year",  type = input.integer, minval = 1984)
var _closeMonth  = input(defval = 9,    title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay    = input(defval = 1,    title = "Close Day",   type = input.integer, minval = 1, maxval = 31)

//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00)     // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59)     // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
    (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))

//
// -- strategy logic and calculation(s)
ma_fast  = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow  = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA

//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)

//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)