Эта стратегия сочетает в себе перекрестки 11 различных типов скользящих средних для длинных и коротких записей. 11 используемых скользящих средних: Простые (SMA), Экспоненциальные (EMA), Весенные (WMA), Весенные по объему (VWMA), Сглаженные (SMMA), Двойные Экспоненциальные (DEMA), Тройные Экспоненциальные (TEMA), Хулл (HMA), Нулевые отставания Экспоненциальные (ZEMA), Треугольные (TMA) и Супергладкий (SSMA) фильтр.
Стратегия позволяет настроить две скользящие средние - более быструю и более медленную, обе выбранные из 11 вариантов. Длинные сигналы генерируются, когда более быстрый MA пересекает более медленный MA. Короткие сигналы возникают, когда более быстрый MA пересекает ниже более медленного MA.
Дополнительные функции включают в себя настройки пирамиды, уровни получения прибыли и стоп-лосса.
Основная логика стратегии опирается на перекрестки между двумя скользящими средними для определения входов и выходов.
Условия вступления:
Длинная запись: быстрая MA > медленная MA Краткая запись: Быстрая МР < Медленная МР
Выходы определяются по одному из трех критериев:
Стратегия позволяет настроить ключевые параметры, такие как тип и длина MA, настройки пирамиды, процентные ставки прибыли и стоп-лосса. Это обеспечивает гибкость для оптимизации стратегии для различных рыночных условий и предпочтений риска.
Управление рисками может быть улучшено с помощью подтверждения действия цены для сигналов входа, с использованием последующих остановок вместо жестких остановок и избежания чрезмерной оптимизации.
Эта стратегия может быть улучшена несколькими способами:
Стратегия кроссовера одиннадцати скользящих средних обеспечивает систематический подход к торговле кроссоверами. Объединяя сигналы по нескольким показателям MA и позволяя настраивать ключевые параметры, она обеспечивает надежную, но гибкую торговую структуру. Тонкая настройка и управление рисками будут играть ключевую роль в оптимизации производительности. Стратегия имеет большой потенциал для торговли на основе импульса, но должна быть адаптирована для различных рыночных условий.
/*backtest start: 2023-12-15 00:00:00 end: 2024-01-14 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title = "[STRATEGY] MA Cross Eleven", overlay = true) // MA - type, source, length // MA - type, source, length // SMA --> Simple // EMA --> Exponential // WMA --> Weighted // VWMA --> Volume Weighted // SMMA --> Smoothed // DEMA --> Double Exponential // TEMA --> Triple Exponential // HMA --> Hull // TMA --> Triangular // SSMA --> SuperSmoother filter // ZEMA --> Zero Lag Exponential type = input(defval="ZEMA", title="MA Type: ", options=["SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "ZEMA", "TMA", "SSMA"]) len1 = input(defval=8, title="Fast MA Length", minval=1) srcclose1 = input(close, "Fast MA Source") len2 = input(defval=21, title="Slow MA Length", minval=1) srcclose2 = input(close, "Slow MA Source") // Returns MA input selection variant, default to SMA if blank or typo. variant(type, src, len) => v1 = sma(src, len) // Simple v2 = ema(src, len) // Exponential v3 = wma(src, len) // Weighted v4 = vwma(src, len) // Volume Weighted v5 = 0.0 v5 := na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len // Smoothed v6 = 2 * v2 - ema(v2, len) // Double Exponential v7 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len) // Triple Exponential v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len))) // Hull v11 = sma(sma(src,len),len) // Triangular // SuperSmoother filter // © 2013 John F. Ehlers a1 = exp(-1.414*3.14159 / len) b1 = 2*a1*cos(1.414*3.14159 / len) c2 = b1 c3 = (-a1)*a1 c1 = 1 - c2 - c3 v9 = 0.0 v9 := c1*(src + nz(src[1])) / 2 + c2*nz(v9[1]) + c3*nz(v9[2]) // Zero Lag Exponential e = ema(v2, len) v10 = v2+(v2-e) // return variant, defaults to SMA if input invalid. type=="EMA"?v2 : type=="WMA"?v3 : type=="VWMA"?v4 : type=="SMMA"?v5 : type=="DEMA"?v6 : type=="TEMA"?v7 : type=="HullMA"?v8 : type=="SSMA"?v9 : type=="ZEMA"?v10 : type=="TMA"? v11: v1 ma_1 = variant(type, srcclose1, len1) ma_2 = variant(type, srcclose2, len2) plot(ma_1, title="Fast MA", color = green, linewidth=2, transp=0) plot(ma_2, title="Slow MA", color = red, linewidth=2, transp=0) longCond = na shortCond = na longCond := crossover(ma_1, ma_2) shortCond := crossunder(ma_1, ma_2) // Count your long short conditions for more control with Pyramiding sectionLongs = 0 sectionLongs := nz(sectionLongs[1]) sectionShorts = 0 sectionShorts := nz(sectionShorts[1]) if longCond sectionLongs := sectionLongs + 1 sectionShorts := 0 if shortCond sectionLongs := 0 sectionShorts := sectionShorts + 1 // Pyramiding Inputs pyrl = input(1, "Pyramiding") // These check to see your signal and cross references it against the pyramiding settings above longCondition = longCond and sectionLongs <= pyrl shortCondition = shortCond and sectionShorts <= pyrl // Get the price of the last opened long or short last_open_longCondition = na last_open_shortCondition = na last_open_longCondition := longCondition ? high[1] : nz(last_open_longCondition[1]) last_open_shortCondition := shortCondition ? low[1] : nz(last_open_shortCondition[1]) // Check if your last postion was a long or a short last_longCondition = na last_shortCondition = na last_longCondition := longCondition ? time : nz(last_longCondition[1]) last_shortCondition := shortCondition ? time : nz(last_shortCondition[1]) in_longCondition = last_longCondition > last_shortCondition in_shortCondition = last_shortCondition > last_longCondition // Take profit isTPl = input(false, "Take Profit Long") isTPs = input(false, "Take Profit Short") tpl = input(3, "Take Profit Long %", type=float) tps = input(30, "Take Profit Short %", type=float) long_tp = isTPl and crossover(high, (1+(tpl/100))*last_open_longCondition) and in_longCondition == 1 short_tp = isTPs and crossunder(low, (1-(tps/100))*last_open_shortCondition) and in_shortCondition == 1 // Stop Loss isSLl = input(false, "Stop Loss Long") isSLs = input(false, "Stop Loss Short") sl= 0.0 sl := input(3, "Stop Loss %", type=float) long_sl = isSLl and crossunder(low, (1-(sl/100))*last_open_longCondition) and longCondition == 0 and in_longCondition == 1 short_sl = isSLs and crossover(high, (1+(sl/100))*last_open_shortCondition) and shortCondition == 0 and in_shortCondition == 1 // Create a single close for all the different closing conditions. long_close = long_tp or long_sl ? 1 : 0 short_close = short_tp or short_sl ? 1 : 0 // Get the time of the last close last_long_close = na last_short_close = na last_long_close := long_close ? time : nz(last_long_close[1]) last_short_close := short_close ? time : nz(last_short_close[1]) // Strategy entries strategy.entry("long", strategy.long, when=longCondition == true, stop = open[1]) strategy.entry("short", strategy.short, when=shortCondition == true) strategy.close("long", when = long_sl or long_tp) strategy.close("short", when = short_sl or short_tp)