
Trata-se de uma estratégia de negociação quantitativa que utiliza médias móveis e indicadores MACD para realizar operações de ruptura bidirecionais. Tem características de operação em vários eixos temporais, ou seja, determina a direção da tendência em períodos de tempo mais longos e busca a vantagem de oportunidades de entrada em períodos de tempo mais curtos.
A estratégia usa três médias SMMA de diferentes durações e uma média EMA para determinar a direção da tendência. Ao mesmo tempo, ela combina o indicador MACD para determinar a tendência de curto prazo e o momento de entrada. Concretamente, sua condição de compra é: o preço atravessa todas as médias e a curta é acionada quando está acima da média longa; e a condição de venda é o oposto, o preço atravessa todas as médias abaixo e a curta é acionada quando está abaixo da média longa.
Pode-se ver que a estratégia usa a média móvel para determinar a direção da tendência a médio e longo prazo, e o MACD para determinar a inversão a curto prazo para capturar o melhor momento de entrada. Esta operação conjunta de múltiplos eixos de tempo é uma característica importante da estratégia.
A vantagem deste tipo de operação de linha de tempo é que você pode escolher o ponto de entrada de reversão de curto prazo apropriado na direção da tendência de alta probabilidade, obtendo assim um melhor retorno de risco. Em particular, existem três vantagens principais:
Três linhas médias SMMA mais uma linha média EMA de múltiplos níveis de filtragem, pode determinar eficazmente a direção da tendência a médio e longo prazo, evitando a operação de contracorrente.
O indicador MACD determina a entrada de um ponto de inflexão de curto prazo, que permite obter um preço de entrada mais favorável.
Uma relação de ordem de média móvel rigorosa serve como condição de filtragem, reduzindo a probabilidade de erro.
Os principais riscos desta estratégia são:
A própria média móvel é muito atrasada e pode perder a oportunidade de reverter a tendência a curto prazo.
Os indicadores MACD são propensos a produzir falsos sinais, que necessitam de filtragem de preços.
O julgamento de múltiplos eixos de tempo aumenta a complexidade da estratégia e é propenso a falhas.
Para o risco 1 e risco 2, pode ser otimizado por uma redução apropriada do ciclo de linha média e do ciclo de sinal, respondendo rapidamente à reversão de tendências de curto prazo. Para o risco 3, é necessário testar a otimização para diferentes variedades e períodos, tornando os parâmetros da estratégia rigorosamente adaptados às características da variedade.
A estratégia pode ser melhorada em vários aspectos:
Optimizar os parâmetros das médias móveis e do MACD para que sejam mais adequados para diferentes períodos e variedades. Por exemplo, reduzir o comprimento da linha média, aumentar os parâmetros de sinal, etc.
Aumentar a estratégia de stop loss, usando o ATR ou outros indicadores para definir um stop loss móvel razoável. Isso pode melhorar significativamente o controle de risco da estratégia.
Buscar melhores indicadores ou formas de filtragem para substituir os sinais MACD. Por exemplo, introdução de indicadores de taxa de flutuação, filtragem de sinais, etc.
Testar diferentes relações de stop-loss para obter uma combinação de parâmetros de risco-retorno superior.
No geral, é um sistema de ruptura com uma visão única do eixo do tempo. Utiliza as vantagens das médias móveis e do MACD para implementar uma estratégia de operação de julgamento conjunto em vários períodos de tempo.
/*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)