[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 364

 
Alsu, la variable 'n' dans votre code n'est pas claire. S'il s'agit du nombre de champs, comment le trouver s'il n'est pas connu à l'avance ?
 
sibemol >> :
M. Alsu, je ne comprends pas la variable 'n' dans votre code. Si c'est le nombre de champs, comment le trouver si on ne le connaît pas à l'avance ?

Mais vous allez écrire quelque chose dans le fichier, n'est-ce pas ? Ou voulez-vous dire que la structure du CSV n'est pas connue à l'avance ? Alors quel est le sens de l'ajouter si nous ne connaissons ni le nombre de champs, ni leur type (chaîne, entier, flottant, temps), ni la charge sémantique ?

 
alsu >> :

Mais vous allez écrire quelque chose dans le fichier, n'est-ce pas ? Ou voulez-vous dire que la structure du CSV n'est pas connue à l'avance ? Alors quel est l'intérêt d'en ajouter si l'on ne connaît ni le nombre de champs, ni leur type (chaîne, entier, flottant, temps), ni la charge sémantique ?

Ma tâche est simple - écrire dans un fichier csv les cotations de l'instrument actuel pour les transférer vers une autre application. Tout est écrit avec succès si la boucle de collecte de données for(int i=Bars-1 ; i>=0 ; i--). Mais si nous optimisons le code en utilisant :

int counted_bars=IndicatorCounted(), limit ;
si (counted_bars==0) limit=Bars-1 ;
si (barres comptées>0) limit=Bars-comptées_bars-1 ;

avec une boucle for(int i=limit ; i>=0 ; i--),

et au lieu de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",") ;

insérer int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

alors la barre de zéro est écrite au début du fichier. Si vous utilisez FileSeek(), les lignes sont ajoutées à chaque tick, alors que nous avons besoin que la dernière ligne du fichier soit écrasée à la barre actuelle.

J'espère que tout est clair maintenant. Juste au cas où, voici le code complet non optimisé qui fonctionne :

//+------------------------------------------------------------------+
//|                                                  iHisoryBars.mq4 |
//|                                        Copyright © 2009, Sibemol |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Sibemol"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 White
//---- input parameters
double v1[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators 
   SetIndexStyle(0,DRAW_LINE);  
   SetIndexBuffer(0, v1);      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
  int counted_bars=IndicatorCounted(), limit;
  if ( counted_bars==0)  limit=Bars-1;
  if ( counted_bars>0)   limit=Bars- counted_bars-1;    
  int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV| FILE_WRITE, ",");
  //int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");    
  FileWrite( f,
  "<ticker>,<per>,<date>,<time>,<open>,<high>,<low>,<close>,<volume>,<oi>");
  for(int i=Bars-1; i>=0; i--)
    {
    v1[ i]=Close[ i];    
    int _Year=TimeYear(Time[ i]),
        _Month=TimeMonth(Time[ i]),
        _Day=TimeDay(Time[ i]),
        _Hour=TimeHour(Time[ i]),
        _Minute=TimeMinute(Time[ i]);
        
    string Y, M, D, H, Mi, Date, _Time;
        
    if(_Month<10) M="0"+DoubleToStr(_Month, 0); else M=DoubleToStr(_Month, 0);
    if(_Day<10) D="0"+DoubleToStr(_Day, 0); else D=DoubleToStr(_Day, 0);
    if(_Hour<10) H="0"+DoubleToStr(_Hour, 0); else H=DoubleToStr(_Hour, 0);
    if(_Minute<10) Mi="0"+DoubleToStr(_Minute, 0); else Mi=DoubleToStr(_Minute, 0);
    Date=DoubleToStr(_Year, 0)+ M+ D;
    _Time= H+ Mi;
        
    FileWrite( f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[ i], High[ i], Low[ i], Close[ i], Volume[ i], 0);
    
    }
    
    FileClose( f);
    
  return(0);
  }
//+------------------------------------------------------------------+
 
sibemol >> :

Ma tâche est simple - écrire les cotations de l'instrument actuel dans un fichier csv pour le transmettre à une autre application. Tout est écrit avec succès avec la boucle de collecte de données for(int i=Bars-1 ; i>=0 ; i--). Mais si nous optimisons le code en utilisant :

int counted_bars=IndicatorCounted(), limit ;
si (counted_bars==0) limit=Bars-1 ;
si (barres comptées>0) limit=Bars-comptées_bars-1 ;

