Discussão do artigo "Criando um Consultor Especialista, que negocia em um número de instrumentos" - página 5

 
Interesting:
By Tnew[1] Invalid array range - parece ser um range overrun. Não se esqueça de que a numeração dos elementos da matriz começa com o início do intervalo da matriz.

sem acesso para editar a mensagem de 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

Replace:8.Why Exp_TEMA.mq5, when testing, opens trades inside a bar? by

8 Por que o Exp_TEMA.mq5, ao testar, abre várias negociações em uma barra?

 
ias:
sem acesso para editar a mensagem de 2010.07.16 22:41 2010.07.16 22:41:25 2010.07.16 22:41:25 #

As mensagens só podem ser editadas dentro de 3 dias após a postagem.

[Excluído]  

ias:

8) Por que o Exp_TEMA.mq5, ao testar, abre várias negociações em uma barra?

Seria lógico supor que não há verificação da presença de posições abertas anteriormente e definir ordens....
 

Interesting:
Логично будт предположить то, что там нет проверки наличия ранее открытых позиций и установленных отложников...

Interessante:
Seria lógico supor que não há verificação de posições abertas anteriormente e definir ordens pendentes....

As ordens pendentes não são usadas no Exp_TEMA.mq5. As posições abertas anteriormente são verificadas:

//+X================================================================X+
bool BuyPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool SellPositionOpen
                    ...
   if(PositionSelect(symbol))return(false);
//+X================================================================X+
bool BuyPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_BUY) return(false);
     }
    else  return(false);
//+X================================================================X+
bool SellPositionClose(const string symbol, ulong deviation)
...
   if(PositionSelect(symbol))
    {
     if(PositionGetInteger(POSITION_TYPE) != POSITION_TYPE_SELL)return(false);
    }
   else return(false); 

Talvez algo esteja errado, em:

//+X================================================================X+
bool IsNewBar(int Number, string symbol, ENUM_TIMEFRAMES timeframe)
  {
//----+
   static datetime Told[];
   datetime Tnew[1];
   
   //----+ Declaração de variável para armazenar tamanhos de matrizes de variáveis
   static int Size_ = 0;
   
   //----+ Redimensionamento de matrizes variáveis
   if (Number + 1 > Size_)
    {
     uint size = Number + 1;
     //----
     if (ArrayResize(Told, size) == -1)
      {
       string word = "";
       StringConcatenate(word, "IsNewBar( ", Number,
                    " ): Error!!! Falha ao redimensionar matrizes de variáveis!!!"); 
       Print(word); 
       //---- 
       int error = GetLastError();
       ResetLastError();
       if (error > 4000)
        {
         StringConcatenate(word, "IsNewBar( ", Number, " ): Código de erro ", error);
         Print(word); 
        }  
       //---- 
       Size_ = -2;
       return(false);
      }
    }
   
   CopyTime(symbol, timeframe, 0, 1, Tnew); 
   if (Tnew[0] != Told[Number])
    {
     Told[Number] = Tnew[0];
     return(true);
    }
//----+
   return(false);
  }

ou em:

//+X================================================================X+
bool TradeSignalCounter
                      (
                       int Number,
                       string Symbol_,
                       bool Trade,
                       int period,
                       ENUM_APPLIED_PRICE ApPrice,
                       bool& UpSignal[],
                       bool& DnSignal[],
                       bool& UpStop[],
                       bool& DnStop[]
                      )
  
  {
//----+
   //----+ Verificação de proibição de comércio
   if (!Trade)return(true);
   
   //----+ Declare uma variável para armazenar o tamanho total das matrizes de variáveis
   static int Size_ = 0;
   
   //----+ Declarar uma matriz para armazenar os identificadores de indicadores como uma variável estática
   static int Handle[];
   
   static int Recount[], MinBars[];
   double TEMA[4], dtema1, dtema2;
   
   //----+ Inicialização 
   if (Number + 1 > Size_) // Entrada no bloco de inicialização somente na primeira inicialização
    {
     Size_ = Number + 1; // A entrada no bloco está fechada para esse número
     
     //---- Redimensionamento de matrizes de variáveis
     ArrayResize(Handle,   Size_);
     ArrayResize(Recount,  Size_);
     ArrayResize(MinBars,  Size_);
     
     //---- Determinação do número mínimo de barras suficientes para o cálculo 
     MinBars[Number] = 3 * period;
     
     //---- Zeragem preliminar das células da matriz
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //---- Use a matriz como uma série temporal
     ArraySetAsSeries(TEMA, true);
     
     //----+ Obtendo o controle do indicador
     Handle[Number] = iTEMA(Symbol_, PERIOD_CURRENT, period, 0, ApPrice);
    }
     
   //----+ Verificar se o número de barras é suficiente para o cálculo 
   if (Bars(Symbol_, 0) < MinBars[Number])return(true);

   //----+ Receber sinais de negociação 
   if (IsNewBar(Number, Symbol_, PERIOD_CURRENT) || Recount[Number]) // Entrada no bloco em caso de mudança de barra ou falha na cópia de dados
    {
     DnSignal[Number] = false;
     UpSignal[Number] = false;
     DnStop  [Number] = false;
     UpStop  [Number] = false;
     
     //----+ Usando as alças do indicador, copie os valores do indicador
                   // buffers em uma matriz estática especialmente preparada
     if (CopyBuffer(Handle[Number], 0, 0, 4, TEMA) < 0)
      {
       Recount[Number] = true; // como os dados não são recebidos, você deve retornar 
                                 // nesse bloco de recebimento de sinais de negociação no próximo tick!
       return(false); // sair da função TradeSignalCounter() sem receber sinais de negociação
      }
      
     //---- Todas as operações de cópia do buffer do indicador foram concluídas com êxito
     Recount[Number] = false; // é possível não retornar a esse bloco até a próxima mudança de barra
     
     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dtema2 = NormalizeDouble(TEMA[2] - TEMA[3], Digits_);
     dtema1 = NormalizeDouble(TEMA[1] - TEMA[2], Digits_);
     
     //---- Definição dos sinais de entrada
     if (dtema2 > 0 && dtema1 < 0) DnSignal[Number] = true;
     if (dtema2 < 0 && dtema1 > 0) UpSignal[Number] = true;
     
     //---- Definição dos sinais de saída
     if (dtema1 > 0) DnStop[Number] = true;
     if (dtema1 < 0) UpStop[Number] = true;
    }
//----+
   return(true);
  } 

