Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 1104

 
shtr:

Hola a todos.

¿Pueden decirme por qué no se abren los pedidos?

Init es init, trade es init. Existe OnTick para los EAs, no hay necesidad de meter todo en el init...

Y para inite, hay códigos de salida especiales inventados por los desarrolladores, ¿por qué no los usas?

 
evillive:

Initu es para initu, trade es para togo. Existe OnTick para los EAs, no hay necesidad de meter todo en el init...

Y para inite, hay códigos de salida especiales inventados por los desarrolladores, ¿por qué no los usamos?

Probablemente porque no conocemos los códigos de terminación inite. Los ejemplos en el tutorial son diferentes de la forma en el editor. Por ejemplo, falta la función int start(). Cuando pegué el ejemplo de Asesor Experto simple del tutorial en el inite, de alguna manera funcionó. Pero no importaba lo que escribiera, no funcionaba. Así que decidí, tras dos semanas de experimentos, consultar a un experto. Gracias por el consejo.

Lo he puesto todo en OnTick, pero no ha cambiado nada.

 
shtr:

No lo utilizamos, debe ser porque no conocemos los códigos de finalización init. Los ejemplos del libro de texto difieren del formulario del editor. Por ejemplo, falta la función int start(). Cuando pegué el ejemplo de Asesor Experto simple del tutorial en el inite, de alguna manera funcionó. Pero no importaba lo que escribiera, no funcionaba. Así que decidí, tras dos semanas de experimentos, consultar a un experto. Gracias por el consejo.

Lo metí todo en OnTick, pero nada ha cambiado.

Olvídate del tutorial, está escrito usando la sintaxis antigua, mucho ha cambiado desde entonces. La ayuda de la entrega del terminal es la más relevante, y kodobase, si te fijas, también es una fuente de ejemplos en la nueva versión de MQL.

Y sobre lo de no escribir todo el código en el inite, era antes, busca por el foro, hay cientos de posts en todos los idiomas de este foro, solo que cada vez hay un nuevo escritor que no es lector ;)

 
evillive:

Olvídate del tutorial, está escrito según la sintaxis antigua, mucho ha cambiado desde entonces. La ayuda de la entrega del terminal es la más relevante, y kodobase, si te fijas, también es una fuente de ejemplos en la nueva versión de MQL.

Y sobre lo de no escribir todo el código en el inite, era antes, busca por el foro, hay cientos de posts en todos los idiomas de este foro, justo cada vez que hay un nuevo escritor, que no es un lector ;)

Gracias.

Los libros de texto antiguos, cuando pierden relevancia, deben ser eliminados inmediatamente))

 
shtr:

Gracias.

Los tutoriales antiguos, cuando pierden su relevancia, deben ser inmediatamente fumados))

Y no tirar todo en OnTick, sólo lo que es relevante para el comercio, la parte del código que se ejecuta sólo en el inicio debe ser dejado en OnInit (por supuesto, que los nombres de las funciones deben ser escritos en latín, sólo perezoso para cambiar el diseño en el foro cada vez).

Sobre el código en sí, hay dudas sobre el bucle, es extraño, en mi opinión no hay suficientes llaves...

Sí, y también para el cálculo de los niveles de pérdidas y ganancias, no están correctamente prescritos. El servidor debe enviar el precio, preferiblemente normalizado, no el valor en pips.

 
evillive:

Y no pongas todo en OnTick, sólo lo que es relevante para el comercio, parte del código que se dispara sólo en el inicio debe dejarse en OnInit (por supuesto, los nombres de las funciones deben ser escritos en latín, sólo demasiado perezoso para cambiar el diseño en el foro cada vez).

Sobre el código en sí, hay dudas sobre el bucle, es extraño, creo que no hay suficientes llaves...

Sí, y también para el cálculo de los niveles de pérdidas y ganancias, no están correctamente prescritos. El servidor debe enviar el precio, preferiblemente normalizado, no el valor en pips.

Ya lo tengo, gracias. Comprobaré los paréntesis - el editor no produjo errores.

