Análise de barras ao contrário na EA - página 3

 
paranoyakX:

obrigado pelo conselho, aqui está uma versão muito simples do meu código, este não é meu código real, mas espero que isto seja mais claro.

como eu disse que este não é o código real, encontrar padrão etc. é apenas um exemplo. a razão pela qual abri este tópico é afunção DetectExistingPattern()

Já lhe dei um exemplo de código sobre como executar o código na primeira execução do OnTick(), então agora atualize seu post de código de acordo para que seu DetectExistingPattern() seja executado na primeira chamada do OnTick() e não no OnInit().

Além disso, você não pode usar "Barras" para detectar uma Nova Barra. Isso é incorreto. Você deve usar ou "Time[0]" ou "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Aqui está um exemplo:

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

Já lhe dei um exemplo de código sobre como executar o código na primeira execução do OnTick(), então agora atualize seu post de código de acordo para que seu DetectExistingPattern() seja executado na primeira chamada do OnTick() e não no OnInit().

Além disso, você não pode usar "Barras" para detectar uma Nova Barra. Isso é incorreto. Você deve usar ou "Time[0]" ou "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Aqui está um exemplo:

obrigado @FMIC, acrescentei o código simples porque @jjc o pediu. A propósito, eu aprendi usando Bars da parte de como eu me lembro, todos estavam escrevendo dessa maneira, então eu escrevi. Por que isso está errado? Pode funcionar de forma inadequada?

ps: Eu uso metatrader 4, então é mql4 certo ?

 
paranoyakX:

obrigado @FMIC, acrescentei o código simples porque @jjc o pediu. A propósito, eu aprendi usando Bars com o Bars, como me lembro, todos estavam escrevendo dessa maneira, então eu o fiz. Por que isso está errado? Pode funcionar de forma inadequada?

ps: Eu uso metatrader 4, então é mql4 certo ?

Não! No fórum, você verá que muitos usuários mostraram que o método "Barras" é muito antigo e não confiável porque o número de barras pode ser alterado pelas "Opções" de gráficos ou pode ser constante quando o número máximo de barras por gráfico tiver sido atingido. Portanto, é errado usá-lo. Use ou "Time[0]" ou se você quiser que seja compatível com MQL5 também, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Por favor, veja meu exemplo.
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

uau, eu não sabia que iria usar seu código, muito obrigado.
 
As barras não são confiáveis (uma atualização/religação pode mudar o número de barras no gráfico)o volume não é confiável (falta de tiques) Use sempre o tempo. Vela nova - Fórum MQL4
 
paranoyakX:

como eu disse que este não é o código real, encontrar padrão etc. é apenas um exemplo. a razão pela qual abri esta linha é afunção DetectExistingPattern()

Voltando à sua pergunta original... Neste exemplo, uma opção seria mudar sua função CheckTrendPattern() para que se possa dizer a ela para começar em uma barra específica. Em vez de usar a faixa fixa de barras de 1 a 10, você usa um offset de 1 a 10 a partir de um ponto de partida específico.

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

Quando não há nenhuma ordem existente, e você deseja verificar se o padrão é atualmente atendido, você então usa CheckTrendPattern(0) em vez de CheckTrendPattern().

Ao iniciar, se você tiver uma ordem existente, então você pode procurar o padrão que acionou o padrão da seguinte forma. Esta é a mesma sugestão que eu fiz no início: você obtém o índice de barras que é equivalente ao tempo aberto da ordem existente, e começa a olhar para trás a partir daí.

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);
CheckTrendPattern(BarShiftOfOrderOpen);

Entretanto, como diz a FMIC, é preferível fazer esta verificação na primeira chamada para OnTick() em vez de OnInit(). Minhas próprias razões para sugerir isto não têm nada a ver com "atrasar a inicialização". Em vez disso, eu ficaria preocupado que, quando o MT4 está reiniciando com a EA já anexada a um gráfico, você ainda não tem 100% de confiança uma lista de pedidos do corretor ou um histórico atualizado da barra.

Outra consideração que você pode querer ter em mente é o seguinte cenário, tudo acontecendo durante o tempo coberto por uma única barra:

  • Você encontra um padrão e coloca um comércio
  • Seu comércio aberto é fechado, por exemplo, porque atinge um limite de perda
  • O MT4 fecha (deliberadamente ou não)
  • O MT4 reinicia
  • A EA reencontra o padrão atual, e aceita outro comércio no mesmo bar porque não há comércio aberto

Você pode querer verificar as ordens fechadas, bem como as ordens abertas, para evitar isto.

 
@jjc, suas sugestões são muito boas. obrigado por compartilhar sua experiência.
jjc:

Voltando à sua pergunta original... Neste exemplo, uma opção seria mudar sua função CheckTrendPattern() para que se possa dizer a ela para começar em uma barra específica. Em vez de usar a faixa fixa de barras de 1 a 10, você usa um offset de 1 a 10 a partir de um ponto inicial especificado.

Quando não há nenhuma ordem existente, e você deseja verificar se o padrão é atualmente atendido, você então usa CheckTrendPattern(0) em vez de CheckTrendPattern().