Várias negociações em uma barra ao testar o Exp_TEMA.mq5 no EURUSD, período D1

[Excluído]  
ias, é melhor procurar o autor do artigo....
 
ias:

Por que o Exp_TEMA.mq5, ao testar, abre negociações dentro da barra?

Por que o Exp_TEMA.mq5, durante o teste, abre várias negociações em uma barra?

A questão é que, no contexto deste artigo, a tarefa era implementar um Expert Advisor simples de várias moedas sem confundir a ideia principal com pequenos detalhes que interferem na compreensão da essência. E cada um tem sua própria maneira de preencher os detalhes. Em sua situação, tudo é resolvido de forma elementar. As variáveis dos sinais de negociação são criadas como entrada para as funções de negociação e são vinculadas pelo link, e essas variáveis são redefinidas após a transação dentro das funções de negociação.
Документация по MQL5: Торговые функции
Документация по MQL5: Торговые функции
  • www.mql5.com
Торговые функции - Документация по MQL5
 
GODZILLA:
A questão é que, no contexto deste artigo, o objetivo era implementar um Expert Advisor simples para várias moedas sem confundir a ideia principal com pequenos detalhes que interferem na compreensão da essência. E cada um tem sua própria maneira de preencher os detalhes. Em sua situação, tudo é resolvido de forma elementar. As variáveis dos sinais de negociação são criadas como entrada para as funções de negociação e são vinculadas pelo link, e essas variáveis são redefinidas depois que uma transação é executada dentro das funções de negociação.
Por favor, mostre-me como fazer isso no exemplo de seu Expert Advisor Exp_TEMA.mq5.
 

ias:
Покажите, пожалустайста, на примере вышего эксперта Exp_TEMA.mq5, как это сделать.

Em minha opinião, aprender e compreender uma linguagem de programação consiste em um indivíduo resolver pequenas tarefas de reorganização do código para suas próprias necessidades. Caso contrário, por que você precisa deste site e dos artigos de programação? Para demonstrar as habilidades dos autores dos artigos? Aqueles que não querem entender por conta própria podem usar o recurso https://www.mql5.com/ru/job
Por exemplo, na MQL4, implementei essa abordagem em sua forma mais simples, como esta https://www.mql5.com/pt/articles/1516. Para a MQL5, nada muda e tudo é feito da mesma forma.

.

 
GODZILLA:

Tenho grande respeito pelo autor do artigo "Creating an Expert Advisor that trades on different instruments".
1.O código do Expert Advisor Exp_TEMA.mq5 apresentado no artigo abre várias negociações em uma barra durante o teste,
conforme relatado anteriormente neste tópico. Esse fato confirma a presença de um código incorreto ou um bug no Expert Advisor, que muitos visitantes do site estão interessados em eliminar.
2.A resposta de Roche no tópico "Expert Advisors:Multicast": "Além disso, a função de determinar uma nova barra pode ser implementada sem usar a função de cópia de tempo." - também confirma a possibilidade de uma escrita mais racional da função IsNewBar() no Expert Advisor.
Gostaria de ver como o autor eliminará profissionalmente esses defeitos, já que todos podem cometer erros, e somente os profissionais podem corrigi-los corretamente.
 
ias:

Se você observar atentamente os sistemas de negociação apresentados no artigo, poderá concluir que eles são sistemas de reversão. O stop loss nesses sistemas desempenha um papel secundário e é colocado a uma distância bastante decente da entrada, contada em várias velas, no mínimo. O profissionalismo na apresentação do material consiste em desdobrar o assunto da forma mais simples possível, sem sobrecarregá-lo com outros artifícios, e não com base no público que não quer pensar por si mesmo. Qualquer livro didático é sempre falho em termos do ideal. E isso é considerado aceitável e normal. No futuro, haverá uma ordem de apresentação detalhada desse detalhe da construção de sistemas de negociação, haverá uma revisão detalhada da implementação, que também não é tão simples.
Quanto à cópia de tempo, posso dizer com toda certeza que eu mesmo não vi nenhuma diferença significativa na escrita mais racional da função IsNewBar() no Expert Advisor, embora eu a tenha medido! Até escrevi um artigo sobre esse tópico. Seria compreensível, então, se houvesse uma deterioração significativa do trabalho do código.
E, se eu quisesse, poderia, por exemplo, rasgar qualquer artigo deste site em pedaços sem nenhum problema. Mas eu aprecio as informações, em primeiro lugar, porque elas estão disponíveis, não porque correspondem às minhas ideias sobre o ideal.
Portanto, é claro que não vou eliminar falhas rebuscadas e, ao mesmo tempo, desordenar significativamente o código, que não é tão simples assim, por motivos bastante compreensíveis e profissionais.