Estratégia de negociação de ordens de limite multi-MA

Autora:ChaoZhang, Data: 22 de Fevereiro de 2023 14:16:20
Tags:

Resumo

Esta é uma estratégia de negociação que define ordens de limite baseadas em múltiplas médias móveis. Esta irá definir diferentes números de ordens de limite longas ou curtas quando o preço atravessa diferentes níveis de MA, formando uma multi-posição em forma de pirâmide. Quando o preço atravessa o MA novamente, as ordens de limite reverso serão abertas. Ao manter posições, as posições serão fechadas por ordens de mercado reverso se o preço quebrar o MA médio.

Estratégia lógica

A estratégia usa médias móveis para determinar a direção da tendência. Especificamente, determina o número de ordens de limite longo com base em se o preço quebra as 3 linhas MA para cima. E determina o número de ordens de limite curto com base em se o preço quebra as 3 linhas MA para baixo.

Assim, quanto mais forte a tendência, mais ordens de limite da mesma direção serão definidas.

Toda a estratégia combina abertura de estilo pirâmide com fechamento de estilo avanço para formar a lógica de negociação.

Análise das vantagens

As vantagens desta estratégia incluem:

  1. Usando MAs para determinar tendências, simples e intuitivo de operar.

  2. A abertura em estilo pirâmide pode obter melhores preços médios no estágio inicial das tendências.

  3. O MA stop loss médio pode parar as perdas e controlar os riscos em tempo útil.

  4. Limitar ordens evitar deslizamentos.

  5. Os parâmetros personalizáveis adaptam-se aos diferentes produtos.

  6. Estrutura clara, fácil de compreender e ampliar.

Análise de riscos

Os riscos da estratégia incluem:

  1. O atraso da MA pode causar erros de apreciação.

  2. As ordens limitadas podem perder as oportunidades de entrada.

  3. A média da perda de parada de MA pode ser demasiado bruta para julgar avanços.

  4. A configuração incorreta dos parâmetros pode resultar em posições demasiado grandes.

  5. O período de ensaio posterior insuficiente pode causar sobreajuste.

  6. Sem consideração dos custos de transacção.

As soluções são:

  1. Adicionar outros indicadores para confirmação, otimizar parâmetros.

  2. Definir o prazo de validade, ajustar os preços limite.

  3. Adicionar a tomada de lucro ou lógica no meio do MA stop loss.

  4. Otimizar parâmetros, avaliar relações risco-recompensa.

  5. Expandir o período de backtest, backtests em vários mercados.

  6. Adicione custos de transação e lógica de deslizamento.

Orientações de otimização

A estratégia pode ser otimizada nos seguintes aspectos:

  1. Otimizar parâmetros para mais produtos, utilizando métodos de aprendizagem de máquina.

  2. Adicionar outros indicadores de confirmação, por exemplo MACD, KDJ, etc.

  3. Adicionar lucro tomando lógica no meio da linha MA.

  4. Ajustar dinamicamente os tamanhos das posições e os níveis de stop loss.

  5. Otimizar os preços-limite para melhores custos de entrada, por exemplo com base na volatilidade.

  6. Gerenciar os custos para evitar tendências excessivas.

  7. Testar parâmetros em diferentes produtos para criar conjuntos de parâmetros.

Conclusão

Esta estratégia abre posições em forma de pirâmide com ordens de limite para alcançar melhores custos médios. Ele usa o MA médio para stop loss para controlar riscos. A estrutura da estratégia é simples e clara, fácil de entender e estender. Mas pode ser melhorada introduzindo outros indicadores, otimizando parâmetros, melhorando a lógica de ordem de limite, etc. para torná-la mais robusta.


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

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", 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
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//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 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close
longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close
shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close
shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close

//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]
lots = 0.0
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)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Mais.