Стратегия пересечения скользящей средней - это широко используемая стратегия торговли, основанная на скользящих средних. Она использует пересечение более быстрой скользящей средней и более медленной скользящей средней в качестве торговых сигналов. Когда более быстрая скользящая средняя пересекает более медленную скользящую среднюю снизу, это сигнал покупки. Когда более быстрая скользящая средняя пересекает ниже более медленной скользящей средней сверху, это сигнал продажи. Эта стратегия использует 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.
Преимущества этой стратегии включают:
Простая в применении, она торгуется исключительно на основе перекресток MA, подходящей для новичков без опыта торговли.
Контролируемое снижение с управлением рисками.
Пользователи могут оптимизировать такие параметры, как периоды MA и уровни TP / SL.
Ясная визуализация. Стратегия отображает ключевые МА, записи и уровни TP / SL на графике.
Расширяемая структура. Структура стратегии завершена. Новые сигналы и индикаторы могут быть добавлены для ее улучшения.
Риски этой стратегии включают:
Невозможность остановить убытки во время экстремальных рыночных событий, что приводит к огромному снижению.
Склонны к падениям на различных рынках, вызывая последовательные потери.
Стоимость торговли не учитывается, так как сборы и сдвиги в фактической торговле окажут значительное влияние на прибыльность.
Реальные рыночные условия сложны, и результаты обратных тестов могут не отражать реальную производительность.
К решению таких проблем относятся:
Использовать более широкий стоп-лосс или добавить дополнительный стоп-лосс для прорыва.
Расширяйте расстояние MA, уменьшайте частоту торговли или добавляйте другие фильтры.
Учитывайте фактические торговые издержки, устанавливайте более широкий целевой диапазон прибыли.
Оптимизировать параметры постепенно и уменьшить переподготовку с учетом меняющихся рыночных условий.
Эта стратегия может быть оптимизирована в следующих аспектах:
Испытывайте различные комбинации параметров, чтобы найти оптимальные параметры, такие как периоды MA.
Добавьте другие индикаторы в качестве фильтров, чтобы избежать сбоев, такие как MACD, KD и т. д.
Оптимизировать стратегию стоп-лосса для лучшего управления рисками, например, отслеживание стоп-лосса.
Увеличьте размер позиции с использованием рычага, чтобы увеличить прибыль, контролируя риск.
Учитывайте торговые издержки, оптимизируйте параметры для торговли в реальном времени.
Оценить стабильность параметров с использованием статистических методов для уменьшения чрезмерного приспособления.
В заключение, эта кроссоверная стратегия 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")