Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1022

 

Ou laissez-moi poser une question plus simple :

Dans la fonction OnCalculate(), une boucle est insérée, de sorte qu'il n'y a qu'une seule itération, la suivante ne se produisant que lorsque le graphique est mis à jour.....

 
ara66676:

Ou laissez-moi poser une question plus simple :

Dans la fonction OnCalculate(), une boucle est insérée, de sorte qu'il n'y a qu'une seule itération, la suivante ne se produisant que lorsque le graphique est mis à jour.....

On dirait que vous avez besoin d'un médium ou d'un CODE POUR ÉTUDIER.
 
bistreevseh:
Merci beaucoup ! Cela fonctionne étrangement j'ai les droits d'administrateur, spécifiquement pour le dossier terminal j'ai donné toutes les destructions au propriétaire, cela a aidé, mais ensuite cela a cessé de fonctionner. Puis j'ai essayé de lire le fichier journal en utilisant le FileReadStrArrayW (si je ne me trompe pas de nom) lire les lignes vides, le script se bloque en mode ansi. Seul FileReadCharArr était capable de lire les codes ansi. Peut-être avez-vous un exemple de l'analyse du fichier journal avec votre bibliothèque ? Je vous en serais très reconnaissant !

Oui, il y a un problème dans la lecture du journal maintenant. C'était plus facile avant.

Le problème est que le fichier lui-même est codé en ANSI, mais les chaînes de caractères sont maintenant UNICODE.

Voici un tel script qui fonctionne :

#property strict
#property script_show_inputs

#include <FileFunctions.mqh>

input int NumLines = 10;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  string sPath = TerminalPath() + "\\MQL4\\Logs\\" + sName + ".log";
  Print(sPath);
  
  if (!FileCheckW(sPath))
   {
    Print("Файл отсутствует!");
    return;
   }
    
  int hFile = FileOpenExistingW(sPath, GENERIC_READ, SHARE_READ);
  if (hFile == NULL)
   {
    Print("Файл не открыт!");
    return;
   }

  string asArray[];
  ArrayResize(asArray, NumLines);
  Print("hFile = ", hFile);
  for (int i = 0; i < NumLines; i++) asArray[i] = string(i) + "                                                                                                                                                                                                                                                          ";
  FileReadStrArrayMW(hFile, asArray, ArraySize(asArray), 0, NumLines);
  FileCloseHandle(hFile);
  for (int i = 0; i < NumLines; i++) Alert(asArray[i]);
 }

Mais cela ne fonctionnera que si le fichier journal est d'abord enregistré en UNICODE !

C'est-à-dire que la bibliothèque fonctionne correctement. Nous devons trouver un moyen simple de convertir l'encodage ANSI du fichier en tableau de chaînes UNICODE, ou je devrais ajouter à la bibliothèque une fonction qui convertirait l'encodage des chaînes lors de la lecture du fichier.

=====================

Option 1 : Vous n'avez pas à vous occuper des tableaux. Lire le fichier entier en ANSI, le convertir en UNICODE, puis l'analyser en utilisant MQL.

Variante 2. Lisez-le en ANSI, écrivez-le dans le répertoire courant du terminal et lisez-le en utilisant les fonctions MQL pour les fichiers CSV.

Option 3. Créez un lien symbolique vers le fichier journal dans le bac à sable en utilisant la fonction de la même bibliothèque et lisez-le en utilisant les fonctions MQL pour travailler avec des fichiers CSV :

#property strict
#include <FileFunctions.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
 {
  string sName = TimeToString(TimeLocal(), TIME_DATE);
  StringReplace(sName, ".", "");
  sName += ".log";
  
  string sPathLogs = TerminalPath() + "\\MQL4\\Logs\\" + sName;
  string sPathFiles = TerminalPath() + "\\MQL4\\Files\\" + sName;
  
  Print(sPathLogs);
  Print(sPathFiles);
  
  if (!FileCheckW(sPathLogs))
   {
    Print("Файл отсутствует!");
    return;
   }
  
  if (!FileCheckW(sPathFiles) && !FileSymbolicLinkW(sPathLogs, sPathFiles))
   {
    Print("Символьная ссылка не создана!");
    return;
   }
  
  int hFile = FileOpen(sName, FILE_READ|FILE_CSV|FILE_ANSI, '\t');
  if (hFile == INVALID_HANDLE)
   {
    Print("Файл не открыт!");
    return;
   }
  
  while (!FileIsEnding(hFile)) Alert(FileReadString(hFile));
  FileClose(hFile);
 }

À mon avis, c'est l'option la plus agréable et la plus facile.

 

J'essaie d'écrire un indicateur de canal. J'ai calculé les valeurs à dessiner sur le graphique et je les ai placées dans des tableaux double tob[] et double tos[], mais lorsque j'essaie de les connecter au tampon pour le dessin sur le graphique - aux lignes 25 et 26 :

