A estratégia de dupla EMA equilátera é do YouTube.

Autora:Sonhos pequenos, Criado: 2022-10-09 15:56:22, Atualizado: 2023-09-15 20:50:38

img

A estratégia de dupla EMA equilátera é do YouTube.

Nesta edição, vamos explorar uma "estratégia de dupla EMA equilátera mágica" do YouTube, chamada de "estratégia de assassinato de mercado de ações e criptomoedas". Eu vi o vídeo e descobri que a estratégia é uma estratégia em linguagem pine para o trading view, usando dois indicadores de trading view.

Indicadores usados pela estratégia

Indicador EMA

Para simplificar o design, nós não usamos o Moving Average Exponential listado no vídeo. Nós usamos o ta.ema embutido no trading view em vez disso.

2o Índice de Swing Free do VuManChu

Este é um indicador no Trading View e precisamos de ir para o Trading View e baixar o código fonte.

img

O código VuManChu Swing Free:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")

Lógica estratégica

Indicadores EMA: estratégia que usa dois EMAs, um rápido (parâmetros de ciclo pequeno) e um lento (parâmetros de ciclo grande). O papel dos EMAs duplos é principalmente ajudar a determinar a direção da tendência do mercado.

  • Multiplas linhas A linha rápida está acima da linha lenta.

  • Lista de cabeças vazias A linha rápida está abaixo da linha lenta.

Indicador VuManChu Swing Free: O indicador VuManChu Swing Free é usado para emitir sinais e, em combinação com outras condições, determinar se uma transação é ou não executada.

Agora vamos falar sobre as condições estratégicas específicas para o desencadeamento de sinais de negociação:

1° Regra para entrar em múltiplos: O preço de fechamento da linha K deve estar acima da linha rápida da EMA, as duas linhas médias da EMA devem apresentar uma ordem de múltiplos cabeças (a linha rápida acima da linha lenta) e o indicador VuManChu Swing Free deve apresentar um sinal de compra (a condição longa é verdadeira). Três condições são estabelecidas: a linha K é a linha K chave para fazer muitas entradas, e o preço de fechamento da linha K é a posição de entrada.

2, a regra para entrar em branco (o contrário de plural): O preço de fechamento da linha K deve estar abaixo da linha rápida da EMA, as duas linhas médias da EMA devem apresentar uma linha de cabeças vazias (linha rápida abaixo da linha lenta) e o indicador VuManChu Swing Free deve apresentar um sinal de venda (conditionada para ser verdadeira).

A lógica de negociação não é muito simples, uma vez que não há nenhuma explicação específica sobre o stop loss no vídeo, o editor pode usar um método de stop loss comparativo, usando um número fixo de pontos de stop loss e rastreamento de stop loss.

Design de código

O código do indicador VuManChu Swing Free, que colocamos diretamente no nosso código de estratégia.

img

Depois, nós escrevemos um código em Pine para implementar a função de transação:

// extend
fastEmaPeriod = input(50, "fastEmaPeriod")         // 快线周期
slowEmaPeriod = input(200, "slowEmaPeriod")        // 慢线周期
loss = input(30, "loss")                           // 止损点数
trailPoints = input(30, "trailPoints")             // 移动止盈触发点数
trailOffset = input(30, "trailOffset")             // 移动止盈偏移量(点数)
amount = input(1, "amount")                        // 下单量

emaFast = ta.ema(close, fastEmaPeriod)             // 计算快线EMA
emaSlow = ta.ema(close, slowEmaPeriod)             // 计算慢线EMA

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast         // 做多入场条件
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast       // 做空入场条件

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

A.可以看到,当buyCondition为真时即:

1, a variável de condição longa é verdadeira (o indicador VuManChu Swing Free emite mais sinais). 2, emaFast > emaSlow (EMA com várias cabeçalhas). 3, close > open (indica que o BAR atual é a linha do sol) e close > emaFast (indica que o preço de fechamento está acima da linha rápida da EMA).

A maioria das pessoas não sabe o que fazer.

B.当sellCondition为真时,则做空的三个条件成立(这里不再赘述)。

Em seguida, no caso de um sinal de determinação de condição se for desencadeado, use a função estrategy.entry para entrar no mercado e configure a função estrategy.exit para parar o prejuízo.

Código completo

