Стратегия перекрестного использования скользящей средней

Автор:Чао Чжан, Дата: 2023-10-10 10:44:25
Тэги:

Обзор

Стратегия пересечения скользящей средней - это широко используемая стратегия торговли, основанная на скользящих средних. Она использует пересечение более быстрой скользящей средней и более медленной скользящей средней в качестве торговых сигналов. Когда более быстрая скользящая средняя пересекает более медленную скользящую среднюю снизу, это сигнал покупки. Когда более быстрая скользящая средняя пересекает ниже более медленной скользящей средней сверху, это сигнал продажи. Эта стратегия использует 50-дневный MA как более быструю MA и 200-дневный MA как более медленную MA.

Логика стратегии

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

В частности, эта стратегия сначала определяет 50-дневный MA и 200-дневный MA. Условие длинного входа устанавливается, когда более быстрый MA пересекает более медленный MA. Условие короткого входа устанавливается, когда более быстрый MA пересекает ниже более медленного MA. Чтобы избежать перекрытия сделок, стратегия использует флаги isEntry и isExit для управления. Когда условие входа выполняется, isEntry устанавливается на true. Когда условие выхода выполняется, isExit устанавливается на true. Долгая позиция будет открыта только тогда, когда isEntry является ложным и появляется сигнал покупки.

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

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

Преимущества этой стратегии включают:

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

  2. Контролируемое снижение с управлением рисками.

  3. Пользователи могут оптимизировать такие параметры, как периоды MA и уровни TP / SL.

  4. Ясная визуализация. Стратегия отображает ключевые МА, записи и уровни TP / SL на графике.

  5. Расширяемая структура. Структура стратегии завершена. Новые сигналы и индикаторы могут быть добавлены для ее улучшения.

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

Риски этой стратегии включают:

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

  2. Склонны к падениям на различных рынках, вызывая последовательные потери.

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

  4. Реальные рыночные условия сложны, и результаты обратных тестов могут не отражать реальную производительность.

К решению таких проблем относятся:

  1. Использовать более широкий стоп-лосс или добавить дополнительный стоп-лосс для прорыва.

  2. Расширяйте расстояние MA, уменьшайте частоту торговли или добавляйте другие фильтры.

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

  4. Оптимизировать параметры постепенно и уменьшить переподготовку с учетом меняющихся рыночных условий.

Руководство по оптимизации

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

  1. Испытывайте различные комбинации параметров, чтобы найти оптимальные параметры, такие как периоды MA.

  2. Добавьте другие индикаторы в качестве фильтров, чтобы избежать сбоев, такие как MACD, KD и т. д.

  3. Оптимизировать стратегию стоп-лосса для лучшего управления рисками, например, отслеживание стоп-лосса.

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

  5. Учитывайте торговые издержки, оптимизируйте параметры для торговли в реальном времени.

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

Заключение

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


/*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")

Больше