Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1060

 
Igor Zakharov:

Il ne s'agit pas d'un remplacement - MB ne fonctionne pas dans les indicateurs car il arrête l'écoulement jusqu'à ce que le bouton soit pressé !

Je l'ai indiqué par inadvertance, mais ce n'est pas du tout ce que dit la note :

Note

Il n'est pas recommandé d' utiliser cette fonction dans les indicateurs personnalisés, car l'appel de MessageBox() arrête l'exécution du fil de l'indicateur pendant toute la durée d'attente de la réponse de l'utilisateur. Et comme tous les indicateurs de chaque symbole sont exécutés dans un seul thread, tous les graphiques de toutes les échéances pour ce symbole seront arrêtés.

Lorsque vous travaillez dans le testeur de stratégie, la fonction MessageBox() n'est pas exécutée.

 
MakarFX:

Je ne suis pas un programmeur, j'édite l'indicateur pour ma propre convenance. Je ne l'ai pas vérifié dans le testeur, mais en temps réel.

D'ailleurs, les télépathes n' existent pas.

Si vous savez quels sont les indicateurs disponibles ici qui utilisent cette fonction, dites-le moi, peut-être que je le découvrirai moi-même.

Merci

Nous avons tout.

Клуб Телепатов
Клуб Телепатов
  • 2011.05.08
  • www.mql5.com
Клуб телепатов Вас послали сюда? Тогда давайте знакомиться! Как же такое могло случиться со мной...
 
Artyom Trishkin:

Vous déclarez une variable avec le type de structure dans la portée locale, et c'est ce que vous envoyez à la fonction. Dans le même périmètre local.

Le fait est que lorsque vous créez une variable pour une structure dans le champ, sa portée s'étend à l'ensemble de la fonction et non à une zone locale. Voici un exemple.

int OnInit()
  {
{int In=8;
 MyPoint qr;}
qr - видна здесь
In - здесь не видна
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason){}

struct MyPoint
{
    int x[5];
    int y;
};

Il s'avère qu'il n'est plus possible de travailler localement.

 

J'essaie de lire les données d'un fichier csv dans un script. Pas de chance et je ne comprends pas du tout pourquoi.

J'utilise une procédure simple pour le lire :

bool GetBiFromFile(string InFNam,int& alBars,double& xClose[],datetime& xTime[])
{  int  InHndl,nBars;
   bool fset;
   double aval;
   
   InHndl = FileOpen(InFNam+".csv",FILE_READ|FILE_CSV,",");
   if (InHndl==INVALID_HANDLE) {
       Print("File "+InFNam+" does not open. Error: ", GetLastError()); 
       return(false); 
   } else {
      fset = FileSeek(InHndl,0,SEEK_SET);
      ArrayResize(xClose,alBars);      
      ArrayInitialize(xClose,0.0);  
      ArrayResize(xTime,alBars);       
      ArrayInitialize(xTime,0);  
      nBars = 0;
      while (!FileIsEnding(InHndl)) {
         nBars++;
         xTime[nBars-1]  = FileReadDatetime(InHndl);;
         xClose[nBars-1] = FileReadDouble(InHndl);
         aval = FileReadDouble(InHndl);
         if (nBars>=alBars) break;
      }
   }
   Print("nBars = ",nBars,"   allBars = ",alBars);
   Print("Start: ",xClose[0],"   " + TimeToString(xTime[0],TIME_DATE|TIME_SECONDS));
   Print("End: ",xClose[nBars-1],"   " + TimeToString(xTime[nBars-1],TIME_DATE|TIME_SECONDS));
   return(true);
}

Le fichier contenant les données a la forme suivante :

2012.01.02 02:00:02,1.293240,1.293410

2012.01.02 02:00:52,1.293330,1.293500

2012.01.02 02:00:55,1.293810,1.293980

....

Et le résultat des instructions Print() de la procédure est le suivant

nBars = 1000 alBars = 1000

Début : 0.0 2020.01.29 01:00:00

Fin : 0.0 2020.01.29 01:00:00

C'est-à-dire que toutes les lignes sont traitées dans la boucle de lecture, mais rien n'est lu. Et aucun message d'erreur.

Quelqu'un peut-il m'expliquer cela ?


 
Yurixx:

Quelqu'un peut-il m'expliquer cela ?

Les fonctions binaires lisent un fichier texte.

 
Alexey Viktorov:

Nous avons tout.

Tu es méchant !

 
MakarFX:

Tu es méchant !

Je fais semblant.

Si vous voulez comprendre la programmation, commencez à essayer de la comprendre. Si vous avez juste besoin de le faire, allez sur le fil de discussion où ils proposent de l'écrire gratuitement, postez-y votre indicateur et décrivez votre demande.


ps : j'ai tout vérifié. Pour une raison quelconque, Alert(), même si elle est placée avant PlaySound(), ne joue pas le son sélectionné. Peut-être que ma mémoire est mauvaise, mais ce n'est pas le problème.

Vous pouvez mettre en sourdine Alert() en double-cliquant dessus pour obtenir une croix rouge.


et dans ce cas, peu importe ce qui est écrit devant Alert() ou PlaySound().

 
Alexey Viktorov:

Je fais semblant.


et dans ce cas, cela ne fera aucune différence que l'on dise Alert() ou PlaySound() devant

Dans ce cas, la fenêtre d'alerte ne s'ouvre pas.(

 
fxsaber:

Vous lisez un fichier texte avec des fonctions binaires.

Il est dit à propos de la fonctionFileReadDouble() qu'elle lit à partir d'un fichier binaire.

Mais il est dit à propos deFileReadDatetime(): "Lit à partir du fichier CSV une chaîne de caractères dans l'un des formats suivants : "AAAA.MM.DD HH:MI:SS", "AAAA.MM.DD" ou "HH:MI:SS" - et la convertit en valeur de date".

De même, la même image s'est produite lorsque j'ai utiliséFileReadString() et que j'ai ensuite converti moi-même les chaînes de caractères au bontype.

Comment pensez-vous que je devrais m'y prendre ?


 
Yurixx:

Comment pensez-vous que cela devrait être fait ?

void OnStart()
{
  datetime time;
  
  double PriceBid;
  double PriceAsk;
  
  string Str = "2012.01.02 02:00:02,1.293240,1.293410";
  string StrArray[];
  
  if (StringSplit(Str, ',', StrArray) > 2)
  {
    time = (datetime)StrArray[0];
    
    PriceBid = (double)StrArray[1];
    PriceAsk = (double)StrArray[2];
  }
}