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

 
for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к Метке 1
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }}
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

O primeiro problemaLotes/Prikup - Dplus deve ser normalizado. Leia com atenção. Se as variáveis são do tipo duplo, você ficará surpreso se 4/2 não der os 2 esperados, mas 1,99999999999999 - você provavelmente ainda não se deparou com este problema.

Portanto, se((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) é falso, e posso dizer com alta probabilidade que é falso, então mesmo que você tenha cnt_OOO maior que 1 você tem a garantia de chegar a um bloco após a etiqueta 1. Então tudo funciona com você sem erros O problema está na lógica de processamento de dados.

O segundo problema é que você tem a garantia de processar apenas a última ordem da lista, então por que se preocupar com um loop?

Se você fizer isso somente para o testador, então escolhendo a última ordem da lista, você realmente receberá a ordem necessária, e nem sempre. No mercado real, especialmente se houver vários Expert Advisors em funcionamento, você tem a garantia de obter algo diferente do que você espera e o loop é garantido de quebrar após o primeiro passe usando o comando de quebra.

 
Vitaly Gorbunov:

O primeiro problemaLotes/Prikup - Dplus deve ser normalizado. Leia com atenção. Se as variáveis são do tipo duplo, você ficará surpreso se 4/2 dá não o 2 esperado, mas 1,99999999999999 - você provavelmente ainda não se deparou com este problema.

Portanto, se((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) é falso, e posso dizer com alta probabilidade que é falso, então mesmo que você tenha cnt_OOO maior que 1 você tem a garantia de chegar a um bloco após a etiqueta 1. Então tudo funciona com você sem erros O problema está na lógica de processamento de dados.

O segundo problema é que você tem a garantia de processar apenas a última ordem da lista, então por que se preocupar com um loop?

Se você fizer isso somente para o testador, então escolhendo a última ordem da lista, você realmente receberá a ordem necessária, e nem sempre. No mercado real, especialmente se houver vários Expert Advisors em funcionamento, é garantido que você obterá algo diferente do que você espera e o loop irá quebrar após a primeira passagem.

Vitaly Gorbunov:

O primeiro problemaLotes/Prikup - Dplus deve ser normalizado. Se as variáveis forem do tipo duplo, você ficará surpreso se 4/2 não der os 2 esperados, mas 1,99999999999999 talvez você ainda não tenha enfrentado este problema

Portanto, se((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) é falso, e posso dizer com alta probabilidade que é falso, então mesmo que você tenha cnt_OOO maior que 1 você tem a garantia de chegar a um bloco após a etiqueta 1. Então tudo funciona com você sem erros O problema está na lógica de processamento de dados.

O segundo problema é que você tem a garantia de processar apenas a última ordem da lista, então por que se preocupar com um loop?

Se você fizer isso somente para o testador, então escolhendo a última ordem da lista, você realmente receberá a ordem necessária, e nem sempre. No mercado real, especialmente se houver vários Expert Advisors em funcionamento, você tem a garantia de obter exatamente a ordem errada, e o loop irá quebrar no comando de quebra após o primeiro passe.

Quanto à normalização - obrigado, eu não tinha notado que ela estava faltando. Meu olho acabou de se perder na minha cabeça.

Sobre o loop for: há diferentes ordens no arquivo com diferentes feitiços e de diferentes pares. Eu passo por eles desde o final até encontrar aquele que preciso. Isto acontece no momento em que a EA não começou a trabalhar e novas encomendas que eu preciso aparecem na lista. O laço é interrompido não na primeira passagem, mas quando a ordem requerida é encontrada.

Temos que entender corretamente as funções Onlinit e OnDeinit. A necessidade deles é óbvia.

 

Nesta implementação, o laço não funciona. Executei seu código em diferentes variantes sempre um passe.

E agora está claro onde você cometeu um erro!

for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к команде continue
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }

        continue; //Вернёмся в цикл за следующим ордером если предыдущий не прошёл проверку
       }
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Comentei tudo o mais que pude! Experimente!

 
Vitaly Gorbunov:

Nesta implementação, o laço não funciona. Executei seu código em diferentes variantes sempre um passe.

E agora está claro onde você cometeu um erro!

Comentei tudo o mais que pude! Experimente!

Obrigado, eu peguei. Aqui está uma solução para o erro de falta de normalização. Após um exame mais detalhado do algoritmo de recuperação, o Condition&&(OrderLots() <= Lots/Prikup - Dplus) parecia ser desnecessário.

Obrigado a todos vocês por seus bons conselhos



Aqui está o resultado dos testes. É mais ou menos o mesmo no real, ainda melhor. Esteja avisado com antecedência - isto não é um martingale. É ainda pior do que você pensa :=). Drawdown 1,3% lucro 507$

 
Bom resultado! Mais algum problema, mas é difícil obter as informações corretas para descobrir qual é o problema. Se você quiser, pode me adicionar como amigo para que eu não me perca.
 
Vitaly Muzichenko:

Se funcionar, e você não se importa de compartilhar o resultado - escreva uma solução para o problema

Não funcionou (usei a biblioteca php openssl). Resolveu o problema de uma maneira diferente.

 
Juer:

Não funcionou (usei a biblioteca php openssl). Resolveu o problema de uma maneira diferente.

Então você acabou criptografando em MT e decodificando em .php ? Para que lado você usou?

 
Vitaly Muzichenko:

Então você acabou criptografando em MT e decodificando em .php ? Que método você utilizou?

Não, eu lhe disse, não funcionou. Eu desisti disso. Para minha tarefa um haxixe era suficiente. Eu estava enviando e recebendo hash e de volta outro hash como uma confirmação.

Portanto, eu não consegui decifrá-la em PHP. Seria bom se alguém pudesse analisar seriamente esta questão. Talvez um desenvolvedor ou algo assim.

 
Juer:

Não, eu escrevi que não funcionou. Eu desisti disso. Um hash foi suficiente para a minha tarefa. Eu enviei e recebi um hash e recebi outro hash como confirmação.

Portanto, eu não consegui decifrá-la em PHP. Seria bom se alguém pudesse analisar seriamente esta questão. Talvez um desenvolvedor ou algo assim.

Escreva sua própria função de criptografia em puch, e a porta para mq. Dessa forma, eles não decifrarão e funcionará 100% de qualquer maneira.

 
Vitaly Muzichenko:

Se funcionar, e você não se importa de compartilhar o resultado, poste a solução

google "PKCS#7 padding format"