¿Cómo importar el bid/ask de otro par de divisas? - página 5

 
HosseinKOGO:

¡Este es el día completo de GBPAUD H4 3.12.2018! Y no he saltado hasta el final esta vez.

¿Puede ser que la función de impresión pierda algunos informes cuando tiene mucho que imprimir?
Supongo que otro problema podría ser porque los ticks de estos 3 instrumentos salen en diferentes milisegundos por lo que cuando usamos la función start/OnTick en GBPAUD, sólo hace la función de inicio cada vez que sale el tick de GBPAUD. Y supongo que su código podría decir para devolver todos los 3 pares de precios cuando no de ellos son 0. Si es así, lo hace volver cada vez que todos los precios de compra / venta de todos los instrumentos salen al mismo tiempo exacto.

Los datos parecen estar bien...

Tienes razón sobre la función de impresión... Yo también veo muchas líneas perdidas en mis pruebas. Pero cuando imprimo todo al archivo, no falta nada.

Aquí tienes algo de información sobre el código: la hora de cada tick de GBPAUD se utilizará para obtener los ticks más recientes de los otros pares (hasta la misma hora), por lo que siempre devolverá algo, no será cero.

He decidido poner la función en una clase, que debería ser más ordenada. Ver adjunto. Colóquelo en su carpeta de expertos, junto con su EA. Siéntase libre de modificarla.

El siguiente ejemplo muestra una forma de utilizarlo (las líneas resaltadas son esenciales):

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = {"GBPUSD","EURUSD"};
string allPairs[] = {};

