[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 364

 
Alsu, die Variable "n" in Ihrem Code ist nicht klar. Wenn es sich um die Anzahl der Felder handelt, wie können Sie diese ermitteln, wenn sie nicht vorher bekannt ist?
 
sibemol >> :
Herr alsu, ich verstehe die Variable 'n' in Ihrem Code nicht. Wenn es sich um die Anzahl der Felder handelt, wie können Sie sie finden, wenn Sie sie nicht vorher wissen?

Aber Sie wollen doch etwas in die Datei schreiben, oder meinen Sie, dass die CSV-Struktur vorher nicht bekannt ist? Welchen Sinn hat es dann, etwas hinzuzufügen, wenn wir weder die Anzahl der Felder, noch ihren Typ (String, Integer, Floating, Time), noch die semantische Last kennen?

 
alsu >> :

Aber Sie wollen doch etwas in die Datei schreiben, oder meinen Sie, dass die CSV-Struktur vorher nicht bekannt ist? Welchen Sinn hat es dann, etwas hinzuzufügen, wenn wir weder die Anzahl der Felder, noch ihren Typ (String, Integer, Floating, Time), noch ihre Bedeutung kennen?

Meine Aufgabe ist einfach - zu schreiben, um csv-Datei Zitate der aktuellen Instrument für die Übertragung auf andere Anwendung. Alles wird erfolgreich geschrieben, wenn Datenerfassungsschleife for(int i=Bars-1; i>=0; i--). Aber wenn wir den Code mit optimieren:

int counted_bars=IndicatorCounted(), limit;
if (gezählte_Balken==0) limit=Balken-1;
if (gezählte_Balken>0) limit=Balken-gezählte_Balken-1;

mit einer Schleife for(int i=limit; i>=0; i--),

und anstelle von int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

dann wird der Nullstrich an den Anfang der Datei geschrieben. Wenn Sie FileSeek() verwenden, werden die Zeilen bei jedem Tick hinzugefügt, während wir die letzte Dateizeile beim aktuellen Takt überschreiben müssen.

Ich hoffe, dass jetzt alles klar ist. Nur für den Fall, hier ist die vollständige nicht optimierte Arbeits-Code:

//+------------------------------------------------------------------+
//|                                                  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 >> :

Meine Aufgabe ist einfach: Ich möchte die Kurse des aktuellen Instruments in eine csv-Datei schreiben, um sie an eine andere Anwendung zu übertragen. Mit der Datenerfassungsschleife for(int i=Bars-1; i>=0; i--) wird alles erfolgreich geschrieben. Aber wenn wir den Code mit optimieren:

int counted_bars=IndicatorCounted(), limit;
if (gezählte_Balken==0) limit=Balken-1;
if (gezählte_Balken>0) limit=Balken-gezählte_Balken-1;

mit Schleife for(int i=limit; i>=0; i--),

und anstelle von int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

dann wird der Nullstrich an den Anfang der Datei geschrieben. Wenn Sie FileSeek() verwenden, werden die Zeilen bei jedem Tick hinzugefügt, während wir die letzte Dateizeile beim aktuellen Takt überschreiben müssen.

Ich hoffe, dass jetzt alles klar ist. Nur für den Fall, dass ein vollständiger, nicht optimierter Code läuft:


oder ist es nicht einfacher, sich die aktuelle Position in der Datei am Anfang zu merken.

Wechseln Sie mit dem Balkenwechsel.

 
Sorento >> :

oder ist es nicht einfacher, sich die aktuelle Position in der Datei am Anfang zu merken.

Wechsel mit Taktwechsel.


Wenn es Ihnen nichts ausmacht, wie würde es im Code aussehen?

 

Können Sie mir sagen, ob es eine Funktion gibt, mit der alle Skripte, die sich auf anderen Diagrammen befinden, vom aktuellen Skript getrennt werden können? Oder noch besser: Schalten Sie das Terminal ganz aus.

Der Grund dafür ist, dass, wenn eines der aktivierten Skripte "merkt", dass eine Katastrophe bevorsteht, es sich selbst und alle anderen von der Arbeit abhalten würde. Wie kann dies geschehen, wenn die oben genannten Fälle immer noch nicht umsetzbar sind?

 
sibemol >> :

Meine Aufgabe ist einfach - in csv-Datei Zitate des aktuellen Symbols zu schreiben, um sie an eine andere Anwendung zu senden. Mit der Datenerfassungsschleife for(int i=Bars-1; i>=0; i--) wird alles erfolgreich geschrieben. Aber wenn wir den Code mit optimieren:

int counted_bars=IndicatorCounted(), limit;
if (gezählte_Balken==0) limit=Balken-1;
if (gezählte_Balken>0) limit=Balken-gezählte_Balken-1;

mit Schleife for(int i=limit; i>=0; i--),

und anstelle von int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

dann wird der Nullstrich an den Anfang der Datei geschrieben. Wenn Sie FileSeek() verwenden, werden die Zeilen mit jedem Tick hinzugefügt, während wir die letzte Dateizeile des aktuellen Balkens überschreiben müssen.

Ich hoffe, dass jetzt alles klar ist. Nur für den Fall, dass der vollständige, nicht optimierte Code funktioniert:


Ich verstehe nicht, wo das Problem liegt.

Hier ist ein Auszug aus Ihrem Text, lesen Sie die Felder:

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

Symbol, Zeitraum, Datum, Uhrzeit, OHLCV - insgesamt 9 Felder in CSV. In meiner obigen Auflistung werden sie alle als String gelesen, aber das spielt keine Rolle, da nicht ihr Wert, sondern ihre Nummer im String für uns von Bedeutung ist.

Setzen Sie 9 für n ein und verwenden Sie es, das Unterprogramm ist universell.

Gleichzeitig kann man, wie Sorento richtig gesagt hat, einfach eine Variable schreiben, die sich die Position des Zeigers vor jedem Datensatz merkt. Dann kann man vor dem nächsten Datensatz bei Bedarf den Cursor an den Anfang des letzten Datensatzes bewegen und ihn überschreiben. Beachten Sie, dass Sie in diesem Fall das Öffnen der Datei zu init() und das Schließen zu deinit() verschieben sollten. Die Variable f sollte global deklariert werden.

Nun, das sind so viele Details wie möglich. Betrachten Sie es als Hausaufgabe:)))))))

 
Mathers >> :

Können Sie mir sagen, ob es eine Funktion gibt, mit der alle Skripte, die sich auf anderen Diagrammen befinden, vom aktuellen Skript getrennt werden können? Oder noch besser: Schalten Sie das Terminal ganz aus.

Der Grund dafür ist, dass, wenn eines der aktivierten Skripte "merkt", dass eine Katastrophe bevorsteht, es sich selbst und alle anderen von der Arbeit abhalten würde. Wie kann dies geschehen, wenn die oben genannten Fälle nicht umsetzbar sind?

Ich würde ein Kennzeichen in Form einer globalen Variable für das Skript setzen, das von anderen Skripten gelesen und rechtzeitig bereinigt werden könnte.

 

alsu писал(а) >>

Nun, detaillierter kann man nicht werden. Betrachten Sie es als Hausaufgabe:)))))))

Vielen Dank für Ihre Antwort, ich werde es ausprobieren und Sie über die Ergebnisse informieren.

 
Ichhabe den VSI-Indikator überarbeitet, um die Volumina in Plus und Minus zu erhalten, das Ergebnis ist umwerfend, woher kommt das? Unklare Mathematik.
Dateien: