Эта стратегия представляет собой высокопроизводительную алгоритмическую торговую стратегию, основанную на количественных моделях. Она использует модель объема Modelius в качестве базовой модели и далее расширяет и оптимизирует ее. Эта стратегия может захватить количественные торговые возможности на рынке и достигать устойчивой прибыли.
Ядром этой стратегии является модель объема Моделиуса. Эта модель идентифицирует количественные торговые возможности на рынке путем обнаружения изменений цен и объема. В частности, стратегия сочетает в себе ценовую цену закрытия, открытую цену, самую высокую цену, самую низкую цену для расчета направления текущей K-линии на основе определенных правил. Когда направление K-линии меняется, качество количественной торговой возможности оценивается на основе объема торговли. Кроме того, стратегия также сочетает в себе индикатор SAR и индикатор скользящей средней, чтобы помочь определить сроки входа и выхода.
Основная логика торговли заключается в том, чтобы пойти длинным, когда индикатор прорывается от отрицательного к положительному, и идти коротким, когда индикатор прорывается от положительного к отрицательному.
Самое большое преимущество этой стратегии заключается в том, что модель объема Моделиуса может эффективно идентифицировать количественные торговые возможности. По сравнению с традиционными техническими индикаторами эта модель уделяет больше внимания изменениям объема, что очень практично в современной высокочастотной количественной торговле. Кроме того, правила входа в стратегию относительно строгие, что может эффективно избежать упущенных количественных торговых возможностей при максимальном снижении вероятности беспорядка.
Основной риск этой стратегии заключается в том, что сама модель объема Modelius не может полностью избежать шума. Когда происходит аномальное колебание рынка, это приведет к неправильным торговым сигналам. Кроме того, параметры в стратегии также повлияют на конечные результаты.
Чтобы контролировать риски, параметры могут быть соответствующим образом скорректированы и объединены с другими показателями для вспомогательной оценки.
Есть еще место для оптимизации этой стратегии. Например, алгоритмы машинного обучения могут рассматриваться для динамической оптимизации настроек параметров. Или комбинировать анализ настроений и другие индикаторы для улучшения точности принятия решений. Кроме того, можно изучить корреляцию между различными сортами для создания модели арбитража с несколькими сортами.
Подводя итог, эта стратегия использует преимущества количественной модели объема Modelius и разрабатывает набор алгоритмических торговых стратегий с высокой оперативностью.
/*backtest start: 2022-12-15 00:00:00 end: 2023-12-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title="strategy modelius volume model ", shorttitle="mvm",overlay=true, calc_on_order_fills=true, default_qty_type=strategy.percent_of_equity, default_qty_value=50, overlay=false) method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method") methodvalue = input(defval=14.0, type=float, minval=0, title="Value") pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source") useClose = pricesource == "Close" useOpenClose = pricesource == "Open / Close" or useClose useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume") isOscillating=input(defval=true, type=bool, title="Oscillating") normalize=input(defval=false, type=bool, title="Normalize") vol = useTrueRange == "Always" or (useTrueRange == "Auto" and na(volume))? tr : volume op = useClose ? close : open hi = useOpenClose ? close >= op ? close : op : high lo = useOpenClose ? close <= op ? close : op : low if method == "ATR" methodvalue := atr(round(methodvalue)) if method == "Part of Price" methodvalue := close/methodvalue currclose = na prevclose = nz(currclose[1]) prevhigh = prevclose + methodvalue prevlow = prevclose - methodvalue currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose direction = na direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1]) directionHasChanged = change(direction) != 0 directionIsUp = direction > 0 directionIsDown = direction < 0 barcount = 1 barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount vol := not directionHasChanged ? vol[1] + vol : vol res = barcount > 1 ? vol/barcount : vol x=isOscillating and directionIsDown ? -res : res TP = input(0) * 10 SL = input(0) * 10 TS = input(1) * 10 TO = input(3) * 10 CQ = 100 TPP = (TP > 0) ? TP : na SLP = (SL > 0) ? SL : na TSP = (TS > 0) ? TS : na TOP = (TO > 0) ? TO : na longCondition = crossover(x,0) if (longCondition) strategy.entry("Long", strategy.long) shortCondition = crossunder(x,0) if (shortCondition) strategy.entry("Short", strategy.short) strategy.exit("Close Short", "Short", qty_percent=CQ, profit=TPP, loss=SLP, trail_points=TSP, trail_offset=TOP) strategy.exit("Close Long", "Long", qty_percent=CQ, profit=TPP, loss=SLP, trail_points=TSP, trail_offset=TOP)