Robot White Box Iceberg Estratégia

Autora:ChaoZhang, Data: 23 de janeiro de 2021
Tags:

Resumo

Esta estratégia baseia-se na negociação de média móvel. Esta configura três níveis de linhas de entrada longas e curtas para implementar posições de abertura bidirecionais, pertencentes à estratégia de tendência seguinte. Quando o preço atravessa a média móvel, a estratégia abre posições longas e curtas em lotes, colocando ordens pendentes.

Estratégia lógica

A estratégia usa principalmente a ruptura da média móvel para determinar a direção da tendência. Especificamente, calcula a média aritmética do preço de abertura, preço de fechamento, preço mais alto, preço mais baixo e assim por diante para obter um indicador de média móvel. Em seguida, define linhas de entrada longas acima da média móvel e linhas de entrada curtas abaixo dela. Quando o preço atravessa a média móvel de baixo, as ordens longas são desencadeadas uma a uma. Quando o preço atravessa de cima, as ordens curtas são desencadeadas uma a uma.

O número de ordens longas e curtas aumenta progressivamente. Ao definir ordens pendentes, implementa posições de abertura de lotes. Por exemplo, a linha de entrada 1 desencadeia a abertura de 1 contrato longo / curto, a linha de entrada 2 desencadeia a adição de 1 contrato e a linha de entrada 3 adiciona outro contrato. Isso ajuda a diversificar o custo de entrada e reduzir o risco de uma única ordem.

A estratégia também possui um mecanismo de hedge. Quando o tamanho da posição não é 0, ela irá definir uma ordem de stop loss baseada no preço médio móvel. Se o preço atravessar a média móvel novamente, ela fechará a posição para bloquear lucros parciais e proteger o capital.

Em resumo, esta estratégia faz pleno uso do indicador de média móvel para determinar a direção da tendência, maximiza a faixa de lucro através de várias linhas de entrada e controla os riscos com ordens de stop loss.

Análise das vantagens

As vantagens desta estratégia são as seguintes:

  1. Usar a média móvel para determinar a direção da tendência é claro e viável.

  2. Com várias linhas de entrada, ele pode capturar toda a faixa de corrida da tendência tanto quanto possível e expandir o espaço de lucro.

  3. A abertura de posições em lotes reduz o risco de uma única ordem, enquanto a entrada no mercado em múltiplas vezes diversifica os riscos das ordens e reduz o custo médio de detenção.

  4. O mecanismo de stop loss de hedging controla efetivamente os riscos. A ordem de stop loss de hedging realiza uma perda rápida quando o preço quebra a média móvel novamente, evitando grandes perdas.

  5. A lógica da estratégia é clara e fácil de entender, com configurações de parâmetros flexíveis que podem ser otimizadas para diferentes mercados.

Análise de riscos

Há alguns riscos nesta estratégia:

  1. A probabilidade de sinais errados da média móvel.

  2. A estratégia assume uma tendência, por isso as inversões de tendência podem levar a perdas enormes.

  3. As linhas de entrada demasiado frequentes aumentam a frequência de negociação e os custos de deslizamento.

  4. As posições de abertura de lotes aumentam o risco de concentração quando o tamanho da posição é demasiado grande.

  5. A configuração incorreta do ponto de stop loss pode conduzir a uma stop loss prematura ou a um ponto de stop loss demasiado pequeno.

Medidas de gestão de riscos correspondentes:

  1. Otimizar os parâmetros da média móvel e selecionar os períodos adequados.

  2. Preste atenção aos principais indicadores técnicos para detectar sinais de reversão da tendência e parar a perda a tempo.

  3. Ajustar a distância entre as linhas de entrada para diminuir a frequência de negociação.

  4. Otimizar o dimensionamento e a proporção da posição para controlar o risco de concentração.

  5. Testar e otimizar pontos de stop loss para reduzir o risco de stop loss.

Orientações de otimização

A estratégia pode ser otimizada a partir dos seguintes aspectos:

  1. Teste diferentes parâmetros e fontes de dados da média móvel para encontrar o indicador da média móvel com melhor desempenho para determinar tendências.

  2. Otimizar a proporção de distância entre intervalos e tamanho da posição de linhas de entrada longas e curtas para encontrar os parâmetros ideais.

  3. Adicionar outros indicadores como condições de filtro para evitar sinais errados da média móvel, como MACD, RSI, etc.

  4. Otimizar a posição da linha de stop loss, ou definir pontos de stop loss dinamicamente com base no ATR.

  5. Adicionar juízo de inversão de tendência para definir todas as condições de fechamento de posições.

  6. Otimizar os parâmetros para diferentes períodos de mercado.

  7. Adicionar ajuste dinâmico do tamanho da posição com base na percentagem de utilização da conta.

Resumo

Esta estratégia julga a direção da tendência principalmente com base em médias móveis, e aproveita as corridas de tendência como fonte de lucro. Usando várias linhas de entrada e abertura de posições em lotes, pode efetivamente capturar tendências e expandir as zonas de lucro. Ao mesmo tempo, mecanismos de stop loss são usados para controlar riscos. A lógica da estratégia é simples e clara, adequada para iniciantes aprenderem e também para otimização profunda.


/*backtest
start: 2022-09-19 00:00:00
end: 2023-09-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox Iceberg", shorttitle = "Robot WhiteBox Iceberg", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Variables
lots = 0.0
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = true

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = 0.0
longline2 = 0.0
longline3 = 0.0
shortline1 = 0.0
shortline2 = 0.0
shortline3 = 0.0
longline1 := long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 := lots[1] == 0 ? long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close : longline2[1]
longline3 := lots[1] == 0 ? long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close : longline3[1]
shortline1 := short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 := lots[1] == 0 ? short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close : shortline2[1]
shortline3 := lots[1] == 0 ? short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close : shortline3[1]

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma, when = needtime)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma, when = needtime)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("L1")
    strategy.cancel("L2")
    strategy.cancel("L3")
    strategy.cancel("S1")
    strategy.cancel("S2")
    strategy.cancel("S3")
    strategy.cancel("TPL")
    strategy.cancel("TPS")

Mais.