Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 26

 
trader781:

Una vez que hayas limpiado tu código, será más legible para ti, por no hablar de otros que necesitan entender tu lógica. Ahí es donde se verán todos los fallos.

Bien, ¿es mejor así?
Ahora elimine las corchetes emparejadas innecesarias y disponga el resto normalmente en bloques, y verá dónde tiene fallos de lógica.
 
Artyom Trishkin:
Ahora, elimina los paréntesis rizados adicionales y ordena el resto normalmente en bloques, y verás dónde falla tu lógica.
¿Cuáles son los extras?
 
trader781:
¿Cuáles son redundantes?
Tienes un montón de corchetes innecesarios en tu código - utiliza una herramienta de estilización y verás inmediatamente los corchetes vacíos emparejados innecesarios.
 
Artyom Trishkin:
Tienes un montón de corchetes innecesarios en tu código - trata el código con un estilizador, y verás inmediatamente los corchetes vacíos parejos extra.
Hecho
Archivos adjuntos:
 
trader781:
Hecho
Lo miraré más tarde, me llevará al menos cuatro horas...
 
trader781:
Fabricado por
1.count++; // contar ticks desde el inicio del programa

Mejor manera: if(count<=20) count++; - ¿para qué contar más si sólo necesitas 21?

2.
   if(count>20) //  если количество тиков больше начинаем работу ... и дальше код эксперта
     {
      if(Bars<801 || (IsTradeAllowed()==false)) //--- Проверим достаточна ли в истории баров для анализа и разрешение торговли
         Print("Нет достаточного количества баров или торговля на текущем инструменте запрещена");
      return;
     }

Y aquí está el wigwam. Esto sólo comprobará el número de barras e imprimirá cuandocount>20, el resto del código funcionará cuandocount<=20.

3.

if(OrderSymbol()==Symbol() && OrderType()<2)
            continue;

Si sólo hay que tener en cuenta los del mercado (y esto es lo que se espera de un código más amplio), no es necesariocontinuar en absoluto.

4.

         if(y==true && (OrderType()==0)) //+-----покупка
           {
            dummy=(OrderClose(OrderTicket(),OrderLots(),Bid,0,White));

              {
               if((dummy==true) && ((OrderSelect(i,SELECT_BY_POS,MODE_TRADES))==false))

                  PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               PlaySound("music");
               Sleep(20000);
               dummy=false;
               ExpertRemove();
              }
           }

¿Cierra una orden y se elimina? ¿Y si hay más? Y duerme durante un minuto entero.

No he mirado el código de arriba, no hay lugar para probarlo todavía.

 

1 ok, lo arreglaré

2 no está bien, los siguientes bloques no deberían funcionar encount<20

3 OK, lo corregiré

4 Sí, es un minuto, pero debe iniciarse sólo si no hay más órdenes de mercado para el símbolo actual. Intenté implementarlo a través de un resultado negativo de la selección de la orden, por eso debemos establecer el retorno en algún lugar, pero el retorno en void OnTick() no se ve tan bien. Y de nuevo, OrdersTotal() dará un resultado erróneo si tenemos muchas órdenes para todos los símbolos.

 
trader781:

2 no está bien, los siguientes bloques no deberían funcionar cuandocount<20

Entonces tenemos que añadir else return después del bloque;

4 Sí, es un minuto, pero debe iniciarse sólo si no hay más órdenes de mercado para el símbolo actual. He tratado de implementarlo a través de un resultado negativo de la selección de órdenes, por eso debemos establecer el retorno en algún lugar, mientras que el retorno en void OnTick() no se ve muy bien. Y de nuevo, OrdersTotal() dará un resultado erróneo si tenemos muchas órdenes sobre todos los símbolos.

¿Por qué necesitamos tres sonidos?

Pues bien, podemos hacerlo todo en dos etapas: en el primer bucle se cierran las órdenes y en el siguiente se recalculan todas las órdenes de mercado para comprobar si queda alguna, y si no hay ninguna, suenan las fanfarrias.

Pero sigo sin entender cuál es el truco de la música después de cerrar los pedidos. Bueno, puedes hacer una impresión al diario o enviar un mensaje al correo o una notificación a tu smartphone, pero ¿por qué convertir un EA en una caja de música?
 
Vitalie Postolache:

Entonces debes añadir un return después del bloque else return;

¿Por qué necesitamos el triple de sonido?

Pero se puede hacer todo en dos pasos: en el primer bucle se cierran las órdenes, y en el siguiente se recalculan todas las órdenes de mercado para comprobar si hay alguna sin cerrar, y si no hay ninguna, suena la fanfarria.

Sigo sin entender cuál es el truco de la música cuando los pedidos se han cerrado. Bien, podemos imprimirlo en el diario, enviar un mensaje al correo o notificarlo al smartphone, pero ¿por qué deberíamos convertir nuestro EA en una caja de música?

¿Cómo se separan los ciclos?

¿Cómo puedo vincular el sonido a la última orden cerrada? Porque si no hay órdenes, el Asesor Experto no activaría un sonido.

Y una última cosa: estoy contento con la música por ahora

 
trader781:

¿Cómo se separan los ciclos?

¿Cómo vincular el sonido al último cerrado? porque si no hay órdenes, el Asesor Experto no funcionará

Y por último, estoy contento con la música por ahora.

¿Qué quiere decir con "separado"? No tenemos que separar nada, sólo necesitamos dos bucles (son casi iguales) pero uno tiene OrderClose() y el otro tiene un contador de órdenes. El criterio de selección del orden es el mismo. Si el contador es=0, todos los pedidos se han cerrado y podemos poner música.

También me di cuenta de que la condición

         if(Uslovie1==true) //Bid+ma6
           {
            if((Bid>=ma1-X*Point && Bid<ma1) || (Bid<=ma1+X*Point && Bid>ma1))
              {
                 {y=true;}
              }
           }

No parece estar relacionado con un orden determinado, así que ¿para qué sirve en el bucle?

Yo lo comprobaría antes del bucle de cierre.