Эта стратегия основана на принципе перекрестки скользящих средних для торговли. Она использует две скользящие средние, генерируя сигналы покупки, когда краткосрочная скользящая средняя пересекает выше долгосрочной скользящей средней снизу. Сигналы продажи генерируются, когда цена превышает другую скользящую среднюю. Эта стратегия подходит для трендовых рынков, способных эффективно отфильтровать некоторые шумные сделки и улавливать основную тенденцию.
Эта стратегия использует пользовательские настраиваемые краткосрочные и долгосрочные скользящие средние периоды, выходной скользящий средний период и методы расчета скользящей средней.
Когда краткосрочная скользящая средняя пересекает длинную скользящую среднюю сверху, генерируется сигнал покупки. Это указывает на то, что краткосрочный тренд перешел в восходящий тренд, и мы можем купить.
Когда цена закрытия переходит ниже выходной скользящей средней, генерируется сигнал продажи. Это указывает на обратный тренд, поэтому мы должны выйти из позиции.
Следовательно, торговые сигналы стратегии исходят из перекрестки краткосрочных и долгосрочных скользящих средних, а также отношения между ценой закрытия и скользящей средней отсчета.
Преимущества этой стратегии:
Просто и легко внедряется.
Настраиваемые параметры соответствуют различным рыночным условиям.
Движущиеся средние фильтруют шум и фиксируют основную тенденцию.
Может включать другие технические показатели, такие как тренд, поддержка / сопротивление для дальнейшей оптимизации.
Контролируемое соотношение риск-вознаграждение, имеет механизм остановки потерь.
Риски:
Склонность к ложным сигналам на рынках консолидации, не имеющих тенденций.
Неправильное настройка параметров может привести к отсутствию тенденций или слишком большому количеству недействительных сделок.
Неправильное размещение стоп-лосса может увеличить убытки.
Неудачный побег может привести к потерям.
Параметры необходимо своевременно корректировать в соответствии с изменениями рынка.
Решения включают оптимизацию параметров, включение других фильтров, корректировку остановок, ожидание подтверждения тренда перед торговлей и т. Д.
Эта стратегия может быть улучшена путем:
Разработка механизмов определения тренда и торговля только после подтверждения тренда.
Добавление фильтров, таких как объем или волатильность, для фильтрации сигналов.
Динамическая оптимизация скользящих средних периодов.
Оптимизация механизма остановки потери для использования остановки задержки.
Включение поддержки/сопротивления и других индикаторов для дальнейшего подтверждения сигналов.
Корректировка параметров на основе различных продуктов и временных рамок.
В целом эта стратегия пересечения скользящих средних является простой и практичной системой, следующей за трендом. Она может быть адаптирована к рыночным условиям путем настройки параметров и улавливать направление основного тренда на трендовых рынках. Но следует отметить риски, такие как неправильная идентификация тренда, и необходима постоянная оптимизация для адаптации к меняющимся рынкам. В целом эта стратегия имеет хорошую жизнеспособность.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 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/ // © TwoChiefs //@version=4 strategy("John EMA Crossover Strategy", overlay=true) //////////////////////////////////////////////////////////////////////////////// // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2021, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true //////////////////////////////////////////////////////////////////////////////// //CREATE USER-INPUT VARIABLES periodShort = input(13, minval=1, title="Enter Period for Short Moving Average") smoothingShort = input(title="Choose Smoothing Type for Short Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodLong = input(48, minval=1, title="Enter Period for Long Moving Average") smoothingLong = input(title="Choose Smoothing Type for Long Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodExit = input(30, minval=1, title="Enter Period for Exit Moving Average") smoothingExit = input(title="Choose Smoothing Type for Exit Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) src1 = close pivot = (high + low + close) / 3 //MA CALCULATION FUNCTION ma(smoothing, src, length) => if smoothing == "RMA" rma(src, length) else if smoothing == "SMA" sma(src, length) else if smoothing == "EMA" ema(src, length) else if smoothing == "WMA" wma(src, length) else if smoothing == "VWMA" vwma(src, length) else if smoothing == "SMMA" na(src[1]) ? sma(src, length) : (src[1] * (length - 1) + src) / length else if smoothing == "HullMA" wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length))) //ASSIGN A MOVING AVERAGE RESULT TO A VARIABLE shortMA=ma(smoothingShort, pivot, periodShort) longMA=ma(smoothingLong, pivot, periodLong) exitMA=ma(smoothingExit, pivot, periodExit) //PLOT THOSE VARIABLES plot(shortMA, linewidth=4, color=color.yellow,title="The Short Moving Average") plot(longMA, linewidth=4, color=color.blue,title="The Long Moving Average") plot(exitMA, linewidth=1, color=color.red,title="The Exit CrossUnder Moving Average") //BUY STRATEGY buy = crossover(shortMA,longMA) ? true : na exit = crossunder(close,exitMA) ? true : na strategy.entry("long",true,when=buy and time_cond) strategy.close("long",when=exit and time_cond) if (not time_cond) strategy.close_all()