¿Por qué ha funcionado el ejemplo del libro? He quitado todas las funciones y he insertado sólo el código de ejemplo, empezando por int start. No hubo errores y las operaciones se abrieron.

 
shtr:

Entendido, gracias. Revisaré los paréntesis - el editor no dio ningún error.

¿Por qué el ejemplo del libro funcionó...? He quitado todas las funciones y he insertado sólo el código de ejemplo, empezando por int. No hubo errores y las operaciones se abrieron.

Bueno, no tenía necesidad de cambiar lo que funcionaba ))))

Si su pregunta se refiere a la diferencia entre start y ontik de forma nueva, debería haber transferido todo de start a ontik. O más bien en su caso, de OnInit a OnTick.

El compilador lleva la cuenta de los errores de sintaxis, nadie más que un humano comprueba la lógica. En casos especiales, incluso el autor del código puede confundirse :)

 
evillive:

Bueno, lo que funcionaba no necesitaba ser intercambiado ))))

Y Int start la forma antigua y OnTick la forma nueva para los EAs, por lo que debería haber movido todo de start a OnTick. O más bien en su caso, de OnInit a OnTick.

El compilador lleva la cuenta de los errores de sintaxis, nadie más que un humano comprueba la lógica. En casos especiales, incluso el autor del código puede confundirse :)

//+------------------------------------------------------------------+
//| 3333.mq4 |
//| Copyright 2016, MetaQuotes Software Corp.
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#enlace de propiedad "https://www.mql5.com"
#versión de la propiedad "1.00"
#propiedad estricta
extern int MA_1=5;
extern int MA_2=20;
extern MA_3=80;
extern inttern TP=100;
extern int SL=50;
extern double Lote=0.1;
cadena Symb;
//+------------------------------------------------------------------+
//| Función de inicialización de expertos |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEED);
}

//+------------------------------------------------------------------+
//| Función de desinicialización experta |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Función de garrapata experta ||
//+------------------------------------------------------------------+
void OnTick()
{
doble MA_1_t;
doble MA_2_t;
doble MA_3_t;
int total;
int pos;
Symb=Símbolo();
Total=0;
for( pos=1; pos<=Total de pedidos(); pos++)
pos=OrderSelect(pos-1,MODE_TRADES);
si(pos==0)
MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0);
MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
{
double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
pos=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,stoploss,takeprofit, "My order",16384,0,clrGreen);
volver;
}
if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
{
double stoploss=NormalizeDouble(SL*Punto-Oferta,Dígitos);
double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
pos=Enviar orden(Símbolo(),OP_SELL,Lote,Oferta,3,stoploss,takeprofit, "Mi orden",16384,0,clrRed);
volver;
}
volver;
}
//---

//+------------------------------------------------------------------+

"Bueno, lo que funcionaba no necesitaba ser vendido))" Bueno, quieres garabatear algo tú mismo).

El paciente no entró en razón después de la manipulación.

 
shtr:

"Bueno, no deberías haber cambiado lo que funcionaba")). Bueno, quieres garabatear algo tú mismo).

El paciente no entró en razón después de la manipulación.

Bueno, la lógica y las matemáticas son flojas, está claro que no va a funcionar así.

Por ejemplo, ¿por qué necesitamos un ciclo en este EA? Es decir, está claro que hay que calcular cuántos pedidos del símbolo y del mago en cuestión se han realizado ya, ¿no? Pero lo que vemos aquí es que el bucle no cuenta nada y no puede contar porque no tiene un "contador" atornillado en ))))

Total=0;                                   

   for( pos=1; pos<=OrdersTotal(); pos++)         
   pos=OrderSelect(pos-1,MODE_TRADES); И что дальше? Переменная pos всегда или 0, или 1, цикл сбивается постоянно на начало, а то и заглючить может и превратиться в бесконечный цикл.

OrderSelect() devuelve un valor booleano, verdadero o falso, que no es apropiado para la variable pos. Y es mejor que el bucle comience por el orden más antiguo, es decir, en orden inverso, para evitar saltarse órdenes.

La variable Total puede ser útil como contador:

for(pos=OrdersTotal()-1;pos>=0;pos--)
{
  if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
  { 
    if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
    {
     Total++; //если это наш ордер, добавляем счётчику единицу
    }
  }
}
if(Total<1)
{
  торгуем
}

He eliminado cosas innecesarias, he añadido la salida de error después de OrderSend, para el probador en las cuentas no ECN las órdenes ya abiertas:

#property version   "1.00"
#property strict
extern int MA_1=5;
extern int MA_2=20;
extern int MA_3=80;
extern int TP=100;
extern int SL=50;
extern double Lot=0.1;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  
   double MA_1_t=0;
   double MA_2_t=0; 
   double MA_3_t=0;
   int Total=0;
   
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
   {
     if(OrderSelect(pos,MODE_TRADES)) //Обязательно проверить, выбран ли ордер
     { 
       if(OrderSymbol()==Symbol()) //желательно проверить, тот ли это ордер по символу, ещё можно по магику проверить дополнительно в этой же строке
       {
        Total++; //если это наш ордер, добавляем счётчику единицу
       }
     }
   }
   if(Total<1)
   {
      MA_1_t=iMA(NULL,0,MA_1,0,MODE_EMA,PRICE_CLOSE,0);
      MA_2_t=iMA(NULL,0,MA_2,0,MODE_EMA,PRICE_CLOSE,0); 
      MA_3_t=iMA(NULL,0,MA_3,0,MODE_EMA,PRICE_CLOSE,0);
  
      if(MA_2_t>MA_3_t&&MA_1_t<MA_2_t&&Open[1]<MA_1_t&&Close[1]>MA_1_t)
      {
         double stoploss=NormalizeDouble(Ask-SL*Point,Digits);
         double takeprofit=NormalizeDouble(Ask+TP*Point,Digits);
         if(OrderSend(Symbol(),OP_BUY,Lot,Ask,6,stoploss,takeprofit,"My order buy",16384,0,clrGreen)<1) 
         Print("OrderSend error #",_LastError," BuySL=",stoploss," BuyTP=",takeprofit);
      }
    
      if(MA_2_t<MA_3_t&&MA_1_t>MA_2_t&&Open[1]>MA_1_t&&Close[1]<MA_1_t)
      {
         double stoploss=NormalizeDouble(Bid+SL*Point,Digits);
         double takeprofit=NormalizeDouble(Bid-TP*Point,Digits);
         if(OrderSend(Symbol(),OP_SELL,Lot,Bid,6,stoploss,takeprofit,"My order sell",16384,0,clrRed)<1)
         Print("OrderSend error #",_LastError," Sell SL=",stoploss," Sell TP=",takeprofit);
      }
   }
}

Ah, sí, también el cálculo del nivel de SL para las ventas fue erróneo, deberíamos estar más atentos.

 
evillive:

Bueno, la lógica y las matemáticas son flojas, así que está claro que no va a funcionar así.

Por ejemplo, ¿por qué habría un ciclo en este EA? Es decir, está claro que hay que calcular cuántos pedidos para el símbolo y el número mágico dados tenemos, ¿no? Pero lo que vemos aquí es que el bucle no cuenta nada y no puede contar porque no tiene un "contador" atornillado en ))))

OrderSelect() devuelve un valor booleano, verdadero o falso, que no es apropiado para la variable pos. Y es mejor que el bucle comience por el orden más antiguo, es decir, en orden inverso, para evitar saltarse órdenes.

La variable Total puede ser útil como contador:

He eliminado cosas innecesarias, he añadido la salida de error después de OrderSend, para el probador en las cuentas no ECN las órdenes ya abiertas:

Ah sí, también el cálculo del nivel de SL para las ventas estaba mal, hay que tener más cuidado.

¡¡Wow!! ¡¡¡Gracias!!! Eso requiere cierta reflexión.

¿Tal vez haya un "autoestudio" sobre las nuevas normas en algún lugar? El número de página de 4 dígitos es un poco estresante...