Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 805

 
Sfinks35:
Boa tarde!
Parece que estou conseguindo agora mesmo:

Mas ao compilar, ele dá um aviso: possível perda de dados devido à conversão do tipo on line:
índice = GetPatt5barsDN(índice);

Não há erros no cabeçalho da função (ou na própria função) durante a compilação.

double low3 = 0;
   int index = 0;
   low3 = GetPatt5barsDN(index); // Здесь передача значения по ссылке

   Print("low3= ", low3);
   Print("index= ", index);
 

Saudações, tenho uma pergunta, existe alguma forma de eu poder pular um certo passe durante a otimização.

Por exemplo, estou otimizando meu robô com 2 MA's - rápido e lento começando de 10 e terminando com 1000 para cada

Como posso pular o passo quando o período de um lento é inferior ao período de um rápido?

 
Roman Sharanov:

Saudações, tenho uma pergunta, existe alguma forma de eu poder pular um certo passe durante a otimização.

Por exemplo, estou otimizando meu robô com 2 MA's - rápido e lento começando de 10 e terminando com 1000 para cada

Como posso pular passes quando o período de um lento é inferior ao período de um rápido?

Neste caso, retornar(INIT_PARAMETERS_INCORRECT) durante a inicialização;

 
Igor Zakharov:

Neste caso, fazer devolução(INIT_PARAMETERS_INCORRECT) durante a inicialização;

obrigado

 

Olá. Quem pode me dizer. Três TS diferentes, três EAs diferentes, com três números mágicos diferentes, em pares diferentes. Mas eles têm uma característica comum - fechamento de pedidos (usando a função OrderClose()) quando certas condições são atingidas(número de pedidos e pequeno lucro). No testador, não há problemas, mas na prática, a impressão é que quando a função Order Close() aciona em um dos pares, esta função (OrderClose()) aciona também em outros pares, quer as condições sejam cumpridas ou não. Qual pode ser a razão para isso? Pode ser uma função Close() definida pelo usuário?

Abaixo estão as condições de fechamento e a função Close() personalizada.

if(CountBuy() >= 1 && CountSell() >= 1 && CountSymbolTotal() >= NumberOrder)
   {
      int    i;
      int    total    = OrdersTotal();
      double accruals = CalculateCommission() + CalculateSwapBuy() + CalculateSwapSell();
   
      if((CountProfitBuy() + CountProfitSell()) >= (MaxOrderProfit*GetLots()+ accruals))
      {
         for(i = total-1; i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               { 
                  if(OrderType() == OP_BUY)
                     OrderCloseX();
               }
            }
         } 
         for(i = total-1; i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               { 
                  if(OrderType() == OP_SELL)
                     OrderCloseX();
               }
            }
         }            
      }
   }
//---------------------
void OrderCloseX()
{
   int i;
   int ticket = -1;
   int k      = OrdersTotal();
   
   for(i = k - 1; i >= 0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if((OrderType() == OP_BUY || OrderType() == OP_SELL) )
         {            
            ticket = OrderTicket();
         }
      }
   }
   if(OrderTicket() != ticket) 
      if(!OrderSelect(ticket, SELECT_BY_TICKET))
         Print("Ошибка в выборе ордеров!");

   while(true)
   {
      int  error;
      bool result = true;
      
      if (OrderType()==OP_BUY) 
         result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, 0);
         
      if (OrderType()==OP_SELL) 
         result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, 0);
         
      if(result != TRUE) 
      { 
         error = GetLastError(); 
            Print("LastError = ", error); 
      }
      else 
      { 
         error = 0; 
      }
      if(error == 135) 
         RefreshRates();
      else break;
   } 
}

 
Youri Lazurenko:

Olá. Quem pode me dizer. Três TS diferentes, três EAs diferentes, com três números mágicos diferentes, em pares diferentes. Mas eles têm uma característica comum - fechamento de pedidos (usando a função OrderClose()) quando certas condições são atingidas(número de pedidos e pequeno lucro). No testador, não há problemas, mas na prática, a impressão é que quando a função Order Close() aciona em um dos pares, esta função (OrderClose()) aciona também em outros pares, quer as condições sejam cumpridas ou não. Qual pode ser a razão para isso? Talvez esteja na função Close() definida pelo usuário?

Aqui estão as condições de fechamento e a função Close() definida pelo usuário.

Primeiro, você usa OrderSelect() para verificar as ordens como deve ser - você controla o símbolo e o número mestre do pedido, e então você fecha o pedido usando OrderCloseX() e procura através das ordens novamente, mas você não controla o símbolo e o número mestre em OrderSelect() por algum motivo

Acho que devemos acrescentar OrderCloseX() para evitar a reescrita do código inteiro:

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
 
Igor Makanu:

Primeiro você verifica as ordens através de OrderSelect() como deve ser - controle o símbolo e o número mestre do pedido, e então você fecha o pedido em OrderCloseX() e procura através das ordens novamente, mas por alguma razão você não controla o símbolo e o número mestre em OrderSelect()

Acho que devo acrescentar OrderCloseX() para não reescrever todos os códigos:

Obrigado. Vou corrigi-lo. Já corrigido. Talvez esta seja a razão: a função OrderCloseX() é chamada em um dos pares que então funciona em todos os outros pares e números mágicos. Pode ser, pode ser. Mais uma vez, obrigado.

 
Igor Makanu:

Dígitos - Variáveis pré-definidas

Também decidi usar esta função, li que se o número de dígitos no escritório for 5, por exemplo 1,00000 e os últimos valores forem zeros, pode não retornar 5 dígitos mas zero ou, por exemplo, o número parecerá 1,24700 retornará 3 casas decimais, embora deva haver 5 deles, é verdade?

 
Seric29:

Também decidi usar esta função, li que se o número de dígitos em um estábulo de 5 caracteres por exemplo 1,00000 e o último valor de zero pode não retornar 5 caracteres, mas zero, ou por exemplo o número parecerá 1,24700 retornará 3 casas decimais, mesmo que deva haver 5 deles é verdade?

Os dígitos são usados com NormalizeDouble

https://docs.mql4.com/ru/convert/normalizedouble

NormalizeDouble - Преобразование данных - Справочник MQL4
NormalizeDouble - Преобразование данных - Справочник MQL4
  • docs.mql4.com
Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров, должны быть нормализованы с точностью, значение которой можно получить функцией Digits(). Нужно...
 
De repente, todos os terminais perderam a conexão com os corretores. Em todos os lugares o erro de conexão falhou.
Na janela de login, o servidor não permite que eu selecione um servidor, ele está vazio. Eu não mudei nada antes, não instalei nada ou apaguei nada.
Qual é a razão?