Эта стратегия позволяет гибко конфигурировать несколько паров быстрых/медленных скользящих средних. Она длится долго, когда все быстрые МА пересекаются над медленными МА, и выходит, когда любой быстрый МА пересекается ниже медленного МА. Механизм голосования с несколькими МА направлен на формирование надежных решений по удержанию позиции.
Ключевыми компонентами и правилами являются:
Многократные быстрые/медленные МА: с использованием SMA, WMA, VWMA и т.д.
Длинный сигнал: все быстрые МА пересекают медленные МА.
Сигнал выхода: любое быстрое пересечение MA ниже медленного MA.
Прибыль/убыток: фиксированные показатели, основанные на ATR.
Конфигурируемая: гибкая конфигурация нескольких пар MA.
Вход на основе голосования с несколькими MAs улучшает надежность сигнала.
По сравнению с едиными стратегиями ОР, преимущества:
Многочисленные МА обеспечивают более полную оценку тенденций.
Голосование избегает ложных сигналов от шума.
Большое пространство для настройки из индивидуальных конфигураций MA.
Поддержка различных типов ОРУ повышает адаптивность.
Определенные контрольные точки прибыли/убытка по риску/вознаграждению сделки.
Работает лучше на более длинных временных отрезках, меньше кривых ударов.
Простая и интуитивно понятная логика, легкая в реализации и эксплуатации.
В целом более стабильный с большей продолжительностью жизни по сравнению с одним MA.
Однако существуют некоторые риски:
Повышенная сложность с несколькими МА.
Риски чрезмерной оптимизации.
Существенное отставание в определении изменений тенденций.
Без учета объема, рискуешь оказаться в ловушке.
Точки прибыли/убытка могут привести к ненужным выходам.
Результаты, зависящие от изменения рыночных режимов.
Необходимо следить за соотношением вознаграждения/риска и плавностью кривой.
Устойчивость на всех инструментах требует проверки.
На основе анализа улучшения могут включать:
Испытание прочности параметров на различных приборах.
Добавление подтверждения объема или волатильности.
Оптимизировать точки прибыли/убытка.
Установление максимально допустимого лимита использования.
Построение динамических моделей размеров позиций.
Оценка эффекта внедрения машинного обучения.
Мониторинг максимального снижения и плавности кривой.
Непрерывные итерации, чтобы избежать перенастройки.
Конфигурируемый подход Multi-MA формирует надежный механизм удержания позиции. Но предотвращение перенапряжения и динамическая адаптация к изменяющимся рынкам являются ключевыми для долговечности любой стратегии. Только посредством строгих постоянных оптимизаций и тестирования квантовая стратегия может поддерживать успех.
/*backtest start: 2022-09-16 00:00:00 end: 2023-09-22 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/ // © levieux //@version=5 strategy(title='Configurable Multi MA Crossover Voting System', shorttitle='Configurable Multi MA Crossover Voting System', initial_capital=1000, overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1) crossoverConfig= input.string(defval="2x4,3x5,4x6", title="Crossover Config") source= input.source(high) maType= input.string("WMA", title="Moving Average Type", options=["WMA","SMA","VWMA"]) atrPeriod= input(14, title="ATR Period") profitAtr = input(10, title="Profit ATR x") lossAtr = input(5, title="Loss ATR x") ma(src,length,type) => float ma = switch type "SMA" => ta.sma(src, length) "WMA" => ta.wma(src, length) "VWMA" => ta.vwma(src, length) crossoverGroups= str.split(crossoverConfig, ",") crossoverCount= array.size(crossoverGroups) crossovers= array.new_string(crossoverCount) positions= array.new_int(crossoverCount, 0) longVotes= 0 for i= 0 to crossoverCount-1 crossover= str.tostring(array.get(crossoverGroups, i)) crossoverBoundaries= str.split(crossover, "x") int fastLength= math.round(str.tonumber(array.get(crossoverBoundaries, 0))) int slowLength= math.round(str.tonumber(array.get(crossoverBoundaries, 1))) wmaFast= ma(source,fastLength,maType) wmaSlow= ma(source,slowLength,maType) if wmaFast>wmaSlow longVotes:= longVotes + 1 array.set(positions, i, 1) longCondition= longVotes==crossoverCount and strategy.position_size==0 //profitTicks = profitAtr*ta.atr(atrPeriod)/syminfo.mintick //lossTicks = lossAtr*ta.atr(atrPeriod)/syminfo.mintick profitPrice= close+profitAtr*ta.atr(atrPeriod) lossPrice= close-lossAtr*ta.atr(atrPeriod) if strategy.position_size>0 profitPrice:= profitPrice[1] lossPrice:= lossPrice[1] plot(profitPrice, color=color.green) plot(lossPrice, color=color.red) if longCondition and profitPrice>0 strategy.entry("Long", strategy.long) if longVotes<crossoverCount and strategy.position_size>0 and (high>profitPrice or low<lossPrice) strategy.close("Long") longVotes:= 0