Стратегия пересечения равномерных линий - это часто используемая торговая стратегия, основанная на движущихся равномерных линиях. Эта стратегия использует пересечение быстро движущихся равномерных линий и медленно движущихся равномерных линий в качестве сигналов покупки и продажи.
Центральная логика этой стратегии основана на теории равновесия. Движущаяся равновесия эффективно сглаживает колебания цен и отражает тенденцию цен. Быстрая равновесия более чувствительна к изменениям цен и может улавливать переломные моменты тенденции; медленная равновесия менее чувствительна к изменениям цен и может фильтровать краткосрочные колебания.
В частности, стратегия сначала определяет 50-дневную и 200-дневную среднюю линию. Затем устанавливается многоголовое входное условие для быстрого прохождения медленного среднего уровня над средней линией, и пустое входное условие для быстрого прохождения медленного среднего уровня под средней линией. Чтобы избежать перекрытия торгов, стратегия использует контрольные знаки isEntry и isExit.
Кроме того, в стратегии также установлена точка остановки. Пользователь может установить расстояние для остановки путем ввода процента. Стоп-стоп и стоп-стоп цены будут рассчитываться в соответствии с процентной разницей в цене входа.
Эта стратегия имеет следующие преимущества:
Простая в использовании и легко реализуемая. Торговля может осуществляться только с помощью равнолинейного пересечения, что идеально подходит для начинающих, не имеющих опыта торговли.
Контролируемые отступления с определенным механизмом управления рисками. Мобильная средняя линия может эффективно фильтровать краткосрочные колебания цен и избегать арбитража.
Настраиваемые параметры, адаптивность. Пользователь может самостоятельно настроить параметры средней линии и стоп-стоп-стоп стандартов, оптимизировать стратегию.
Визуальное отображение четко. Стратегия прямо на графике наносит на карту ключевые средние линии, точки входа, точки остановки и остановки убытков.
Расширяемая. Рамка стратегии является целостной и может быть улучшена только путем изменения ключевых торговых сигналов, добавления индикаторов и т. Д.
Однако эта стратегия также несет в себе некоторые риски:
Рыночные внезапности приводят к гигантским событиям, которые невозможно остановить. Быстрая средняя линия чувствительна к изменениям цен и не может эффективно реагировать на внезапные события.
Если рынок будет колебаться в течение длительного времени, то убытки будут повторяться.
Не учитываются затраты на транзакции. Операционные комиссионные и потери скольжения в фактических транзакциях серьезно влияют на прибыль.
Риск совпадения данных. Ситуация в реальном пространстве сложная и изменчивая, результаты отслеживания не представляют собой реальные боевые действия.
Решение проблемы:
Можно установить более мягкие стандарты потери, а также добавить дополнительный прорыв.
Можно расширить расстояние между средними линиями, снизить частоту сделок или использовать другие индикаторы для фильтрации сигналов.
Принимая во внимание фактические затраты на транзакции, следует установить более широкий предел для остановки.
Следует учитывать изменения рыночной среды, оптимизировать параметры и постепенно снижать соответствие.
Эта стратегия может быть оптимизирована в следующих аспектах:
Тестируйте различные комбинации параметров, чтобы найти наиболее оптимальный. Можно тестировать количество дней в средне-медленном темпе, комбинации параметров и т. д.
Фильтрация других индикаторов, чтобы избежать ошибочных сделок в условиях шока. Например, MACD, KD и другие индикаторы.
Оптимизация стратегии стоп-стоп и более эффективное управление рисками, например, отслеживание стоп-стоп, установка стоп-стоп и т. д.
Увеличение размеров позиций, использование леверинга для увеличения, увеличение прибыли.
Принимая во внимание затраты на реальные сделки, оптимизируйте и корректируйте параметры отсчета, чтобы сделать стратегические параметры более подходящими для боевых действий.
Оценка стабильности параметров в сочетании со статистическими методами снижает риск совпадения данных и повышает стабильность.
В целом, общая концепция этой равнолинейной кросс-стратегии ясна, проста в реализации и подходит для обучения вступлению в стратегию количественной торговли. Однако в этой стратегии также есть определенные риски и недостатки, требующие тщательной оптимизации параметров и фильтров, а также внимания к контролю риска торговли на реальном диске, чтобы получить стабильную прибыль.
/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
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/
// © gjfsdrtytru
//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)
// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)
plot(fastMA, "Fast MA", color.blue)
plot(slowMA, "Slow MA", color.red)
// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)
// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)
// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"
//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////
// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength
testPeriod() =>
time >= testPeriodStart and time <= testPeriodStop ? true : false
// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL
// Determine TP/SL price based on percentage given
longProfitPrice = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortStopPerc)
// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)
entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and shortCondition
exitShort = not isExit_Short and closeShort
if (entryLong)
isEntry_Long := true
isExit_Long := false
if (exitLong)
isEntry_Long := false
isExit_Long := true
if (entryShort)
isEntry_Short := true
isExit_Short := false
if (exitShort)
isEntry_Short := false
isExit_Short := true
// Order Execution
if testPeriod()
if entryLong
strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
if entryShort
strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}
// TP/SL Execution
if (strategy.position_size > 0)
strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}
if (strategy.position_size < 0)
strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")