Sistema de avanço bidirecional entre linhas do tempo


Data de criação: 2023-11-22 15:22:49 última modificação: 2023-11-22 15:22:49
cópia: 0 Cliques: 566
1
focar em
1617
Seguidores

Sistema de avanço bidirecional entre linhas do tempo

Visão geral

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.

Princípio da estratégia

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.

Análise de vantagens

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:

  1. 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.

  2. 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.

  3. Uma relação de ordem de média móvel rigorosa serve como condição de filtragem, reduzindo a probabilidade de erro.

Análise de Riscos

Os principais riscos desta estratégia são:

  1. A própria média móvel é muito atrasada e pode perder a oportunidade de reverter a tendência a curto prazo.

  2. Os indicadores MACD são propensos a produzir falsos sinais, que necessitam de filtragem de preços.

  3. 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.

Direção de otimização

A estratégia pode ser melhorada em vários aspectos:

  1. 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.

  2. 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.

  3. 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.

  4. Testar diferentes relações de stop-loss para obter uma combinação de parâmetros de risco-retorno superior.

Resumir

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.

Código-fonte da estratégia
/*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)