
Эта стратегия использует преимущества трех индикаторов: индикатора EMA, стратегии трендового отслеживания TTS и трендового цикла Shuffle STC, чтобы создать более сильную стратегию, которая отслеживает короткие линии. В частности, стратегия одновременно определяет, согласуются ли пустые сигналы трех индикаторов, и если они согласуются, то это создает торговый сигнал; если они не согласуются, то нет покупок. Это позволяет отфильтровать некоторые ложные сигналы, что делает стратегию более надежной.
Стратегия состоит из трех основных частей: индикатор сглаживания EMA, стратегия отслеживания трендов TTS и индикатор циклов трендов STC-Schwefter.
Во-первых, рассчитывая 200-циклическое скользящее среднее индекса EMA, можно определить, находится ли цена ниже или выше этой линии EMA. Если цена ниже этой линии, то индикатор EMA дает пустой сигнал; -1; если цена выше этой линии, то индикатор EMA дает многоголовый сигнал:
Во-вторых, рассчитывает соответствующие параметры стратегии отслеживания трендов TTS, чтобы определить направление тренда, основываясь на том, что цена прорывается вверх или вниз. Если цена прорывается вверх, то создается многоголовый сигнал 1; если цена прорывается вниз, то создается пустой сигнал -1.
Наконец, рассчитывается STC-индикатор, который отражает тенденцию изменения центров цен. Если STC-индикатор повышается, то создается многоголовый сигнал 1; если STC-индикатор падает, то создается пустой сигнал -1.
Получив три индикаторных сигнала суждения, стратегия определяет, согласуются ли они. Только когда все три индикаторных сигнала суждения согласуются, фактический торговый сигнал будет произведен. Это может эффективно отфильтровать некоторые ложные сигналы, что делает стратегию более надежной.
Если определено, что будет создан торговый сигнал, выполняется ордер на увеличение или уменьшение цены, и устанавливается точка остановки.
В этой стратегии используются три различных типа индикаторов, которые позволяют эффективно определить направление рыночных тенденций.
Использование трех показателей суждения о единстве сигналов, чтобы отфильтровать фальшивые сигналы, может уменьшить количество ненужных сделок и сделать стратегию более надежной.
Установка разумных стоп-стоп-пойнтов позволяет закрепить прибыль и избежать увеличения убытков.
Выбранные параметры были оптимизированы для большинства видов акций и валют.
Логика транзакций ясна, проста, легко понятна и легко изменяется.
При несоответствии между тремя показателями суждения, появляются димеры, которые легко упускают торговые возможности. Можно рассмотреть возможность оптимизации правил суждения.
STC-показатели более чувствительны к параметрам, которые требуют корректировки различных сортов.
В рецессионных ситуациях, стоп-стоп может быть преодолен, что приводит к большим убыткам. Можно рассмотреть оптимизацию стоп-стоп в реальном времени.
Если вы не можете эффективно судить о том, что происходит, вы можете попасть в тюрьму.
Можно тестировать больше комбинаций показателей, чтобы найти более сильные правила суждения. Например, добавление показателей RSI и т. Д.
Оптимизация параметров показателей STC, чтобы они были более подходящими для разных сортов. Добавлен модуль оптимизации параметров самостоятельной адаптации.
Добавлен модуль адаптивного остановки, который позволяет оптимизировать остановку в режиме реального времени в зависимости от ситуации.
Улучшение модуля “Уравнение”, чтобы определить, входил ли он в пассивную подборку, чтобы избежать “пленки”.
Оптимизация алгоритмов для высокочастотных сделок, снижение задержек в системе и повышение успешности заказов.
Стратегия использует три показателя, EMA, TTS и STC, чтобы определить направление тренда, и, когда правила суждения установлены на то, что три из них совпадают, генерируют торговый сигнал, чтобы эффективно отфильтровывать ложные сигналы. Существует большое пространство для оптимизации стратегии, для дальнейшего усиления ее эффективности в процессе отслеживания тренда путем тестирования большего количества комбинаций показателей, добавления адаптивных алгоритмов, оптимизации высокочастотного торгового модуля и т. Д. По сравнению с традиционными стратегиями, такими как простое следование за средней линией, эта стратегия может более разумно судить о рынке и избегать попадания в ловушку при одновременном попытке уловить тренд.
/*backtest
start: 2022-12-05 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
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/
// © ajahanbin1374
//@version=5
strategy(title = "EMA + TTS + STC", shorttitle = "EMA + TTS + STC", overlay = true, calc_on_order_fills=false, calc_on_every_tick = false, initial_capital = 100, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.01)
////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
profit = input.float(defval = 0.1, minval = 0.0, title="Profit %", step=0.01, group = "Strategy") * 0.01
////////////////////////////////////////////////////////////
// Emponential Moving Average
////////////////////////////////////////////////////////////
ema = ta.ema(close, 200)
posEma = close < ema ? -1 : 1
////////////////////////////////////////////////////////////
// Trend Trader Strategy
////////////////////////////////////////////////////////////
Length = input.int(21, minval=1, group="Trend Trader Strategy")
Multiplier = input.float(3, minval=0.000001, group="Trend Trader Strategy")
avgTR = ta.wma(ta.atr(1), Length)
highestC = ta.highest(Length)
lowestC = ta.lowest(Length)
hiLimit = highestC[1] - avgTR[1] * Multiplier
loLimit = lowestC[1] + avgTR[1] * Multiplier
ret = 0.0
posTts = 0.0
ret:= close > hiLimit and close > loLimit ? hiLimit :
close < loLimit and close < hiLimit ? loLimit : nz(ret[1], close)
posTts:= close > ret ? 1 :close < ret ? -1 : nz(posTts[1], 0)
////////////////////////////////////////////////////////////
// Schaff Trend Cycle (STC)
////////////////////////////////////////////////////////////
EEEEEE = input.int(12, 'Length', group ="Schaff Trend Cycle")
BBBB = input.int(26, 'FastLength', group ="Schaff Trend Cycle")
BBBBB = input.int(50, 'SlowLength', group ="Schaff Trend Cycle")
AAAA(BBB, BBBB, BBBBB) =>
fastMA = ta.ema(BBB, BBBB)
slowMA = ta.ema(BBB, BBBBB)
AAAA = fastMA - slowMA
AAAA
AAAAA(EEEEEE, BBBB, BBBBB) =>
AAA = input.float(0.5, group ="Schaff Trend Cycle")
var CCCCC = 0.0
var DDD = 0.0
var DDDDDD = 0.0
var EEEEE = 0.0
BBBBBB = AAAA(close, BBBB, BBBBB)
CCC = ta.lowest(BBBBBB, EEEEEE)
CCCC = ta.highest(BBBBBB, EEEEEE) - CCC
CCCCC := CCCC > 0 ? (BBBBBB - CCC) / CCCC * 100 : nz(CCCCC[1])
DDD := na(DDD[1]) ? CCCCC : DDD[1] + AAA * (CCCCC - DDD[1])
DDDD = ta.lowest(DDD, EEEEEE)
DDDDD = ta.highest(DDD, EEEEEE) - DDDD
DDDDDD := DDDDD > 0 ? (DDD - DDDD) / DDDDD * 100 : nz(DDDDDD[1])
EEEEE := na(EEEEE[1]) ? DDDDDD : EEEEE[1] + AAA * (DDDDDD - EEEEE[1])
EEEEE
mAAAAA = AAAAA(EEEEEE, BBBB, BBBBB)
mColor = mAAAAA > mAAAAA[1] ? color.new(color.green, 20) : color.new(color.red, 20)
posStc = mAAAAA > mAAAAA[1] ? 1 : -1
////////////////////////////////////////////////////////////
// Strategy entry
////////////////////////////////////////////////////////////
pos = posEma == 1 and posTts == 1 and posStc == 1 ? 1 : posEma == -1 and posTts == -1 and posStc == -1 ? -1 : 0
currentPostition = strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0
noOpenPosition = strategy.position_size == 0
signal = pos != pos[1] and pos == 1 and noOpenPosition ? 1 : pos != pos[1] and pos == -1 and noOpenPosition ? -1 : 0
stopPriceForLong = math.min(close * (1 - profit), low[1] * 0.9998, low[2] * 0.9998)
limitPriceForLong = close + (close - stopPriceForLong)
stopPriceForShort = math.max(close * (1 + profit), high[1] * 1.0002, high[2] * 1.0002)
limitPriceForShort = close - (stopPriceForShort - close)
if signal == 1
strategy.entry(id="L", direction=strategy.long)
strategy.exit(id='EL', from_entry='L', limit=limitPriceForLong, stop=stopPriceForLong)
if signal == -1
strategy.entry(id="S", direction=strategy.short)
strategy.exit(id='ES', from_entry='S', limit=limitPriceForShort, stop=stopPriceForShort)
////////////////////////////////////////////////////////////
// Plots - Debuger
////////////////////////////////////////////////////////////
plotchar(signal, title='singal', char = '')
plotchar(posEma, title='posEma', char = '')
plotchar(posTts, title='posTts', char = '')
plotchar(pos, title='pos', char = '')
plotchar(currentPostition, title = 'currentPostition', char='')
plotchar(stopPriceForLong, title = "stopPriceForLong", char ='')
plotchar(limitPriceForLong, title = 'limitPriceForLong', char='')
plotchar(stopPriceForShort, title = "stopPriceForShort", char ='')
plotchar(limitPriceForShort, title = 'limitPriceForShort', char='')
////////////////////////////////////////////////////////////
// Plots
////////////////////////////////////////////////////////////
plot(ret, color=color.new(color.black, 0), title='Trend Trader Strategy')
plotchar(mAAAAA, color=mColor, title='STC', location = location.bottom, char='-', size=size.normal)
plot(series = ema, title = "ema")