/*backtest
start: 2022-01-01 00:00:00
end: 2022-10-08 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
args: [["ZPrecision",0,358374]]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=4
study(title="Range Filter - B&S Signals", shorttitle="RF - B&S Signals", overlay=true)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Size Function
rng_size(x, qty, n)=> 
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper      = (n*2) - 1
    avrng     = ema(abs(x - x[1]), n)
    AC = ema(avrng, wper)*qty
    rng_size = AC

//Range Filter Function
rng_filt(x, rng_, n)=>
    r          = rng_
    var rfilt  = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)
    
    hi_band   = rng_filt1 + r
    lo_band   = rng_filt1 - r
    rng_filt  = rng_filt1
    [hi_band, lo_band, rng_filt]
 
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, type=input.source, title="Swing Source")

//Range Period
rng_per = input(defval=20, minval=1, title="Swing Period")

//Range Size Inputs
rng_qty   = input(defval=3.5, minval=0.0000001, title="Swing Multiplier")

//Bar Colors
use_barcolor = input(defval=false, type=input.bool, title="Bar Colors On/Off")

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir    := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward   = fdir==1 ? 1 : 0
downward = fdir==-1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0 
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color  = upward and (rng_src > filt) ? (rng_src > rng_src[1] ? #05ff9b : #00b36b) :
             downward and (rng_src < filt) ? (rng_src < rng_src[1] ? #ff0583 : #b8005d) : #cccccc

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Filter Plot
filt_plot = plot(filt, color=filt_color, transp=67, linewidth=3, title="Filter")

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title="High Band")
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title="Low Band")

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title="High Band Fill")
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title="Low Band Fill")

//Bar Color
barcolor(use_barcolor ? bar_color : na)

//Plot Buy and Sell Labels
plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0))
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title="Buy Alert", message = "BUY")
alertcondition(shortCondition, title="Sell Alert", message = "SELL")


// extend
fastEmaPeriod = input(50, "fastEmaPeriod")
slowEmaPeriod = input(200, "slowEmaPeriod")
loss = input(30, "loss")
trailPoints = input(30, "trailPoints")
trailOffset = input(30, "trailOffset")
amount = input(1, "amount")

emaFast = ta.ema(close, fastEmaPeriod)
emaSlow = ta.ema(close, slowEmaPeriod)

buyCondition = longCondition and emaFast > emaSlow and close > open and close > emaFast
sellCondition = shortCondition and emaFast < emaSlow and close < open and close < emaFast

if buyCondition and strategy.position_size == 0
    strategy.entry("long", strategy.long, amount)
    strategy.exit("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)
if sellCondition and strategy.position_size == 0
    strategy.entry("short", strategy.short, amount)
    strategy.exit("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset)

Testes de repetição

O período de tempo para testes de retorno foi escolhido de janeiro de 2022 a outubro de 2022, com um ciclo de linha K de 15 minutos, usando o modelo de retorno de preço de fechamento. O mercado escolheu o contrato perpétuo ETH_USDT da Binance. Os parâmetros foram definidos de acordo com os parâmetros do vídeo de saída: linha rápida de 50 ciclos, linha lenta de 200 ciclos, outros parâmetros não mudam por padrão.

img

img

Os resultados de retrospecção mostram que estes parâmetros têm alguma influência nos resultados de retrospecção. A sensação é que este aspecto também precisa de ser otimizado no design. No entanto, os sinais estratégicos podem desencadear a taxa de vitória após a negociação.

O Bitcoin é um instrumento de negociação de longo prazo que permite a troca de um contrato perpétuo com BTC_USDT para tentar:

img

O resultado foi explosivo no BTC:

img

img

A estratégia é endereçada:https://www.fmz.com/strategy/385745

Parece que este método de negociação é mais confiável para a captura da tendência, e pode continuar a otimizar o design com base nessa idéia. Neste artigo, nós não só entendemos a idéia de uma estratégia de dupla linha uniforme, mas também aprendemos como usar a estratégia do deus do petróleo para processar e aprender.


Relacionados

Mais.

fantadongE se essa estratégia também fosse um parâmetro de um eixo?

Hyc1743Dream Big, porque é que o sinal está no ícone, mas o disco não está aberto? /upload/asset/23cc031609caa7a896da3.jpg /upload/asset/23cae1c5d5b26ec763ea6.jpg /upload/asset/23d49ff4aec3475793e5e.jpg

Nuvens levesMin Da, recomendou encontrar dois ou três estratégias representativas do tubo de petróleo, de maior dificuldade de reescrever, funções, parâmetros e maneiras de operação mais complexas, para fazer vários tutoriais em versões de texto, como um tutorial semelhante ao de linhas. Agora, com esta estratégia de dupla linha uniforme, eu aprendi a alterar algumas estratégias de combinação não muito complexas, mudando uma dúzia de estratégias de combinação, uma ou duas delas são realmente 21 anos 22 anos de dados de retrospecção de resultados muito bons, e já foram testados em disco real, mas encontrou função complexa de parâmetros de operação como o aconselhamento: line: 62 Could not find function or function reference 'line.delete', mas no documento FMZ PINE Script não encontrou a explicação relacionada com line.delete. O que você está fazendo é errado.

O HagoO tempo escolhido: 21 de abril a 10 de outubro, o BTC é pior

yingjunSe você não sabe o que isso significa, por exemplo, o padrão de 30 significa que o BTC caiu 30 metros?

Nuvens levesMin Da, por favor, o PINE pode escrever um método de bloqueio um pouco mais complexo? Por exemplo, um bloqueio por camadas? Se o PINE pode ser combinado com o JS, por exemplo, escrever indicadores no PINE e escrever transações no JS é mais conveniente.

yingjunO disco real terá erros em 2022

FmzeroA estratégia de conservação sugere que é uma brincadeira. REST: sql: no rows in result set

FmzeroO sonho é o mesmo.

Sonhos pequenosA estratégia de tendências é simplesmente: "Ah, sim, o mercado tem tendências no futuro, senão é uma estratégia de choque".

Sonhos pequenosNão é cortês.

Hyc1743Obrigada ao Dream Big.

Sonhos pequenosBom dia, isso porque a marca BUY mostrada no gráfico é apenas um sinal de indicadores do artigo, com uma linha uniforme por trás. Não. //Plot Buy and Sell Etiquetas plotshape ((longCondition, title = "Buy Signal", text ="BUY", textcolor = color.white, style=shape.labelup, size = size.normal, location=location.belowbar, color = color.new(color.green, 0)) plotshape ((shortCondition, title = "Sell Signal", text ="SELL", textcolor = color.white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = color.new(color.red, 0)) Não. plotshape ((longCondition, title = "Buy Signal", text ="BUY O gráfico mostra que apenas as condições longCondition são cumpridas. A condição é a seguinte: Não. se buyCondição e estratégia.position_size == 0 Strategy.entry (("long", strategy.long, amount) é um código de código de código de código de código de código. strategy.exit (("exit_long", "long", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) (em inglês) se sellCondição e estratégia.position_size == 0 Strategy.entry (("short", strategy.short, amount) é uma ferramenta de gerenciamento de conteúdo para gerenciamento de conteúdo. strategy.exit (("exit_short", "short", amount, loss=loss, trail_points=trailPoints, trail_offset=trailOffset) (em inglês) Não.

Nuvens levesNão admira, eu entendo, obrigado.

Sonhos pequenosline Este objeto não é suportado no FMZ, por isso algumas linhas podem não ser alteradas. Algumas políticas usam este objeto para participar no cálculo.

Sonhos pequenosO resultado é que o tempo de retrospecção é muito longo e o excesso de dados é causado.

Sonhos pequenosOs tutoriais de língua Pine têm capítulos com descrições, que podem ser consultados em: https://www.fmz.com/bbs-topic/9390#%E5%B8%A6%E8%B7%F%E8%B8%AA%E6%AD%A2%E6%8D%9F%E6%AD%A2%E7%9B%88%E7%9A%84%E8%B6%85%E7%BA%A7%E8%B6%8B%E5%8A%BF%E7%AD%96%E7%95%A5

Nuvens levesAh, eu defino em um ano ou 10 meses, basicamente, e depois de um ano eu tenho essa dica ou uma série de outras coisas.

Sonhos pequenosNão há restrições, este erro deve ser muito grande para o tempo de revisão.

Nuvens levesMuito bem, obrigada, mas também, por favor, há um limite de tempo para a revisão do PINE? RuntimeError: abort(undefined) at js Error at StackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096171) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:1:147), :1:2096345) at abort (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :192x:1478) at stackTrace (eval at self.onmessage (https://www.fmz.com/scripts/worker_detours.393054f7.js:147), :2096171) at stackTrace (eval at self.onmessage (https://www.fmz.fmz Mas se não mudar o intervalo de tempo, o teste será feito normalmente................................................................................................................................................................................................................................................

Sonhos pequenosO Pine deve ser capaz de projetar um bloqueio mais complexo, que ainda não está embutido no código do JS.

Sonhos pequenosO blogueiro também escreveu sobre o problema: "O problema é que a maioria dos blogueiros não tem acesso ao site.

Sonhos pequenosOh, desculpe, a política de endereçamento foi errada e foi alterada.