avec boucle for(int i=limit ; i>=0 ; i--),

et au lieu de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",") ;

insérer int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

alors la barre de zéro est écrite au début du fichier. Si vous utilisez FileSeek(), les lignes sont ajoutées à chaque tick, alors que nous devons écraser la dernière ligne du fichier sur la barre actuelle.

J'espère que tout est clair maintenant. Juste au cas où, code complet non optimisé en cours d'exécution :


ou n'est-il pas plus facile de se souvenir de la position actuelle dans le fichier au début.

Changez avec le changement de barre.

 
Sorento >> :

ou n'est-il pas plus facile de se souvenir de la position actuelle dans le fichier au début.

Changez avec le changement de barre.


Si cela ne vous dérange pas, à quoi cela ressemblerait-il en code ?

 

Pouvez-vous me dire s'il existe une fonction permettant de désactiver tous les scripts qui se trouvent sur d'autres graphiques à partir du script actuel ? Ou mieux encore, éteignez complètement le terminal.

En effet, si l'un des scripts activés "remarque" qu'une catastrophe se prépare, il s'arrêtera et empêchera tous les autres de fonctionner. Comment faire si les cas ci-dessus sont toujours impossibles à mettre en œuvre ?

 
sibemol >> :

Ma tâche est simple - écrire dans un fichier csv les cotations du symbole actuel pour les envoyer à une autre application. Tout est écrit avec succès avec la boucle de collecte de données for(int i=Bars-1 ; i>=0 ; i--). Mais si nous optimisons le code en utilisant :

int counted_bars=IndicatorCounted(), limit ;
si (counted_bars==0) limit=Bars-1 ;
si (barres comptées>0) limit=Bars-comptées_bars-1 ;

avec boucle for(int i=limit ; i>=0 ; i--),

et au lieu de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",") ;

insérer int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

alors la barre de zéro est écrite au début du fichier. Si vous utilisez FileSeek(), les lignes sont ajoutées à chaque tick, alors que nous avons besoin que la dernière ligne du fichier soit écrasée à la barre actuelle.

J'espère que tout est clair maintenant. Juste au cas où, le code complet non optimisé fonctionne :


Je ne comprends pas quel est le problème.

Voici un extrait de votre texte, lisez les champs :

FileWrite( f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[ i], High[ i], Low[ i], Close[ i], Volume[ i], 0);

Symbole, période, date, heure, OHLCV - un total de 9 champs en CSV. Dans ma liste ci-dessus, ils sont tous lus comme des chaînes, mais cela n'a pas d'importance car ce n'est pas leur valeur, mais leur nombre dans la chaîne qui nous importe.

Remplacez n par 9 et utilisez-le, la sous-routine est universelle.

En même temps, comme Sorento l'a dit à juste titre, vous pouvez simplement écrire une variable, qui se souviendra de la position du pointeur avant chaque enregistrement. Ensuite, avant l'enregistrement suivant, vous pouvez, si nécessaire, déplacer le curseur au début du dernier enregistrement et l'écraser. Notez que vous devriez déplacer l'ouverture des fichiers vers init() et la fermeture vers deinit(). La variable f doit être déclarée de manière globale.

Voilà, c'est le plus de détails possible. Considérez-le comme un devoir : )))))))

 
Mathers >> :

Pouvez-vous me dire s'il existe une fonction permettant de désactiver tous les scripts qui se trouvent sur d'autres graphiques à partir du script actuel ? Ou mieux encore, éteignez complètement le terminal.

En effet, si l'un des scripts activés "remarque" qu'une catastrophe se prépare, il s'arrêtera et empêchera tous les autres de fonctionner. Comment faire si les cas mentionnés ci-dessus sont impossibles à mettre en œuvre ?

Je mettrais un drapeau sous la forme d'une variable globale pour le script qui pourrait être lu par d'autres scripts et nettoyé à temps.

 

alsu писал(а) >>

Eh bien, c'est à peu près aussi détaillé que vous pouvez l'être. Prenez-le comme un devoir : )))))))

Merci pour votre réponse, je vais l'essayer et vous faire part des résultats.

 
J'airetravaillé l'indicateur VSI. Je voulais obtenir les volumes en plus et en moins. Le résultat est stupéfiant. D'où vient cette idée ? Mathématiques peu claires.
Dossiers :