Estratégia de negociação cruzada de preço alto com suporte aberto


Data de criação: 2023-10-18 11:22:57 última modificação: 2023-10-18 11:22:57
cópia: 1 Cliques: 633
1
focar em
1617
Seguidores

Estratégia de negociação cruzada de preço alto com suporte aberto

Visão geral

A estratégia baseia-se no cruzamento de preços de abertura e preços de alta para determinar os sinais de negociação. Fazer mais quando o preço de abertura é alto e fechar quando o preço de abertura é baixo. Usar médias móveis para suavizar os dados de preços, reduzir o ruído de negociação.

Princípio da estratégia

  1. Determine se a resolução de ciclo alternativo é usada com base nos parâmetros de entrada ((useRes) 。 Se for usado, defina o ciclo com base no stratRes 。

  2. De acordo com os parâmetros de entrada, decida se usa ou não uma média móvel ((useMA) ). Se for usado, selecione o tipo de média móvel de acordo com o baseType, baseLen define o comprimento do período .

  3. Obtenha uma série de dados de preços de abertura e de fechamento. Se usar uma média móvel, aplique o tipo de média móvel e o processamento de parâmetros selecionados.

  4. Comparando o preço de abertura atual x com o preço de abertura da série openSeries. Se x for maior do que o openSeries, o estado de tendência é o estado de tendência, caso contrário, é o estado de tendência.

  5. Quando o preço de abertura está acima da média móvel de abertura, um sinal de longCond é gerado. Quando o preço de abertura está abaixo da média móvel de abertura, um sinal de shortCond é gerado.

  6. Se o stop loss de rastreamento estiver ativado, configure o ponto de parada e a distância de desvio.

Vantagens estratégicas

  1. Usando duas séries diferentes de preços de abertura e preços de alta para julgar os sinais de negociação, evitando a limitação de uma única série de dados.

  2. A aplicação da tecnologia da média móvel filtra o ruído do mercado de curto prazo e bloqueia as principais tendências.

  3. Tipo de média móvel pode ser configurado de forma flexível, ajustando os parâmetros para o melhor efeito.

  4. Pode optar por usar o tracking stop para controlar o risco e bloquear os lucros.

  5. Há muito espaço para otimizar a estratégia, com ajustes de parâmetros para diferentes variedades e ambientes de mercado.

Risco estratégico

  1. Uma única fonte de sinais de transação, sinais escassos, fácil de perder.

  2. As médias móveis estão atrasadas e podem perder oportunidades de curto prazo.

  3. A configuração incorreta de stop loss pode parar prematuramente ou com uma perda muito grande.

  4. A configuração inadequada dos parâmetros pode causar transações virtuais com muita frequência e afetar o desempenho do disco.

  5. Diferentes variedades e ambientes de mercado exigem ajustes de parâmetros e dificuldades de otimização.

  6. Pode-se enriquecer a fonte de sinal adicionando outros indicadores de julgamento ou introduzindo modelos de aprendizagem de máquina. Ajustar o tipo de média móvel e os parâmetros para obter o melhor efeito de smoothing. Configurar cuidadosamente o ponto de parada e a flexibilidade apropriada para obter mais lucro.

Direção de otimização da estratégia

  1. A adição de outros indicadores tecnológicos, como Brinband, KD, etc., enriquece os sinais de negociação.

  2. Aplicação de modelos de aprendizagem de máquina para processamento de sinais de julgamento.

  3. Optimizar os parâmetros da média móvel para encontrar a melhor combinação de parâmetros.

  4. Optimizar o rastreamento de parâmetros de stop loss, equilibrando a amplitude de stop loss e a captação de lucro.

  5. Adição de função de otimização de parâmetros, para encontrar automaticamente os parâmetros mais ótimos.

  6. Desenvolvimento de modelos de parâmetros exclusivos para diferentes variedades.

  7. Desenvolvimento de uma estrutura de feedback quantitativo e estratégias de repetição rápida.

Resumir

A estratégia baseia-se em um cruzamento de preços e preços altos para julgar sinais de negociação, usando a tecnologia de média móvel para filtrar o ruído. Pode configurar os parâmetros de forma flexível e obter vários efeitos. Tem certas vantagens, mas também tem alguns problemas, como poucos sinais, atraso, etc.

Código-fonte da estratégia
/*backtest
start: 2022-10-17 00:00:00
end: 2023-10-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

//strategy(title = "Open Close Cross Strategy", shorttitle = "OCC Strategy", overlay = true, pyramiding = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 10)

// Revision:        1
// Author:          @JayRogers
//
// Description:
//  - Strategy based around Open-Close Crossovers.
// Setup:
//  - I have generally found that setting the strategy resolution to 3-4x that of the chart you are viewing
//    tends to yield the best results, regardless of which MA option you may choose (if any)
//  - Don't aim for perfection. Just aim to get a reasonably snug fit with the O-C band, with good runs of
//    green and red.
//  - Option to either use basic open and close series data, or pick your poison with a wide array of MA types.
//  - Optional trailing stop for damage mitigation if desired (can be toggled on/off)
//  - Positions get taken automagically following a crossover - which is why it's better to set the resolution
//    of the script greater than that of your chart, so that the trades get taken sooner rather than later.
//  - If you make use of the trailing stops, be sure to take your time tweaking the values. Cutting it too fine
//    will cost you profits but keep you safer, while letting them loose could lead to more drawdown than you
//    can handle.

// === INPUTS ===
useRes      = input(defval = true, title = "Use Alternate Resolution? ( recommended )")
stratRes    = input(defval = "120", title = "Set Resolution ( should not be lower than chart )")
useMA       = input(defval = true, title = "Use MA? ( otherwise use simple Open/Close data )")
basisType   = input(defval = "DEMA", title = "MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA, SMMA, HullMA, LSMA, ALMA ( case sensitive )")
basisLen    = input(defval = 14, title = "MA Period", minval = 1)
offsetSigma = input(defval = 6, title = "Offset for LSMA / Sigma for ALMA", minval = 0)
offsetALMA  = input(defval = 0.85, title = "Offset for ALMA", minval = 0, step = 0.01)
useStop     = input(defval = true, title = "Use Trailing Stop?")
slPoints    = input(defval = 200, title = "Stop Loss Trail Points", minval = 1)
slOffset    = input(defval = 400, title = "Stop Loss Trail Offset", minval = 1)
// === /INPUTS ===

// === BASE FUNCTIONS ===
// Returns MA input selection variant, default to SMA if blank or typo.
variant(type, src, len, offSig, offALMA) =>
    v1 = sma(src, len)                                                  // Simple
    v2 = ema(src, len)                                                  // Exponential
    v3 = 2 * v2 - ema(v2, len)                                          // Double Exponential
    v4 = 3 * (v2 - ema(v2, len)) + ema(ema(v2, len), len)               // Triple Exponential
    v5 = wma(src, len)                                                  // Weighted
    v6 = vwma(src, len)                                                 // Volume Weighted
    v7 = na(v5[1]) ? sma(src, len) : (v5[1] * (len - 1) + src) / len    // Smoothed
    v8 = wma(2 * wma(src, len / 2) - wma(src, len), round(sqrt(len)))   // Hull
    v9 = linreg(src, len, offSig)                                       // Least Squares
    v10 = alma(src, len, offALMA, offSig)                               // Arnaud Legoux
    type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 : type=="SMMA"?v7 : type=="HullMA"?v8 : type=="LSMA"?v9 : type=="ALMA"?v10 : v1
// security wrapper for repeat calls
reso(exp, use, res) => use ? request.security(syminfo.tickerid, res, exp) : exp
// === /BASE FUNCTIONS ===

// === SERIES SETUP ===
// open/close
//closeSeries = useMA ? reso(variant(basisType, close, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(close, useRes, stratRes)
openSeries  = useMA ? reso(variant(basisType, open, basisLen, offsetSigma, offsetALMA), useRes, stratRes) : reso(open, useRes, stratRes)
x = openSeries[1]
trendState  = x > openSeries ? true : x < openSeries ? false : trendState[1]
// === /SERIES ===

// === PLOTTING ===
barcolor(color = x > openSeries ? #006600 : #990000, title = "Bar Colours")
// channel outline
closePlot   = plot(x, title = "Close Line", color = #009900, linewidth = 2, style = line, transp = 90)
openPlot    = plot(openSeries, title = "Open Line", color = #CC0000, linewidth = 2, style = line, transp = 90)
// channel fill
closePlotU  = plot(trendState ? x : na, transp = 100, editable = false)
openPlotU   = plot(trendState ? openSeries : na, transp = 100, editable = false)
closePlotD  = plot(trendState ? na : x, transp = 100, editable = false)
openPlotD   = plot(trendState ? na : openSeries, transp = 100, editable = false)
fill(openPlotU, closePlotU, title = "Up Trend Fill", color = #009900, transp = 40)
fill(openPlotD, closePlotD, title = "Down Trend Fill", color = #CC0000, transp = 40)
// === /PLOTTING ===

// === STRATEGY ===
// conditions
longCond    = crossover(openSeries, x)
shortCond   = crossunder(openSeries, x)
// entries and base exit
strategy.entry("long", true, when = longCond)
strategy.entry("short", false, when = shortCond)
// if we're using the trailing stop
//if (useStop)
//    strategy.exit("XL", from_entry = "long", trail_points = slPoints, trail_offset = slOffset)
//    strategy.exit("XS", from_entry = "short", trail_points = slPoints, trail_offset = slOffset)
// not sure needed, but just incase..
//strategy.exit("XL", from_entry = "long", when = shortCond)
//strategy.exit("XS", from_entry = "short", when = longCond)
// === /STRATEGY ===