Meu padrão real não é isso, então não há números fixos (como 10 exemplo) é dinâmico, mas meu método de verificação de padrão é diferente, então não consegui me lembrar dele e isso realmente me incomoda porque escrevi um código similar para encontrar padrão novamente. o problema é que enquanto a EA está funcionando, eu apenas verifico na última barra se meu padrão ainda está continuando e se está, então não faço nada, quando o padrão é quebrado, então abro uma ordem. Portanto, não posso usar esse código enquanto encontro o padrão novamente porque, desta vez, tenho que voltar nas barras e não avançar. Também não quis procurar o padrão para trás porque, neste caso, estarei verificando as mesmas barras uma e outra vez. Só estou preocupado com a questão do desempenho, mas como vejo que não será um problema, estou pensando em mudar meu método de busca de padrão para que eu possa usá-lo tanto na inicialização quanto durante a execução, como você disse. isto também evitará possíveis problemas como se eu mudasse meu padrão, teria que mudar o procedimento de reencontrar padrão, o que posso esquecer.obrigado por isso. Também como @FMIC disse, talvez eu deva fazer esta parte como um indicador (que não escrevi muito) para que não seja um problema de encontrar e encontrar novamente.
jjc:

Ao iniciar, se você tiver uma ordem existente, então você pode procurar o padrão que acionou o padrão da seguinte forma. Esta é a mesma sugestão que fiz no início: você obtém o índice de barras que é equivalente ao tempo aberto da ordem existente, e começa a olhar para trás a partir daí. No entanto, como diz a FMIC, é preferível fazer esta verificação na primeira chamada para OnTick() em vez de OnInit(). Minhas próprias razões para sugerir isto não têm nada a ver com "atrasar a inicialização". Em vez disso, eu ficaria preocupado que, quando o MT4 está reiniciando com a EA já anexada a um gráfico, você ainda não tem 100% de confiança uma lista de pedidos do corretor ou um histórico atualizado da barra.

Outra consideração que você pode querer ter em mente é o seguinte cenário, tudo acontecendo durante o tempo coberto por uma única barra:

  • Você encontra um padrão e coloca um comércio
  • Seu comércio aberto é fechado, por exemplo, porque atinge um limite de perda
  • O MT4 fecha (deliberadamente ou não)
  • O MT4 reinicia
  • A EA reencontra o padrão atual, e aceita outro comércio no mesmo bar porque não há comércio aberto

Agora está mais claro porque eu deveria fazê-lo no OnInit, a confiabilidade é o ponto mais importante, é claro, e eu não pensei no aviso de sua consideração. esta parte é realmente importante, eu poderia abrir pedidos redundantes, talvez raros, mas possíveis. Tenho que lidar com isto de alguma forma. realmente muito obrigado.

@WHRoeder seu novo controle de verificação de barras é tão simples e bonito. Eu adicionei seu método ao meu código, obrigado.

 

Olá a todos,

como @FMIC aconselhou, escrevo e indicador que encontra meu padrão, dou um sinal e mais alguns dados que serão usados para meus pedidos (posso abrir mais de um pedido a preços diferentes). Agora eu quero usá-lo em meu EA, mas tenho uma pergunta, preciso da sua experiência na verdade. Quando recebo um sinal do meu indicador, abrirei um pedido ou colocarei um pedido (limite de venda ou limite de compra etc.) se meu mt4 falhar por qualquer motivo quando eu o reabrir, como posso descobrir que o pedido aberto pertence a qual sinal no meu indicador. está bem usar o deslocamento de barra para isso ? como conversamos antes, posso encontrar o tempo de criação do pedido, depois encontrar esse deslocamento de barra e devo tentar obter o valor do indicador usando esse deslocamento? Como posso combinar esta ordem e o indicador de mudança?

obrigado.

 
paranoyakX: Olá a todos, como aconselhou @FMIC, escrevo e indicador que encontra meu padrão, dou um sinal e mais alguns dados que serão usados para meus pedidos (posso abrir mais de um pedido a preços diferentes). Agora eu quero usá-lo em meu EA, mas tenho uma pergunta, preciso de sua experiência de fato. Quando recebo um sinal do meu indicador, abrirei um pedido ou colocarei um pedido (limite de venda ou limite de compra etc.) se meu mt4 falhar por qualquer motivo quando eu o reabrir, como posso descobrir que o pedido aberto pertence a qual sinal no meu indicador. está bem usar o deslocamento de barra para isso ? como conversamos antes, posso encontrar o tempo de criação do pedido, depois encontrar esse deslocamento de barra e devo tentar obter o valor do indicador usando esse deslocamento? Como posso combinar esta ordem e o indicador de mudança ?
Sim, você pode usar iBarShift(), assim como jjc lhe explicou em um post anterior para então fazer referência aos dados do seu indicador através da função iCustom().
 
FMIC:
Sim, você pode usar iBarShift(), assim como jjc lhe explicou em um post anterior para então fazer referência aos dados de seu indicador através da função iCustom().
Muito obrigado @FMIC, portanto, usar shift é uma boa solução. Fazer meu padrão como indicador foi um conselho muito bom. Mudarei meu código inteiro, é claro, mas será mais consistente.