int tickCount = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
      allPairs[i] = otherPairs[i-1];
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile(string sym, MqlTick &tick)
{
   int file = FileOpen("LogFile.log",FILE_WRITE|FILE_READ|FILE_TXT);
   FileSeek(file,0,SEEK_END);
   FileWrite(file, sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
   FileClose(file);
}

void printTick(string sym, MqlTick &tick)
{
   Print (sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
}

Así que la clave realmente, es sólo esta línea:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Si devuelve false, tendrás que buscar en el diario el mensaje de error.

Archivos adjuntos:
TicksInfo.mqh  5 kb
 
Seng Joo Thio:

Los datos parecen estar bien...

Tienes razón sobre la función de impresión... Yo también veo muchas líneas perdidas en mis pruebas. Pero cuando imprimo todo al archivo, no falta nada.

Aquí tienes algo de información sobre el código: la hora de cada tick de GBPAUD se utilizará para obtener los ticks más recientes de los otros pares (hasta la misma hora), por lo que siempre devolverá algo, no será cero.

He decidido poner la función en una clase, que debería ser más ordenada. Ver adjunto. Colóquelo en su carpeta de expertos, junto con su EA. Siéntase libre de modificarla.

El siguiente ejemplo muestra una forma de utilizarla (las líneas resaltadas son esenciales):

La clave es esta línea:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Si devuelve false, tendrás que buscar en el diario el mensaje de error.

Gracias por tu ayuda,

He copiado todas estas líneas en todas las áreas apropiadas. Pero como no entiendo el código, por favor aconséjame cómo poner el Ask y Bid de SecondPair en Ask2,Bid2 y lo mismo para ThirdPair.
Aquí está mi área global:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0;
.
.
.

Y esta parte devuelve 2 errores al compilar. ¿Qué debo hacer con ellos?
SecondPair' - expresión constante requerida MyEA!.mq4
ThirdPair' - expresión constante requerida MyEA!.mq4

 
HosseinKOGO:

Gracias por su ayuda,

He copiado todas estas líneas en todas las áreas apropiadas. Pero como no entiendo el código, por favor aconséjeme como poner el Ask y Bid de SecondPair en Ask2,Bid2 y lo mismo para ThirdPair.
Aquí está mi área global:

Y esta parte devuelve 2 errores al compilar. ¿Qué debo hacer con ellos?
SecondPair' - expresión constante requerida MyEA!.mq4
ThirdPair' - expresión constante requerida MyEA!.mq4

Entonces declara tu otherPairs de la misma manera que allPairs. Y en OnInit, haz esto:

ArrayResize(otherPairs,2);
otherPairs[0] = SecondPair;
otherPairs[1] = ThirdPair;

Y para asignar valores en Ask2, Bid2, Ask3, Bid3, haga esto en OnTick:

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");
 
Seng Joo Thio:

Entonces declare su otherPairs de la misma manera que allPairs. Y en OnInit, haga esto:

Y para asignar valores en Ask2, Bid2, Ask3, Bid3, haga esto en OnTick:

Me da 00 de nuevo :(
Mi área global:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0;
.
.
.

OnInit:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
   allPairs[i] = otherPairs[i-1];
   
   ArrayResize(otherPairs,2);
   otherPairs[0] = SecondPair;
   otherPairs[1] = ThirdPair;
.
.
.

OnDeinit:

   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);

OnTick:

   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");

Journal:
2019.05.14 17:37:14.686 2018.01.03 23:36:58 ¡Mi área global! GBPAUD,H4: Error GBPCAD
2019.05.14 17:37:14.686 2018.01.03 23:36:58 ¡MYEA! GBPAUD,H4: GBPUSD Error
2019.05.14 17:37:14.686 2018.01.03 23:36:58 ¡MiEA! GBPAUD,H4: GBPAUD número de tick 221179, a 2018.01.03 23:36:58 000 Ask = 1.72479 Bid = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 ¡MiEA! GBPAUD,H4: === Ahora procesa el tick 221179



En qué me he equivocado?
Lo siento por mi nivel cero de habilidad :D

 
HosseinKOGO:

Me da 00 de nuevo :(
Mi área global:

OnInit:

OnDeinit:

OnTick:

¿En qué me estoy equivocando?
Lo siento por mi nulo nivel de habilidad :D

OnInit - las 3 nuevas líneas deben ir antes de todo.
 
HosseinKOGO:

Lo siento por mi nivel cero de habilidad :D

Todo es cuestión de variables y funciones, y la voluntad de experimentar.
 
Seng Joo Thio:
OnInit - las 3 nuevas líneas deben ir antes de todo.

Lo he hecho. Pero es muy extraño: el temporizador para esos dos pares extra no funciona...

2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPCAD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPUSD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPAUD tick number 370711, at 2018.01.05 11:11:24 000 Ask = 1.72644 Bid = 1.72624
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO:

Lo he hecho. Pero es muy extraño: el temporizador para esos dos pares adicionales no funciona...

Enséñame el ea completo, cuando hayas terminado de experimentar y sigas sin saber por qué. Puedo echar un vistazo dentro de unas 8 horas :). Ahora necesito 😴... 😂
 
  1. Seng Joo Thio: OnInit - las 3 nuevas líneas deben ir antes de todo.
    No intente usar ninguna función relacionada con el precio o el servidor en OnInit (o en la carga,) ya que puede no haber conexión/gráfico todavía:
    1. El terminal se pone en marcha.
    2. Se cargan los indicadores/EAs. Se inicializan las variables estáticas y declaradas globalmente. (No dependen de un orden específico).
    3. Se llama aOnInit.
    4. Para los indicadores se llama a OnCalculate con cualquier historial existente.
    5. El humano puede tener que introducir la contraseña, la conexión con el servidor comienza.
    6. Se recibe un nuevo historial, se llama de nuevo a OnCalculate.
    7. Se recibe un nuevo tick, se llama a OnCalculate/OnTick. Ahora el TickValue, TimeCurrent, la información de la cuenta y los precios son válidos.

  2. En MT4: A menos que el gráfico actual sea ese par/TF específico referenciado, debe manejar los errores 4066/4073antes de acceder a los precios.
    Historial de descargas en el EA MQL4 - MQL4 y MetaTrader 4 - Foro de programación MQL4
    Corregido

    La función vinculada, abre un gráfico oculto para el símbolo/TF en cuestión (si no está ya abierto,) actualizando así el historial, y colocando temporalmente el símbolo en Market Watch (si no está ya allí,) para que SymbolInfoDouble(símbolo, SYMBOL_BID ) o MarketInfo(símbolo, MODE_BID ) no devuelvan también cero la primera llamada.

 
William Roeder:
  1. No intente usar ninguna función relacionada con el precio o el servidor en OnInit (o en la carga,) ya que puede que no haya conexión/gráfica todavía:
    1. El terminal se pone en marcha.
    2. Se cargan los indicadores/EAs. Se inicializan las variables estáticas y declaradas globalmente. (No dependen de un orden específico).
    3. Se llama aOnInit.
    4. Para los indicadores se llama a OnCalculate con cualquier historial existente.
    5. El humano puede tener que introducir la contraseña, la conexión con el servidor comienza.
    6. Se recibe un nuevo historial, se llama de nuevo a OnCalculate.
    7. Se recibe un nuevo tick, se llama a OnCalculate/OnTick. Ahora el TickValue, TimeCurrent, la información de la cuenta y los precios son válidos.

  2. En MT4: A menos que el gráfico actual sea ese par/TF específico referenciado, debe manejar los errores 4066/4073antes de acceder a los precios.
    Historial de descargas en el EA MQL4 - MQL4 y MetaTrader 4 - Foro de programación MQL4
    Corregido

    La función enlazada, abre un gráfico oculto para el símbolo/TF en cuestión (si no está ya abierto,) actualizando así el historial, y colocando temporalmente el símbolo en Market Watch (si no está ya allí,) para que SymbolInfoDouble(símbolo, SYMBOL_BID ) o MarketInfo(símbolo, MODE_BID ) no devuelvan también cero la primera llamada.

Tienes razón. Pero no te preocupes, porque lo único que hacemos en OnInit, aquí, es inicializar las matrices para almacenar los nombres de los símbolos, y preparar algunos manejadores de archivo para leer nuestros propios archivos de datos. En cuanto a los precios de las ofertas y demandas (es decir, los datos de los "ticks"), sólo estamos accediendo a ellos en OnTick, y en su mayoría desde nuestros propios archivos de datos, ya que el probador de estrategias MT4 siempre devuelve ceros cuando se consultan dichos datos de otros símbolos (tenga en cuenta que este comportamiento difiere de la recuperación de los datos OHLC, con los que la gente está más familiarizada).