SetIndexBuffer(0, tob);
SetIndexBuffer(1, tos);

ces tableaux à la place des valeurs requises, par exemple :

0/1.424/1.3679
1/1.42/1.3639

sont remplis avec le nombre 2147483647, comme ceci :
0/2147483647/2147483647
1/2147483647/2147483647
2/2147483647/2147483647

Comment peut-on y remédier ?

Dossiers :
channel1.mq4  7 kb
 
Existe-t-il des touches de raccourci pour passer rapidement d'une période à l'autre ?
En appuyant sur D , H1 passe à M15 , et en appuyant sur U , passe à H1.
 

Aidez-moi à trouver un modèle pour MT4 pour séparer la nuit et le jour.

Disons que le graphique de 00:00 à 8:00 est d'une couleur et que celui de 8:00 à 00:00 est d'une couleur différente.

 

Salutations à tous.

Face à ce problème :

Un extrait du code du robot :

int per=Period() ;
if(per = 60)
{

Print("Si la période n'est pas H1, cette ligne ne devrait pas être dans le journal") ;

Commentaire (...) ;

... //les deux corps du robot

...

...

}

implique que ni le corps du robot, ni la ligne Print(...), ni le Commentaire(...) à l'écran ne seront exécutés si une période autre que H1 est activée sur le graphique.

Cependant, tout est exécuté sur n'importe quelle période. Pourquoi ?

Comment écrire correctement, que si la période sur le graphique ne correspond pas à celle spécifiée - retour du contrôle au terminal. (Au fait, j'ai essayé RETURN (0) - cela n'aide pas - tout s'imprime encore...)

 
Dikons:

Salutations à tous.

Face à ce problème :

Extrait de code du robot :

int per=Period() ;
if(per = 60)
{

Print("Si la période n'est pas H1 - cette ligne ne doit pas figurer dans le journal de bord") ;

Commentaire (...) ;

... // puis le corps du robot

...

...

}

implique que ni le corps du robot, ni la chaîne Print(...), ni Comment(...) à l'écran ne seront exécutés si une période autre que H1 est activée dans le graphique.

Cependant, tout est exécuté sur n'importe quelle période. Pourquoi ?

Comment enregistrer correctement que si le délai ne correspond pas à celui fixé - retour du contrôle au terminal. (Au fait, j'ai essayé RETURN (0) - cela ne fonctionne pas - tout s'imprime toujours...)

Vous faites une affectation, vous avez besoin d'une comparaison if(per == 60)
 
Trader76:
Vous faites une affectation, alors que vous avez besoin d'une comparaison if(per == 60)

Merci camarade... J'ai le cerveau tout retourné... J'ai fait une pause significative dans la programmation - j'ai oublié beaucoup du peu que je sais...

---

Une dernière question... Fragment de recherche des max/mini des 8 premières heures d'une journée par terminal :

int h=TimeHour(TimeCurrent()) ; // trouver l'heure terminale actuelle (0...23)
if (h<8) return(0) ; // si pas de H1 des 8 premières bougies du jour = laisser...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)] ; // détermine les 8 premières bougies maximales du jour.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)] ;


Les deux dernières lignes ne fonctionnent pas correctement si la période du graphique est définie sur autre chose que H1. Pourquoi ? Parce que le robot a été explicitement assigné à une période pour les calculs...

Si vous mettez H4 sur le graphique, par exemple, le robot le rééquilibrera en utilisant des bougies H4 (il en va de même pour les autres horizons temporels).

 
Dikons:

Merci camarade... J'ai le cerveau tout retourné... J'ai eu une pause significative dans la programmation - j'ai oublié beaucoup du peu que je sais...

---

Une dernière question... Fragment de recherche des max/mini des 8 premières heures d'une journée par terminal :

int h=TimeHour(TimeCurrent()) ; // trouver l'heure terminale actuelle (0...23)
if (h<8) return(0) ; // si pas de H1 des 8 premières bougies du jour = laisser...

double Maxi=High[iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)] ; // détermine les 8 premières bougies maximales du jour.

double Mini=Low[iLowest(NULL,PERIOD_H1,MODE_LOW,8,h-7)] ;


Les deux dernières lignes ne fonctionnent pas correctement si la période du graphique est définie sur autre chose que H1. Pourquoi ? Parce que le robot a été explicitement assigné à une période pour les calculs...

Si vous mettez H4 sur le graphique, par exemple, le robot le rééquilibrera en utilisant des bougies H4 (il en va de même pour les autres horizons temporels).

Ici vous obtenez le nombre de barres max/min : iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7)

Et ensuite vous insérez par exemple la barre numéro 2 et vous obtenez :High[2] et sur une autre période vous obtiendrez une valeur différente de H1. Lire à propos de High.

iHigh(NULL,PERIOD_H1, iHighest(NULL,PERIOD_H1,MODE_HIGH,8,h-7))

Raison: