Comment importer le bid/ask d'une autre paire de devises ? - page 5

 
HosseinKOGO:

C'est la journée entière de GBPAUD H4 3.12.2018 ! Et je n'ai pas sauté jusqu'à la fin cette fois-ci.

La fonction d'impression peut-elle perdre certains rapports lorsqu'elle en a trop à imprimer ?
Je suppose qu'un autre problème pourrait être parce que les ticks de ces 3 instruments sortent dans différentes millisecondes, donc lorsque nous utilisons la fonction start/OnTick sur GBPAUD, il fait juste la fonction de démarrage chaque fois que le tick GBPAUD sort. Et je suppose que votre code pourrait dire de retourner tous les prix de ces 3 paires quand aucun d'entre eux n'est 0. Si c'est le cas, il retourne tous les prix ask/bid de tous les instruments au même moment exact.

Les données semblent correctes...

Vous avez raison à propos de la fonction d'impression... Je vois aussi beaucoup de lignes manquantes dans mes tests. Mais lorsque j'imprime tout dans un fichier, rien ne manque.

Voici quelques informations sur le code : le temps de chaque tick GBPAUD sera utilisé pour obtenir les ticks les plus récents des autres paires (jusqu'au même moment), donc il retournera toujours quelque chose, ce ne sera pas zéro.

J'ai décidé de mettre la fonction dans une classe, ce qui devrait être plus ordonné. Voir la pièce jointe. Placez-la dans votre dossier expert, avec votre EA. N'hésitez pas à la modifier.

L'exemple suivant vous montre une façon de l'utiliser (les lignes surlignées sont essentielles) :

#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);
}

La clé est donc juste cette ligne :ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Si elle renvoie false, vous devrez vérifier le journal pour le message d'erreur.

Dossiers :
TicksInfo.mqh  5 kb
 
Seng Joo Thio:

Les données semblent correctes...

Vous avez raison à propos de la fonction d'impression... Je vois aussi beaucoup de lignes manquantes dans mes tests. Mais lorsque j'imprime tout dans un fichier, rien ne manque.

