Schreiben in die Datei in eine neue Zeile - Seite 7

 
EfremovSergey:

Es ist in etwa dasselbe wie die "Besetzt"-Flagge (wer zuerst kommt, mahlt zuerst), nur etwas komplizierter, aber die Idee ist interessant, ich mag sie, danke.

Wahrscheinlich wäre es einfacher, die gemeinsame Bearbeitung von FILE_SHARE_WRITE zu deaktivieren und diejenigen, die die Datei nur lesend öffnen, FILE_READ lesen zu lassen, während diejenigen, die die Datei lesend und schreibend öffnen, FILE_READ|FILE_WRITE einen Fehler erhalten und die Datei erneut öffnen müssen. Das wäre wahrscheinlich einfacher.

 
EfremovSergey:

Ich verstehe nicht ganz, was das im Zusammenhang mit dem Speichern von FileClose bedeutet.

Das bedeutet, dass nicht nur beim Schließen der Datei die vorgenommenen Änderungen auf der Festplatte gespeichert werden.

 
string    sep=";";                                                  // знак разделителя
ushort    usep=StringGetCharacter(sep,0);                           // код знака разделителя
string    arr[];                                                    // массив данных для открытия ордера
int       h=0;                                                      // handle_1
int       h1=0;                                                     // handle_2

int OnInit()
  
  {

   EventSetMillisecondTimer(3000);

   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)

  {
   EventKillTimer();
  }

void OnTimer()

  {

   h=FileOpen("Copy.txt",FILE_READ|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_TXT|FILE_COMMON,";");   // open файл

   FileSeek(h,0,SEEK_SET);                      // перевод курсора в начало файла

   while(FileIsEnding(h)==false)               // построчное чтение до конца файла

     {

      string    s=FileReadString(h);                                    // чтение строки

      StringSplit(s,usep,arr);                                        // перенос подстрок в массив

      // открытие ордера с данными из массива

      OrderSend(arr[0],StrToInteger(arr[1]),StrToDouble(arr[2]),StrToDouble(arr[3]),100,0,0);

      if(FileIsEnding(h)==false)                                  // промежуточная проверка

         continue;                                               // возврат в начало по условию if

      h1=FileOpen("Copy.txt",FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_TXT|FILE_COMMON,";");  // очистка файла

      FileClose(h1);                                                   // закрытие handle_2

     }

   FileClose(h);                                                     // закрытие handle_1

   Comment ("\n H: ", h, "\n H1: ", h1);                            // вывод хэнделов на экран

  }

Auf der Leseseite gibt es eine Markierung, die es ermöglicht, die Datei zu leeren, ohne sie zu schließen, nachdem alle Daten extrahiert worden sind.

Auf der Schreibseite haben wir eine Markierung, die es nicht erlaubt, die Datei zu öffnen, wenn sie bereits von einem anderen Expert Advisor geöffnet wurde.

//--- Открываем файл

      int h1=FileOpen("Copy.txt",FILE_READ|FILE_WRITE|FILE_TXT|FILE_COMMON,";");

      FileSeek(h1, 0, SEEK_END);

      FileWrite(h1,Symbol(),OP_BUYSTOP,OrderLots()*Koof,OrderStopLoss(),Slippage,0,0,IntegerToString(OrderTicket()));

      FileClose(h1);
 
// закрываем файл

Der Code ist nur ein Beispiel, ihm fehlen Kontrollfunktionen für die Handhabung von Handles und Tickets und so weiter, aber er kommt dem gewünschten Ergebnis sehr nahe.

Nochmals vielen Dank an alle und vielen Dank für die Informationen und nützlichen Tipps.