
Это количественная торговая стратегия с использованием движущихся средних и MACD-индикаторов для совершения двухсторонних прорывных операций. Она имеет характерные черты работы через временные оси, то есть имеет преимущество в определении направления тенденции в более длительных временных периодах и поиске возможности для входа в более короткие временные периоды.
Стратегия использует средние линии SMMA с тремя различными продолжительностями и среднюю линию EMA для определения направления тренда. В то же время она использует MACD для определения краткосрочного тренда и времени входа в рынок. В частности, ее условия покупки заключаются в том, что цена проходит все средние линии, и короткая линия срабатывает, когда она находится над длинной средней линией; а условия продажи - наоборот, цена проходит все средние линии ниже, и короткая линия срабатывает, когда она находится ниже длинной средней линии.
Как видно, эта стратегия одновременно использует движущиеся средние для определения направления среднесрочной тенденции и MACD для определения краткосрочного разворота, чтобы захватить наиболее благоприятные моменты входа. Эта совместная работа с несколькими временными линиями является важной особенностью этой стратегии.
Преимущество такой операции на протяжении временной оси заключается в том, что можно выбрать подходящую кратковременную обратную точку входа в направлении тенденции с высокой вероятностью, что позволяет получить более высокую отдачу от риска. В частности, есть следующие 3 преимущества:
3 среднелинейных SMMA плюс 1 среднелинейная EMA многоуровневые фиксаторы позволяют эффективно определять направление среднесрочной и долгосрочной тенденции, избегая обратной операции.
Показатель MACD определяет кратковременную обратную точку входа, позволяющую получить более выгодную цену входа.
Строгие соотношения последовательности скользящих средних используются в качестве фильтрующих условий, что позволяет снизить вероятность ошибочных операций.
Основные риски этой стратегии заключаются в следующем:
Сам по себе движущийся средний является отсталым и может упустить возможность кратковременного изменения тенденции.
MACD-индикаторы подвержены ложным сигналам, которые требуют фильтрации цены.
Многоочередное решение увеличивает сложность стратегии, что может привести к провалу.
Для риска 1 и риска 2 можно оптимизировать с помощью соответствующего сокращения среднелинейных циклов и циклов сигнала, быстро реагируя на краткосрочное изменение тенденции. Для риска 3 необходимо провести оптимизационные тесты для разных сортов и циклов, чтобы параметры стратегии были строго адаптированы к особенностям этой разновидности.
Эта стратегия может быть оптимизирована в следующих аспектах:
Оптимизация параметров движущихся средних и MACD, чтобы они лучше всего соответствовали различным периодам и разновидностям. Например, сокращение длины средней линии, увеличение параметров Signal и т. Д.
Добавление стратегии стоп-ложа, использование ATR или других показателей для установки разумного мобильного стоп-ложа. Это может значительно улучшить контроль риска стратегии.
Поиск лучших показателей или способов фильтрации альтернативных сигналов MACD. Например, введение показателей частоты колебаний, фильтрация сигналов и т. Д.
Тестирование различных соотношений стоп-стоп-лосс для получения оптимального сочетания параметров риска и прибыли.
В целом, это прорывная система с уникальной кросс-временной логикой. Она одновременно использует преимущества движущихся средних и MACD, чтобы реализовать стратегию совместных операций по суждению в течение нескольких временных периодов.
/*backtest
start: 2023-10-22 00:00:00
end: 2023-11-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © SoftKill21
//@version=4
strategy("Koala Script",initial_capital=1000,
commission_type=strategy.commission.cash_per_contract,
commission_value=0.000065,
slippage=3)
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 = 2000, title = "From Year", minval = 1970)
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 8, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
len = input(3, minval=1, title="Length")
src = input(hl2, title="Source")
smma = 0.0
sma1 = sma(src, len)
smma := na(smma[1]) ? sma1 : (smma[1] * (len - 1) + src) / len
len2 = input(6, minval=1, title="Length")
src2 = input(hl2, title="Source")
smma2 = 0.0
sma2 = sma(src2, len2)
smma2 := na(smma2[1]) ? sma2 : (smma2[1] * (len2 - 1) + src2) / len2
len3 = input(9, minval=1, title="Length")
src3 = input(hl2, title="Source")
smma3 = 0.0
sma3 = sma(src3, len3)
smma3 := na(smma3[1]) ? sma3 : (smma3[1] * (len3 - 1) + src3) / len3
len4 = input(50, minval=1, title="Length")
src4 = input(close, title="Source")
smma4 = 0.0
sma4 = sma(src4, len4)
smma4 := na(smma4[1]) ? sma4 : (smma4[1] * (len4 - 1) + src4) / len4
len5 = input(200, minval=1, title="Length")
src5 = input(close, title="Source")
out5 = ema(src5, len5)
timeinrange(res, sess) => time(res, sess) != 0
london=timeinrange(timeframe.period, "0300-1045")
londonEntry=timeinrange(timeframe.period, "0300-0845")
time_cond = time >= startDate and time <= finishDate and londonEntry
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
srcc = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// Calculating
fast_ma = sma_source ? sma(srcc, fast_length) : ema(srcc, fast_length)
slow_ma = sma_source ? sma(srcc, slow_length) : ema(srcc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
longCond = close > out5 and close > smma4 and close > smma3 and close > smma2 and close > smma and londonEntry and smma > smma2 and smma2>smma3 and smma3>smma4 and smma4>out5
shortCond = close < out5 and close < smma4 and close < smma3 and close < smma2 and close < smma and londonEntry and smma < smma2 and smma2<smma3 and smma3<smma4 and smma4<out5
//longCond2 = crossover(close,out5) and crossover(close,smma4) and crossover(close,smma3) and crossover(close,smma2) and crossover(close,smma) and time_cond
//shortCond2 = crossunder(close,out5) and crossunder(close,smma4) and crossunder(close,smma3) and crossunder(close,smma2) and crossunder(close,smma) and time_cond
length=input(14, title="ATR Length")
mult=input(1.0, title="Percentage Multiplier (for ex., 0.7 = 70%)", step=0.1, minval=0.1, maxval=5.0)
oa=input(false, title="Show actual ATR")
ii=syminfo.pointvalue==0
s=ii?na:oa?atr(length):(syminfo.pointvalue * mult * atr(length))
tp=input(300,title="tp")
sl=input(300,title="sl")
//tp = s*10000
//sl= s*10000
//if(tp>300)
// tp:=300
//if(sl>300)
// sl:=300
//if(sl<150)
// sl:=150
//if(tp<150)
// tp:=150
strategy.initial_capital = 50000
//MONEY MANAGEMENT--------------------------------------------------------------''
balance = strategy.netprofit + strategy.initial_capital //current balance
floating = strategy.openprofit //floating profit/loss
risk = input(3,type=input.float,title="Risk %")/100 //risk % per trade
//Calculate the size of the next trade
temp01 = balance * risk //Risk in USD
temp02 = temp01/sl //Risk in lots
temp03 = temp02*100000 //Convert to contracts
size = temp03 - temp03%1000 //Normalize to 1000s (Trade size)
if(size < 10000)
size := 10000 //Set min. lot size
strategy.entry("long",1,when=longCond )
strategy.exit("closelong","long", profit=tp,loss=sl)
//strategy.close("long",when= crossunder(close[4],smma4) and close[4] > close[3] and close[3]>close[2] and close[2] > close[1] and close[1] > close)
strategy.entry("short",0,when=shortCond )
strategy.exit("closeshort","short", profit=tp,loss=sl)
//strategy.close("short",when= crossover(close[4],smma4) and close[4] < close[3] and close[3]< close[2] and close[2] < close[1] and close[1] < close)
strategy.close_all(when = not london)
maxEntry=input(2,title="max entries")
// strategy.risk.max_intraday_filled_orders(maxEntry)