Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y 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;// Прерываем цикл 
     
        }}

El primer problemaLots/Prikup - Dplus debe ser normalizado. Lee con atención. Si las variables son de tipo doble, notarás con sorpresa que 4/2 no da el 2 esperado, sino 1,999999999999 - probablemente no te hayas enfrentado aún a este problema.

Así que si((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) es falso, y puedo decir con alta probabilidad que es falso, entonces aunque tengas cnt_OO mayor que 1 tienes garantizado llegar a un bloque después de la etiqueta 1. Así que todo te funciona sin errores El problema está en la lógica de procesamiento de datos.

El segundo problema es que está garantizado que sólo se procesará el último pedido de la lista, así que ¿para qué molestarse con un bucle for?

Si lo hace sólo para el probador, entonces elegir el último orden de la lista, realmente obtendrá el orden necesario, y no siempre. En el mercado real, especialmente si hay varios Asesores Expertos ejecutándose, está garantizado que obtendrá algo diferente a lo que espera y el bucle está garantizado que se romperá después de la primera pasada usando el comando break.

 
Vitaly Gorbunov:

El primer problemaLots/Prikup - Dplus debe ser normalizado. Lee con atención. Si las variables son de tipo doble, notarás con sorpresa que 4/2 no da el 2 esperado, sino 1,999999999999 - probablemente no te hayas enfrentado aún a este problema.

Así que si((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) es falso, y puedo decir con alta probabilidad que es falso, entonces aunque tengas cnt_OO mayor que 1 tienes garantizado llegar a un bloque después de la etiqueta 1. Así que todo te funciona sin errores El problema está en la lógica de procesamiento de datos.

El segundo problema es que está garantizado que sólo se procesará el último pedido de la lista, así que ¿para qué molestarse con un bucle for?

Si lo hace sólo para el probador, entonces elegir el último orden de la lista, realmente obtendrá el orden necesario, y no siempre. En el mercado real, especialmente si hay varios Asesores Expertos funcionando, está garantizado que obtendrá algo diferente de lo que espera y el bucle se romperá después de la primera pasada.

Vitaly Gorbunov:

El primer problemaLots/Prikup - Dplus debe ser normalizado. Si las variables son de tipo doble te sorprenderá que 4/2 no dé el 2 esperado sino 1,999999999999 quizás no te hayas enfrentado aún a este problema

Así que si((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) es falso, y puedo decir con alta probabilidad que es falso, entonces aunque tengas cnt_OO mayor que 1 tienes garantizado llegar a un bloque después de la etiqueta 1. Así que todo te funciona sin errores El problema está en la lógica de procesamiento de datos.

El segundo problema es que está garantizado que sólo se procesará el último pedido de la lista, así que ¿para qué molestarse con un bucle for?

Si lo hace sólo para el probador, entonces elegir el último orden de la lista, realmente obtendrá el orden necesario, y no siempre. En el mercado real, especialmente si hay varios Asesores Expertos ejecutándose, está garantizado que obtendrá exactamente la orden incorrecta, y el bucle se romperá en el comando de ruptura después de la primera pasada.

En cuanto a la normalización - gracias, no me había dado cuenta de que faltaba. Mi ojo se perdió en mi cabeza.

Sobre el bucle for: hay diferentes órdenes en el archivo con diferentes magos y de diferentes parejas. Los reviso desde el final hasta que encuentro el que necesito. Esto ocurre cuando el EA no ha empezado a funcionar y no aparecen en la lista nuevas órdenes que necesito. El bucle no se interrumpe en la primera pasada, sino cuando se encuentra el orden requerido.

Tenemos que entender bien las funciones Onlinit y OnDeinit. Su necesidad es evidente.

 

En esta implementación, el bucle no funciona. Ejecuté su código en diferentes variantes siempre una pasada.

¡Y ahora está claro en qué te has equivocado!

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;// Прерываем цикл 
     
        }}

¡Comenté todo lo posible! Pruébalo.

 
Vitaly Gorbunov:

En esta implementación, el bucle no funciona. Ejecuté su código en diferentes variantes siempre una pasada.

Y ahora veo en qué te equivocas.

¡Comenté todo lo posible! Pruébalo.

Gracias, lo tengo. Aquí hay una solución para el error de falta de normalización. Tras un examen más detallado del algoritmo de recuperación, la condición&&(OrderLots() <= Lots/Prikup - Dplus) parecía ser innecesaria.

Gracias a todos por sus buenos consejos



Aquí está el resultado de las pruebas. Es casi lo mismo en el real, incluso mejor. Se advierte de antemano: esto no es una martingala. Es incluso peor de lo que crees :=). Reducción del 1,3% de beneficio 507$.

 
¡Buen resultado! Más problemas, pero es difícil sacarte la información adecuada para saber cuál es el problema. Si quieres, puedes añadirme como amigo para no perderme.
 
Vitaly Muzichenko:

Si funciona, y no te importa compartir el resultado, escribe una solución al problema

No ha funcionado (he utilizado la librería openssl de php). Resolver el problema de una manera diferente.

 
Juer:

No funcionó (utilicé la biblioteca openssl de php). Resolver el problema de una manera diferente.

¿Así que terminaste encriptando en MT y desencriptando en .php? ¿Qué forma utilizaste?

 
Vitaly Muzichenko:

¿Así que terminaste encriptando en MT y desencriptando en .php? ¿Qué método ha utilizado?

No, te lo dije, no funcionó. Me he dado por vencido. Para mi tarea un hachís era suficiente. Estaba enviando y recibiendo hash y de vuelta otro hash como confirmación.

Así que no pude descifrarlo en PHP. Estaría bien que alguien estudiara seriamente este asunto. Tal vez un desarrollador o algo así.

 
Juer:

No, escribí que no funcionaba. Me he dado por vencido. Un hachís fue suficiente para mi tarea. Envié y recibí un hash y de vuelta otro hash como confirmación.

Así que no pude descifrarlo en PHP. Estaría bien que alguien estudiara seriamente este asunto. Tal vez un desarrollador o algo así.

Escribe tu propia función de encriptación en puch, y pórtala a mq. Así no lo desencriptarán y funcionará al 100% de cualquier manera.

 
Vitaly Muzichenko:

Si funciona, y no te importa compartir el resultado, publica la solución

google "formato de relleno PKCS#7"

Razón de la queja: