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

 
hoz:

Hay una función. Aquí están sus inicios:

Esto es lo esencial. El segundo parámetro formal de la función tiene un valor por defecto de 0. Así que, según la documentación, puedo llamar a esta función sin el segundo parámetro, porque por defecto será 0.

Lo llamo así:

El compilador frunce el ceño:

¿Por qué?

Muévelo de la biblioteca al código de lo que se hace. Si el error desaparece, entonces hay un problema con la conexión correcta de la biblioteca en el código wha-tam-do. En primer lugar.

Si no desaparece, mira qué parámetros se pasan a la función. En idea, debe haber un parámetro de tipo cadena con el nombre del par de divisas. Basta con pasar Symbol()

 
artmedia70:

Muévelo de la biblioteca al código wha-tam-do. Si el error desaparece, significa que hay un problema con la conexión correcta de la biblioteca en el código wha-tam-do. En primer lugar.

Si no desaparece, mira qué parámetros se pasan a la función. En idea, debe haber un parámetro de tipo cadena con el nombre del par de divisas. Basta con pasar Symbol().



Realmente ayuda. Lo pensaré.

Esto es muy raro. ¿Por qué debo buscar en la biblioteca si el paso de parámetros es correcto? El error está claramente escrito. ¿O no hay nada específico? Ojalá supiera lo que se necesita.

Esta función es prestada, por lo que la publico con los contactos del autor:

//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Получаем торговую информацию по символу                                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
void fGet_MarketInfo (string fs_Symbol, int fi_Ticket = 0)
{
//----
         if (fs_Symbol != bs_Symbol || fi_Ticket < 0)
         {
                  if (fi_Ticket > 0)
                  {
                     bs_Symbol = OrderSymbol();
                  }
                  else
                  {
                     bs_Symbol = fs_Symbol;
                  }
                  if (bs_Symbol == Symbol())
                  {
                      bi_SymDigits = Digits;
                      bd_SymPoint = Point;
                  }
                  else
                  {
                      bi_SymDigits = MarketInfo (fs_Symbol, MODE_DIGITS);
                      bd_SymPoint = MarketInfo (fs_Symbol, MODE_POINT);
                  }
        if (bd_SymPoint == 0.0)
        {
           bd_SymPoint = fGet_Point (fs_Symbol);
        }
                  bd_ProfitMIN = NDP (ProfitMIN_Pips);
         }
         if (fi_Ticket > 0)
         {
            fGet_OrderDetails (fi_Ticket);
         }
    //---- Получаем текущие цены по инструменту
    RefreshRates();
    bda_Price[0] = NDD (fGet_TradePrice (0, bb_RealTrade, bs_Symbol));
    bda_Price[1] = NDD (fGet_TradePrice (1, bb_RealTrade, bs_Symbol));
    bd_Spread = NDD (bda_Price[1] - bda_Price[0]);
//----
}

Así es como lo importé:

#import "hoz_Base@Library.ex4"
    double ND (double v);
    string DToS (double v);
    string DToSByLots (double v);
    void fGet_MarketInfo (string fs_Symbol, int fi_Ticket = 0);
#import

La llamada ahora es así:

fGet_MarketInfo (fs_Symbol);

¿Cómo se resuelven estos problemas?

 
hoz: ¿Cómo se resuelven estos problemas?

Estudie la documentación. Las bibliotecas compiladas no pasan parámetros por defecto - debe pasar TODOS los parámetros cuando llame a una función. Léelo con atención. Extracto:

Como las funciones importadas están fuera del módulo que se está compilando, el compilador no puede verificar que los parámetros pasados sean correctos. Por lo tanto, la composición y el orden de los parámetros pasados a las funciones importadas deben describirse con precisión para evitar errores en tiempo de ejecución. Los parámetros pasados a las funciones importadas (tanto de los módulos EX4 como DLL) no pueden tener valores por defecto.
 
TarasBY:

No se pasan parámetros por defecto a las bibliotecas compiladas - debe pasar TODOS los parámetros cuando llame a una función. Léelo con atención. Extracto:

Como las funciones importadas están fuera del módulo que se está compilando, el compilador no puede verificar que los parámetros pasados sean correctos. Por lo tanto, la composición y el orden de los parámetros pasados a las funciones importadas deben describirse con precisión para evitar errores en tiempo de ejecución. Los parámetros pasados a las funciones importadas (tanto de los módulos EX4 como DLL) no pueden tener valores por defecto.

Ah, eso es. ¡Vive y aprende! Gracias, lo tendré en cuenta.
 

Al ejecutar la optimización en MT4, necesitamos recibir información sobre una pasada en la pestaña "Resultados de la optimización" similar a la generada por una pasada en la pestaña "Informe".

¿Cómo se puede poner en práctica?

 

Decidí familiarizarme con la biblioteca. He copiado parte del código de mi indicador y lo he pegado en una función, y he copiado y pegado esta función en dos archivos de biblioteca.

El primero lo he llamado "indi.mqh" y el segundo simplemente "djo.mq4".

int countbars(int& hist, int obrax, bool tikk)
{ 
 int z=0;
 static int PreBars=0; 
 static datetime BarTime=0;
 if (Bars == PreBars && tikk==false)return(-1);
 if (Bars < hist+obrax)  
 {
  if (Bars-obrax<=1) {Alert (" Недостатьньо історії");return(-1);}
  hist=Bars-obrax;
 }
 
 if (Bars-PreBars == 0 && BarTime==Time[0] && tikk==true) return(0);
 else  
 {
  if (Bars-PreBars == 1 && BarTime==Time[1]) z=1;
  else  z=hist;
 }
 PreBars = Bars;  
 BarTime=Time[0];
 return (z);
}

En cuanto a la primera, todo funciona según lo previsto;

 include <indi.mqh>

al sustituir la primera por la segunda y acceder a la segunda por un método:

#import "djo.ex4"  int countbars(int& hist, int obrax, bool tikk);  #import

Pero nada funciona en absoluto, ni siquiera las alertas - en ninguna parte después del inicio. Y justo ahora y el terminal se cerró solo ))

Como supongo que todas las constantes se reinicializan cada vez que accedo a la función importada?

¿Dónde puedo leer sobre la importación de mql4 en detalle, qué errores se han solucionado o no, etc.?

Gracias, me voy a dormir............

 
ALXIMIKS:

Decidí familiarizarme con la biblioteca. Tomé una parte de código de mi indicador y lo puse en la función, y multipliqué esta función y la pegué en dos archivos de la biblioteca.

El primero lo he llamado "indi.mqh" y el segundo simplemente "djo.mq4".

En cuanto a la primera, todo funciona según lo previsto;

al sustituir la primera por la segunda y acceder a la segunda por un método:

Pero nada funciona en absoluto, ni siquiera las alertas - en ninguna parte después del inicio. Y justo ahora y el terminal se cerró solo ))

Como supongo que todas las constantes se reinicializan cada vez que accedo a la función importada ?

¿Dónde puedo leer sobre la importación de mql4 en detalle, qué errores se han solucionado o no, etc.?

Gracias, me voy a dormir............

Es posible pasar parámetros por referencia. En este caso, la modificación de dichos parámetros afectará a las variables correspondientes en la función llamada pasada por referencia. No se pueden pasar elementos de arrays por referencia. Los parámetros pueden ser pasados por referencia sólo dentro de los límites de un único módulo, tal oportunidad no se proporciona para las funciones de la biblioteca. Para especificar que el parámetro se pasa por referencia, debe colocarse el modificador & después del tipo de datos. Y aquí hay más experimentos.
 
Dime. Recibo un mensaje sonoro cuando cruzo dos medias móviles. Cuando se abre, este mensaje sonoro se repite tantas veces como cruces ha habido en la historia. Pregunta. Cómo puedo conseguir que produzca un mensaje sólo para las señales que se han generado en el tiempo presente. Es decir, sólo en el momento y la señal que se recibió literalmente en el momento...
 
Zolotai:
Dime. Recibo un mensaje sonoro cuando cruzo dos medias móviles. Cuando se abre, este mensaje sonoro se repite tantas veces como cruces ha habido en la historia. Pregunta. Cómo puedo conseguir que produzca un mensaje sólo para las señales que se han generado en el tiempo presente. Es decir, sólo en el momento y la señal que se recibió literalmente en el momento...
¿En la apertura de qué? Se siente como un indicador. Hay muchas soluciones. Todo depende del código.
 
artmedia70:
¿Al abrir qué? Se siente como un indicador. Hay muchas soluciones. Todo depende del código.


No tiene nada que ver con el código. Sólo necesito la condición adecuada. La pregunta es si podemos saber la hora de la barra actual. ¿Cómo puedo saber la hora del bar?