
Это стратегия, основанная на отслеживании тренда. Она покупает сильные акции при появлении прорыва и продает слабые акции при появлении прорыва, чтобы достичь отслеживания тренда.
Эта стратегия основана на двух показателях, определяющих входные и выходные сигналы, один из которых является наивысшей ценой за определенный период, определяемой функцией highest (), а другой - наименьшей ценой за определенный период, определяемой функцией lowest ().
Когда цена закрытия превышает максимальную цену в прошлом определенном периоде, считается, что это прорыв в восходящей тенденции, поэтому посылается многосигнал. Когда цена закрытия ниже минимальной цены в прошлом определенном периоде, считается, что это прорыв в нисходящей тенденции, поэтому посылается пустой сигнал.
Эта стратегия устанавливает одновременно движущиеся и фиксированные стоп-потери. Движущиеся стоп-потери рассчитываются на основе показателя ATR, путем вычисления значения ATR в течение определенного периода и умножения на множитель (париметр trailingAtrMultiplier) в качестве движущихся стоп-потерей.
На первой корневой K-линии после дополнительного дисконтирования вступает в силу фиксированный стоп; после этого он переходит в основном на движущийся стоп. Такая комбинация позволяет закрепить часть прибыли, одновременно отслеживая тенденцию.
Стратегия также устанавливает правила для расчета позиций. Позиции рассчитываются на основе максимально допустимых процентов потерь, учетных прав и интересов. С учетом количества торговых разновидностей и соответствующего снижения позиций по отдельным видам.
В целом, это типичная стратегия слежения за трендом, которая входит в игру, когда считается, что произойдет прорыв, блокирует прибыль и следит за трендом с помощью стоп-лосса, а выходит из игры, когда тренд меняется.
Это новаторская стратегия, основные преимущества которой заключаются в следующем:
Точная оценка тренда. Используйте наивысшую и самую низкую цены для определения того, изменился ли тренд, высокая точность, не поддается ошибочному сигналу.
Наука о позиции и стоп-паролях является разумной. Установка максимального убыточного соотношения, учетная связь интересов и т. д. делает позицию разумной, избегая избыточной или недействительной торговли.
Простые, практичные и понятные в использовании. Требуются только самые основные показатели, логика стратегии простая, ясная и легкая в освоении.
Хорошая масштабируемость. Параметры показателя, правила позиционирования и т. д. предоставляются вводными окнами, которые пользователь может корректировать в соответствии с потребностями.
В целом, это очень практичная и надежная стратегия прорыва. Она безопасна и надежна в своем суждении, но при разработке стратегии учитывается контроль и отслеживание риска.
Основные риски этой стратегии заключаются в следующем:
Риск обратного тренда. Стратегия прорыва сильно зависит от определения тренда, и если она ошибочна, то может привести к огромным потерям.
Неправильный параметр риска. Неправильный выбор параметров максимальной цены и минимальной цены может пропустить тенденцию, неправильная установка параметров позиции может привести к чрезмерной убытке.
Стоп-лошади слишком радикальны. Если мобильные стоп-лошади слишком малы, они могут быть выбиты из игры рыночным шумом.
Основные решения:
Добавление фильтров тенденций. Например, добавление других показателей для оценки, чтобы избежать ошибочных прорывов.
Оптимизация выбора параметров. Тестирование параметров для выбора оптимальных значений для обеспечения их стабильности.
Стоп-дистанция может быть расширена соответствующим образом. Стоп-дистанция должна быть сдержанной.
Эта стратегия может быть оптимизирована в следующих направлениях:
Добавление дополнительных показателей для определения тенденции. Помимо наивысшей минимальной цены, можно добавить определения, такие как подвижная средняя, чтобы сделать определение тенденции более точным.
Оптимизация параметров. Тестирование параметров наивысшей минимальной цены, параметров стоп-мальтипликатора и т. д. для выбора оптимальной комбинации параметров.
Согласно алгоритму рыночной корректировки позиций. Позиции могут быть связаны с волатильностью рынка, например, снижение позиций при повышении VIX.
Фильтр, указывающий на увеличение мощности. Войти только в случае увеличения мощности, чтобы избежать ложного прорыва.
Рассматривайте предпочтительные торговые сорта с базовым отклонением и корреляцией. Выбор комбинаций сорта с малым отклонением от базового отклонения и низкой корреляцией снижает риск комбинации.
Оптимизация и корректировка механизмов остановки убытков. Можно тестировать сочетание пропорций движущихся и фиксированных остановок, снижая риск слишком радикальных остановок.
Эта стратегия является прорывной стратегией трендового типа, которая хорошо работает с точки зрения точности оценки, контроля позиций и риска, простоты работы. Она захватывает тенденции на ранних этапах и сбалансирует блокировку прибыли и трендовый отслеживание с помощью мобильных стоп-лосс.
Конечно, в качестве прорывной стратегии она очень сильно зависит от тенденций и подвержена помехам от шума. Кроме того, неправильная настройка параметров может повлиять на эффективность стратегии. Это требует дальнейшей оптимизации.
В целом, это очень практичная стратегия, и ее основная структура уже содержит самые важные элементы, необходимые для количественной стратегии. Если ее можно постоянно оптимизировать и улучшать, она может стать стабильно прибыльной программированной стратегией.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
overlay=true)
// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")
// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
, tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
, group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
, group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
, group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
, group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
, group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
, group = "Exit Condition")
// Pair info
pair = syminfo.basecurrency + syminfo.currency
// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier
// Trade Condition
longCondition = crossover(close, highestHigh)
shortCondition = crossunder(close, lowestLow)
// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]
// Position size Long
maxpossize = strategy.equity / close
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong)))
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong = (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close
// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close)))
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort = (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close
// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
'\nPosition Size % =' + tostring(posperclong) +
'\nLeverage' + tostring(leveragelong) +
'\nStoploss Price =' + tostring(stopvaluelong) +
'\nClose any Short position that are open for ' + pair + '!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
'\nPosition Size % =' + tostring(pospercshort) +
'\nLeverage' + tostring(leverageshort) +
'\nStoploss Price =' + tostring(stopvalueshort) +
'\nClose any Long position that are open for ' + pair + '!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
'\n\nVisit TrendSurfersSignals.com' +
'\nFor automated premium signals (FREE)'
// Order
if longCondition
strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
, alert_message = entry_long_message)
if shortCondition
strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
, alert_message = entry_short_message)
// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr
var longTrailingStop = 0.0
var shortTrailingStop = 999999.9
trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
if 0 == inTrade
if longCondition
inTrade := 1
else
inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
inTrade := 0
longTrailingStop := if (1 == inTrade)
stopValue = longTrailing
max(stopValue, longTrailingStop[1])
else
0
shortTrailingStop := if (-1 == inTrade)
stopValue = shortTrailing
min(stopValue, shortTrailingStop[1])
else
999999
// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
if 1 == inTrade
fixedStopLine := firstPrice - firstFixAtr
trailingStopLine := longTrailingStop
else
fixedStopLine := firstPrice + firstFixAtr
trailingStopLine := shortTrailingStop
if (strategy.position_size > 0)
strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
, alert_message = exit_long_message)
if (strategy.position_size < 0)
strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
, alert_message = exit_long_message)
// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')