Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 478

 
lil_lil:

Es gibtFileSeek(File,0,SEEK_END); und alles wird ab einer neuen Zeile in die Datei geschrieben.

Das Problem ist, dass es 4 Dateien gibt und wir müssen Daten auf vier Positionen schreiben, jede in einer separaten Datei, jede Datei hat ein Positionsticket im Namen, aber die Daten werden nur in eine geschrieben, die letzte Datei, die Daten auf die letzte Position.

Sind die Dateinamen korrekt gebildet? Statt Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; schreiben Sie File name=(string)OrderTicket()+Symbol()+".txt"; und fügen Sie am Anfang die Anweisung #property strict ein - das hilft, Fehler zu vermeiden
 
STARIJ:
Sind die Dateinamen korrekt gebildet? Anstelle von Ticket=OrderTicket(); File name=_Ticket+Symbol()+".txt"; würde ich File name=(string)OrderTicket()+Symbol()+".txt"; schreiben und am Anfang die Anweisung #property strict hinzufügen - das hilft, Fehler zu vermeiden

Danke, die Namensbildung wurde entsprechend Ihrer Empfehlung umgestellt, aber es werden immer noch nur die Daten der letzten Position geschrieben.

Und die Namen der neuen Dateien haben sich nicht geändert. Ich vermute, dass es nicht am Namen liegt, die Datei an der letzten Position wurde sowieso gefunden.

Warum ignoriert sie die vorherigen Positionen?

 

1501896125EURUSD.txt
Zeit Hälfte BID Preis
2018.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Zeit Hälfte BID Preis
2018.02.22 22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
etwas geändert? siehe ... dies: string sy=""; int op=-1, mn=-1; kaum benötigt ... können wir es sein lassen? In der Schleife anstelle von verschachtelten if() ist es besser, fortzufahren;

Dateien:
Fileee.mq4  7 kb
 
STARIJ:

1501896125EURUSD.txt
Zeit Halb BID Preis
2018.02.22.02.22 22:53 P 1,23259 0,88322
2018.02.22 22:54 P 1,23259 0,88322
2018.02.22 22:55 P 1,23259 0,88322
2018.02.22 22:56 P 1,23249 0,88322

1501896094EURUSD.txt
Zeit Halb BID Preis
2018.02.22:43 L 1,23212 1,23203
2018.02.22 22:44 L 1,23220 1,23203
2018.02.22 22:44 L 1,23224 1,23203
2018.02.22 22:45 L 1,23244 1,23203
2018.02.02.22 22:45 L 1,23242 1,23203
2018.02.22 22:46 L 1,23251 1,23203
etwas ändern? siehe...this: string sy=""; int op=-1, mn=-1; kaum benötigt ... können wir es sein lassen? In der Schleife anstelle von verschachtelten if() ist es besser, fortzufahren;

Es will nicht über alle Positionen schreiben.

Es sind 7 Stellen zu besetzen. Ich habe eine Datei geschrieben.

Ich habe es kompiliert, als es sich auf einem Diagramm befand, und es hat begonnen, die Daten der ersten und der letzten Position zu schreiben. Jetzt habe ich nur eine einzige Angabe, die von der ersten Position stammt.

Ich kann keine sechs sehen, aber ich habe alle Häkchen inAlert(NameFile).

