Стратегия множественного разворота, основанная на среднем тренде


Дата создания: 2023-11-21 14:53:48 Последнее изменение: 2023-11-21 14:53:48
Копировать: 0 Количество просмотров: 600
1
Подписаться
1617
Подписчики

Стратегия множественного разворота, основанная на среднем тренде

Обзор

Стратегия производит покупку и продажу при их обратном движении, рассчитывая на различные индикаторы тренда. Основные индикаторы тренда включают TDI, TCF, TTF и TII. Стратегия выбирает в конфигурации, какой из показателей использовать для создания торгового сигнала.

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

  • ### Показатели TDI

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

  • ### Показатели TCF

Показатель TCF рассчитывает положительные и отрицательные изменения цены, чтобы оценить силу плюс-минус. Если положительная сила больше, чем отрицательная сила, то нужно сделать больше, иначе ликвидировать.

  • ### Показатели TTF

TTF-индикатор определяет тренд, сравнивая силу высоких и низких точек. Сделать больше, чтобы показать, что TTF-индикатор прошел 100, и наоборот, очистить.

  • ### Показатели TII

Индекс TII объединяет среднюю линию и ценовой диапазон для определения обратного тренда. Он учитывает как краткосрочные, так и долгосрочные тенденции.

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

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

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

  1. Используйте сигналы об обратном тренде, чтобы вовремя уловить возможность изменения тренда.
  2. Конфигурация различных показателей, которые можно оптимизировать для конкретных целей
  3. Богатое сочетание показателей, которые могут быть использованы в комбинации для подтверждения сигналов

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

Основные риски, связанные с этой стратегией:

  1. Торговые сигналы, генерируемые трендовыми индикаторами, могут быть ошибочными и привести к убыткам.
  2. Один индикатор не может полностью определить тенденцию и подвержен влиянию рынка
  3. Неправильная конфигурация параметров индикатора и параметров торгов может привести к искажению рынка и создать ошибочные сделки

Можно снизить риск следующими способами:

  1. Оптимизация параметров индикатора, чтобы найти оптимальную комбинацию параметров
  2. Комбинирование сигналов нескольких индикаторов для торговли и повышения качества сигналов
  3. Настройка стратегии управления позициями, контроль одиночных потерь

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

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

  1. Тест оптимальных комбинаций индикаторов и параметров для различных рыночных циклов
  2. Добавить или удалить показатели, чтобы найти оптимальную комбинацию показателей
  3. Фильтрация торговых сигналов для удаления ложных сигналов
  4. Оптимизация стратегий управления позициями, таких как изменяемые позиции, отслеживание стоп-лосс и т. д.
  5. Добавление рейтинга машинного обучения, который поможет оценить качество сигнала

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

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

Исходный код стратегии
/*backtest
start: 2023-11-13 00:00:00
end: 2023-11-15 03:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © kruskakli
//
// Here is a collection of Trend Indicators as defined by M.H Pee and presented
// in various articles of the "STOCKS & COMMODITIES Magazine"
//
// The actual implementation of the indicators here are made by: everget
//
// I have gather them here so that they easily can be tested.
//
// My own test was made using 15 companies from the OMXS30 list
// during the time period of 2016-2018, and I only went LONG.
//
// The result was as follows:
//
//        Average    Std.Dev
//        profit
//  TDI    3.04%      5.97
//  TTF    1.22%.     5.73
//  TII    1.07%      6.2
//  TCF    0.32%      2.68
//
strategy("M.H Pee indicators", overlay=true)


use = input(defval="TDI", title="Use Indicator", type=input.string,
             options=["TDI","TCF","TTF","TII"])

src = close


//
// TDI
//
length = input(title="Length", type=input.integer, defval=20)
mom = change(close, length)
tdi = abs(sum(mom, length)) - sum(abs(mom), length * 2) + sum(abs(mom), length)
// Direction Indicator
tdiDirection = sum(mom, length)
tdiLong = crossover(tdiDirection, tdi)
tdiXLong = crossunder(tdiDirection, tdi)

//
// TCF
//
tcflength = input(title="Length", type=input.integer, defval=35)

plusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? change_1 : 0.0
minusChange(src) =>
    change_1 = change(src)
    change(src) > 0 ? 0.0 : -change_1

plusCF = 0.0
plusChange__1 = plusChange(src)
plusCF := plusChange(src) == 0 ? 0.0 : plusChange__1 + nz(plusCF[1])

minusCF = 0.0
minusChange__1 = minusChange(src)
minusCF := minusChange(src) == 0 ? 0.0 : minusChange__1 + nz(minusCF[1])

plusTCF = sum(plusChange(src) - minusCF, tcflength)
minusTCF = sum(minusChange(src) - plusCF, tcflength)

tcfLong = plusTCF > 0 
tcfXLong = plusTCF < 0

//
// TTF
//
ttflength = input(title="Lookback Length", type=input.integer, defval=15)

hh = highest(length)
ll = lowest(length)

buyPower = hh - nz(ll[length])
sellPower = nz(hh[length]) - ll

ttf = 200 * (buyPower - sellPower) / (buyPower + sellPower)

ttfLong = crossover(ttf, 100)
ttfXLong = crossunder(ttf, -100)

//
// TII
//
majorLength = input(title="Major Length", type=input.integer, defval=60)
minorLength = input(title="Minor Length", type=input.integer, defval=30)
upperLevel = input(title="Upper Level", type=input.integer, defval=80)
lowerLevel = input(title="Lower Level", type=input.integer, defval=20)

sma = sma(src, majorLength)

positiveSum = 0.0
negativeSum = 0.0

for i = 0 to minorLength - 1 by 1
    price = nz(src[i])
    avg = nz(sma[i])
    positiveSum := positiveSum + (price > avg ? price - avg : 0)
    negativeSum := negativeSum + (price > avg ? 0 : avg - price)
    negativeSum

tii = 100 * positiveSum / (positiveSum + negativeSum)

tiiLong = crossover(tii, 80)
tiiXLong = crossunder(tii,80)

//
// LOGIC 
//
enterLong = (use == "TDI" and tdiLong) or (use == "TCF" and tcfLong) or (use == "TTF" and ttfLong) or (use == "TII" and tiiLong)
exitLong = (use == "TDI" and tdiXLong) or (use == "TCF" and tcfXLong) or (use == "TTF" and ttfXLong) or (use == "TII" and tiiXLong)


// Time range for Back Testing
btStartYear  = input(title="Back Testing Start Year",  type=input.integer, defval=2016)
btStartMonth = input(title="Back Testing Start Month", type=input.integer, defval=1)
btStartDay   = input(title="Back Testing Start Day",   type=input.integer, defval=1)
startTime = timestamp(btStartYear, btStartMonth, btStartDay, 0, 0)

btStopYear  = input(title="Back Testing Stop Year",  type=input.integer, defval=2028)
btStopMonth = input(title="Back Testing Stop Month", type=input.integer, defval=12)
btStopDay   = input(title="Back Testing Stop Day",   type=input.integer, defval=31)
stopTime  = timestamp(btStopYear, btStopMonth, btStopDay, 0, 0)

window() => time >= startTime and time <= stopTime ? true : false


riskPerc     = input(title="Max Position  %", type=input.float, defval=20, step=0.5)
maxLossPerc  = input(title="Max Loss Risk %", type=input.float, defval=5, step=0.25)

// Average True Range (ATR) measures market volatility.
// We use it for calculating position sizes.
atrLen   = input(title="ATR Length", type=input.integer, defval=14)
stopOffset = input(title="Stop Offset", type=input.float, defval=1.5, step=0.25)
limitOffset = input(title="Limit Offset", type=input.float, defval=1.0, step=0.25)
atrValue = atr(atrLen)


// Calculate position size
maxPos = floor((strategy.equity * (riskPerc/100)) / src)
// The position sizing algorithm is based on two parts:
// a certain percentage of the strategy's equity and
// the ATR in currency value.
riskEquity  = (riskPerc / 100) * strategy.equity
// Translate the ATR into the instrument's currency value.
atrCurrency = (atrValue * syminfo.pointvalue)
posSize0    = min(floor(riskEquity / atrCurrency), maxPos)
posSize     = posSize0 < 1 ? 1 : posSize0

if (window())
    strategy.entry("Long", long=true, qty=posSize0, when=enterLong)
    strategy.close_all(when=exitLong)