Voici quelques informations sur le code : le temps de chaque tick GBPAUD sera utilisé pour obtenir les ticks les plus récents des autres paires (jusqu'au même moment), donc il retournera toujours quelque chose, ce ne sera pas zéro.

J'ai décidé de mettre la fonction dans une classe, ce qui devrait être plus ordonné. Voir la pièce jointe. Placez-la dans votre dossier expert, avec votre EA. N'hésitez pas à la modifier.

L'exemple suivant vous montre une façon de l'utiliser (les lignes surlignées sont essentielles) :

La clé est donc juste cette ligne :ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Si elle renvoie false, vous devrez vérifier le journal pour le message d'erreur.

Merci pour votre aide,

J'ai copié toutes ces lignes dans toutes les zones appropriées. Mais comme je ne comprends pas le code, veuillez me conseiller sur la façon de mettre les Ask et Bid de SecondPair dans Ask2,Bid2 et la même chose pour ThirdPair.
Voici ma zone globale :

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

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

int tickCount = 0;
.
.
.

Et Cette partie retourne 2 erreurs lors de la compilation. Que dois-je faire avec elles ?
'SecondPair' - expression constante requise MyEA !.mq4
ThirdPair' - expression constante requise MyEA !.mq4

 
HosseinKOGO:

Merci pour votre aide,

J'ai copié toutes ces lignes dans toutes les zones appropriées. Mais comme je ne comprends pas le code, veuillez me conseiller sur la façon de mettre les valeurs Ask et Bid de SecondPair dans Ask2,Bid2 et la même chose pour ThirdPair.
Voici ma zone globale :

Et Cette partie renvoie 2 erreurs lors de la compilation. Que dois-je faire avec elles ?
'SecondPair' - expression constante requise MyEA !.mq4
ThirdPair' - expression constante nécessaire MyEA !.mq4

Alors déclarez vos otherPairs de la même manière que allPairs. Et dans OnInit, faites ceci :

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

Et pour assigner des valeurs dans Ask2, Bid2, Ask3, Bid3, faites ceci dans 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:

Puis déclarez vos otherPairs de la même manière que allPairs. Et dans OnInit, faites ceci :

Et pour assigner des valeurs dans Ask2, Bid2, Ask3, Bid3, faites ceci dans OnTick :

Cela me donne à nouveau 00 :(
Ma zone globale :

#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 MonEA ! GBPAUD,H4 : Erreur GBPCAD
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA ! GBPAUD,H4 : Erreur GBPUSD
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA ! GBPAUD,H4 : GBPAUD tick numéro 221179, at 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 MonEA ! GBPAUD,H4 : === Traiter maintenant le tick 221179



Où est-ce que je me trompe ?
Je suis désolé pour mon niveau zéro de compétence :D

 
HosseinKOGO:

Je reçois à nouveau 00 :(
Ma zone globale :

OnInit :

OnDeinit :

OnTick :

Où est-ce que je me trompe ?
Je suis désolé pour mon niveau zéro de compétence :D

OnInit - les 3 nouvelles lignes devraient aller avant tout.
 
HosseinKOGO:

Je suis désolé pour mon niveau zéro de compétence :D

Tout est question de variables et de fonctions, et de la volonté d'expérimenter.
 
Seng Joo Thio:
OnInit - les 3 nouvelles lignes doivent aller avant tout.

Je l'ai fait. Mais c'est très étrange : le timer pour ces deux paires supplémentaires ne fonctionne pas...

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:

Je l'ai fait. Mais c'est très étrange : la minuterie pour ces deux paires supplémentaires ne fonctionne pas...

Montre-moi l'ensemble de l'ea, après que tu as fini d'expérimenter et que tu n'arrives toujours pas à comprendre pourquoi. Je peux jeter un coup d'œil dans environ 8 heures :). Maintenant, j'ai besoin de 😴... 😂
 
  1. Seng Joo Thio: OnInit - les 3 nouvelles lignes doivent être placées avant tout le reste.
    N'essayez pas d'utiliser des fonctions liées au prix ou au serveur dans OnInit (ou au chargement), car il se peut qu'il n'y ait pas encore de connexion/charte :
    1. Le terminal démarre.
    2. Les indicateurs et les AE sont chargés. Les variables statiques et globales déclarées sont initialisées. (Ne dépendent pas d'un ordre spécifique).
    3. OnInit est appelé.
    4. Pour les indicateurs, OnCalculate est appelé avec tout historique existant.
    5. L'homme peut avoir à entrer un mot de passe, la connexion au serveur commence.
    6. Un nouvel historique est reçu, OnCalculate est appelé à nouveau.
    7. Un nouveau tick est reçu, OnCalculate/OnTick est appelé. Maintenant TickValue, TimeCurrent, les informations du compte et les prix sont valides.

  2. Sur MT4 : A moins que le graphique actuel ne soit la paire/TF spécifique référencée, vous devez gérer les erreurs 4066/4073avant d' accéder aux prix.
    Historique de téléchargement dans l'EA MQL4 - MQL4 et MetaTrader 4 - Forum de programmation MQL4
    Corrigé

    La fonction liée à, ouvre un graphique caché pour le symbole/TF en question (s'il n'est pas déjà ouvert,) mettant ainsi à jour l'historique, et plaçant temporairement le symbole sur Market Watch (s'il n'y est pas déjà,) afin que SymbolInfoDouble(symbol, SYMBOL_BID ) ou MarketInfo(symbol, MODE_BID ) ne retournent pas également zéro au premier appel.

 
William Roeder:
  1. N'essayez pas d'utiliser des fonctions liées au prix ou au serveur dans OnInit (ou au chargement), car il se peut qu'il n'y ait pas encore de connexion/charte :
    1. Le terminal démarre.
    2. Les indicateurs et les AE sont chargés. Les variables statiques et globales déclarées sont initialisées. (Ne dépendent pas d'un ordre spécifique).
    3. OnInit est appelé.
    4. Pour les indicateurs, OnCalculate est appelé avec tout historique existant.
    5. L'homme peut avoir à entrer un mot de passe, la connexion au serveur commence.
    6. Un nouvel historique est reçu, OnCalculate est appelé à nouveau.
    7. Un nouveau tick est reçu, OnCalculate/OnTick est appelé. Maintenant TickValue, TimeCurrent, les informations du compte et les prix sont valides.

  2. Sur MT4 : A moins que le graphique actuel ne soit la paire/TF spécifique référencée, vous devez gérer les erreurs 4066/4073avant d' accéder aux prix.
    Historique de téléchargement dans l'EA MQL4 - MQL4 et MetaTrader 4 - Forum de programmation MQL4
    Corrigé

    La fonction liée, ouvre un graphique caché pour le symbole/TF en question (s'il n'est pas déjà ouvert,) mettant ainsi à jour l'historique, et plaçant temporairement le symbole sur Market Watch (s'il n'y est pas déjà,) afin que SymbolInfoDouble(symbol, SYMBOL_BID ) ou MarketInfo(symbol, MODE_BID ) ne renvoient pas également zéro au premier appel.

Vous avez raison. Pas d'inquiétude cependant, car les seules choses que nous faisons dans OnInit, ici, sont d'initialiser les tableaux pour stocker les noms des symboles, et de préparer quelques handles de fichiers pour lire nos propres fichiers de données. Quant aux prix d'achat et de vente (c'est-à-dire les données de "tick"), nous n'y accédons que dans OnTick, et principalement à partir de nos propres fichiers de données, puisque le testeur de stratégie MT4 renvoie toujours des zéros lorsqu'il est interrogé sur les données d'autres symboles (notez que ce comportement diffère de la récupération des données OHLC, avec lesquelles les gens sont plus familiers).