Was braucht es...

 
Das Programm enthält zahlreiche Bedingungen, darunter eine Bedingung, die erfüllt sein muss, damit die Datei geschrieben werden kann:
if(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent()) // einmal jede halbe Stunde ab Auftragseröffnung. Ist das notwendig?
{
t_pre=TimeCurrent();
Das Programm enthält Verzweigungen:
  for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || 
               OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     _o_t=OrderOpenTime();
И еще 5 закрывающих скобок. а можно короче на 10 строк и понятнее записать так
  for(i=0; i<k; i++) 
  {
     if( ! OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; // если ошибка выбора ордера - переходим к следующему
     if(OrderSymbol()!=sy && sy!="") continue;   // а это вообще надо?
     if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; // а другие разве у Вас есть?
     if(op>=0 && OrderType()!=op) continue;
     if(mn>=0 && OrderMagicNumber()!=mn) continue;
     _o_t=OrderOpenTime();
Welchen Zweck hatte es, sie vorher in ein Treppenhaus zu schreiben? In der alten Version von MQL4 beschleunigte es die Ausführung. Sie ist jetzt nicht von Bedeutung
Die Variable _o_t wird nur an 2 Stellen verwendet. Wenn wir sie durch OrderOpenTime() ersetzen, wird das Programm übersichtlicher und kürzer in 2 Zeilen (Deklaration und Zuweisung)
datetime _o_t; und
_o_t=OrderOpenTime();
 

Ich hab's - der 60-Sekunden-Countdown muss aus der Schleife genommen werden

//+------------------------------------------------------------------+ 
//| Ежеминутная информация об ордерах, открытых за последнее полчаса | 
//+------------------------------------------------------------------+ 
#property strict
bool RUS=true;
datetime t_pre=0;  // Время предыдущего выполнения

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   if(t_pre+60>=TimeCurrent()) return;      // Дождаться 60 секунд после прошлой обработки
   t_pre=TimeCurrent();                     // Это нужно вынести за цикл - в этом было дело !!!!!!!!!!!!

   string text;
   for(int i=0; i<OrdersTotal(); i++) 
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
      string ИмяФайла=(string)OrderTicket()+Symbol()+".txt";
      Alert(ИмяФайла);
      if(OrderOpenTime()+60>=TimeCurrent()) continue;   // Пропуск молодых которым меньше 1 минуты
      if(OrderOpenTime()+1800<=TimeCurrent()) continue; // Пропустк старых которым больше 30 минут
      if(OrderType()==OP_BUY){if(Bid>OrderOpenPrice())text="P"; else text="L";}
      if(OrderType()==OP_SELL){if(Bid<OrderOpenPrice())text="P"; else text="L";}

      // Открытие или создание файла и перемещение указателя в конец
      int Файл= FileOpen(ИмяФайла,FILE_CSV|FILE_READ|FILE_WRITE," ");
      if(Файл == -1) {  Alert("Ошибка при открытии файла ",ИмяФайла);  return; }
      FileSeek(Файл,0,SEEK_END);

      // Если новый файл записать имя файла и строку заголовков колонок
      if(FileSize(Файл)==0)
      {
         FileWrite(Файл,ИмяФайла);
         FileWrite(Файл,"           Время Полу   BID     Цена ");
      }
      // Сбор информации и запись в файл
      FileWrite(Файл, TimeToStr(TimeCurrent()), text,
                dstr(Bid), "  ", dstr(OrderOpenPrice()));
      FileClose(Файл);
   }
}

// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
   if(!RUS) return DoubleToStr(Цена, Digits);
   return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
Dateien:
-Fi----.mq4  5 kb
 

Guten Tag, liebe Forumsnutzer.

Können Sie mir sagen, warum die Optimierung und das Testen der gleichen Einstellungen manchmal unterschiedliche Ergebnisse liefern?

Ich habe Zitate von SQ Tick Downloader heruntergeladen und sie durch das Skript laufen lassen

 
Aidar Kaliaskar:

Guten Tag, liebe Freunde.

Können Sie mir sagen, warum die Optimierung und das Testen der gleichen Einstellungen manchmal unterschiedliche Ergebnisse liefern?

Ich sage Ihnen noch mehr: Beim Handel auf einem realen Konto mit einem Broker auf 2 verschiedenen Konten können unterschiedliche Ergebnisse erzielt werden.
 
Vladislav Andruschenko:
Ich sage Ihnen noch mehr: Wenn Sie auf einem realen Konto mit demselben Broker auf 2 verschiedenen Konten handeln, kann es zu unterschiedlichen Ergebnissen kommen.

Das hängt wahrscheinlich eher vom Makler ab. Aber könnten Sie mir einen Hinweis auf die Ausgangsfrage geben?

 
Aidar Kaliaskar:

Das hängt wahrscheinlich eher vom Makler ab. Könnten Sie jedoch einen Rat zu der ursprünglichen Frage geben?

Spanne, wenn zum aktuellen Preis berechnet. Das Enddatum des Tests, wenn er zum aktuellen Datum abgerechnet wird. Dafür kann es viele weitere Gründe geben.
Grund der Beschwerde: