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

 
Artyom Trishkin:

Ich habe es selbst überprüft - alles wird in mql4 kompiliert.

Sie haben irgendwo anders einen Fehler gemacht.

Dies ist nicht mein Code, sondern der von Vasiliy Sokolov. Zwei Leute haben sich bei mir beschwert, dass es unter MT4 nicht kompilierbar ist. Ich habe auch einen Fehler, Build 1090. Könnten Sie bitte diese Klasse auf MT4 Kompilierung überprüfen? Das sieht nach einer Art Unsinn aus. Vielen Dank im Voraus.

https://www.mql5.com/ru/articles/1334#summary - die Klasse selbst steht am Ende des Artikels.

Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным
  • 2015.03.23
  • Vasiliy Sokolov
  • www.mql5.com
Эта статья описывает удобный класс для хранения информации - ассоциативный массив или словарь. Благодаря этому классу можно получать доступ к информации по ее ключу. Ассоциативный массив напоминает обычный массив, однако вместо индекса он использует некий уникальный ключ, например, перечисление ENUM_TIMEFRAMES или какой-либо текст. Что...
 
Alexey Volchanskiy:

Dies ist nicht mein Code, sondern der von Vasiliy Sokolov. Zwei Leute haben sich darüber beschwert, dass es unter MT4 nicht kompiliert werden kann. Ich habe auch einen Fehler, Build 1090. Könnten Sie bitte diese Klasse auf MT4 Kompilierung überprüfen? Das sieht nach einer Art Unsinn aus. Vielen Dank im Voraus.

https://www.mql5.com/ru/articles/1334#summary - die Klasse selbst am Ende des Artikels

Zusammengestellt von
 
Artyom Trishkin:
Zusammengestellt von

Zeigen Sie mir, wie Sie es getestet haben.

 
Victor Nikolaev:

Zeigen Sie mir, wie Sie es getestet haben.

Vitya, ich kann es dir jetzt nicht zeigen - ich bin nicht an meinem Computer.
Ich verwende diese Basilikumklasse in meiner Bibel. Für beide Plattformen.
Und außerdem - ich habe diese Zeilen gerade in den privaten Teil meiner ersten quaternären Klasse eingefügt. Und alles zusammengestellt.
 
Victor Nikolaev:

Zeigen Sie mir, wie Sie es getestet haben.

Diese Klasse

Dateien:
Dictionary.mqh  45 kb
 
Grüße.
Ich erstelle eine Datei mit dem Namen = Ticket+Symbol.
Ich schreibe in die Datei den Eröffnungskurs der Position und den aktuellen Kurs, den Buchstaben "P" oder "L", je nachdem, wo sich der Kurs befindet.
Es ist notwendig, die Daten derjenigen Positionen zu schreiben, deren Öffnungszeit nicht älter als 30 Minuten ist.
Das Problem ist, dass die Daten nur für eine Position, die letzte, geschrieben werden.
Das Schreiben in andere Dateien wird nicht vorgenommen. Es gibt 4 Positionen.
Wie kann man das Problem lösen?

datetime t_pre=0,t_lo;
string param="";string sy=""; int op=-1; int mn=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  PO=MarketInfo(Symbol(),MODE_POINT);
   vspread=(int)MarketInfo(Symbol(),MODE_SPREAD);
   datetime _o_t;
   double _Profit,_lot,_Swap,_pr,_tp,_sl,lA=-1;
   int _Ticket,_Type;
   string _Comm;
   int      i,k=OrdersTotal();

   if(sy=="0") sy=Symbol();
   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();

                     _pr=OrderOpenPrice();

                     _Ticket=OrderTicket();

                     _Type=OrderType();
                     ИмяФайла=_Ticket+Symbol()+".txt";
                     if(_o_t+60<TimeCurrent())
                        if(t_pre+60<TimeCurrent() && _o_t+1800>TimeCurrent())
                          {
                           if(_Type==OP_BUY){if(Bid>_pr)text_="P"; else text_="L";}
                           if(_Type==OP_SELL){if(Bid<_pr)text_="P"; else text_="L";}
                           t_pre=TimeCurrent();
                           string Текст,Строка;

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

                           // Если новый файл записать строку заголовков колонок
                           if(FileSize(Файл)==0)FileWrite(Файл,"           Время Полу   BID     Цена ");

                           // Сбор информации и запись в файл
                           FileWrite(Файл,
                                     TimeToStr(TimeCurrent()),
                                     text_,
                                     dstr(Bid),
                                     "  ",
                                     dstr(_pr));
                           FileClose(Файл);
                           Файл=0;

                          }
                    }
                 }
              }
           }
        }
     }

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


 
Artyom Trishkin:

Das ist die Klasse.


Sieh an, sieh an, sieh an. Ich habe einen weiteren Fehler gefunden. Ich hatte einmal das MT4-Terminal für die Entwicklung unvollständig aktualisiert. Die Terminalversion ist 1090 und die Editorversion ist 1562. Auf anderen Terminals kompiliert Union normal, die Version des Editors ist 1601! Es muss daran liegen, dass der Editor zum Zeitpunkt der Aktualisierung bereits geöffnet war, so dass die alte Version übrig blieb. Mann, ich habe einen halben Tag mit diesem Müll verbracht.

Jedenfalls lässt sich alles mit dem Editor 1601 gut kompilieren.

 
lil_lil:
Grüße.
Ich erstelle eine Datei mit dem Namen = Ticket+Symbol.
Ich schreibe in die Datei den Eröffnungskurs der Position und den aktuellen Kurs, den Buchstaben "P" oder "L", je nachdem, wo sich der Kurs befindet.
Es ist notwendig, die Daten derjenigen Positionen zu schreiben, deren Öffnungszeit nicht älter als 30 Minuten ist.
Das Problem ist, dass die Daten nur für eine Position, die letzte, geschrieben werden.
Das Schreiben in andere Dateien wird nicht vorgenommen. Es gibt 4 Positionen.
Wie kann man das Problem lösen?

Sie haben FileSeek übersprungen - suchen Sie nach dem Ende der Datei und nach FileOpen wird sie jedes Mal an den Anfang geschrieben

 

Alexey Volchanskiy:

Sieh an, sieh an, sieh an. Ich habe einen weiteren Fehler gefunden. Ich hatte mein MT4-Entwicklungsterminal zu diesem Zeitpunkt noch nicht vollständig aktualisiert. Die Version des Terminals ist 1090 und die des Editors ist 1562. Auf anderen Terminals kompiliert Union normal, die Version des Editors ist 1601! Es muss daran liegen, dass der Editor zum Zeitpunkt der Aktualisierung bereits geöffnet war, so dass die alte Version übrig blieb. Mann, ich habe einen halben Tag mit diesem Müll verbracht.

Jedenfalls lässt sich alles mit dem Editor 1601 gut kompilieren.

Gut für dich ;)

 
STARIJ:

Sie haben FileSeek() übersehen - suchen Sie nach dem Ende der Datei und nach FileOpen wird sie jedes Mal an den Anfang geschrieben

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 Sie Daten an vier Positionen schreiben müssen, jede in einer separaten Datei, jede Datei hat ein Positionsticket im Namen, aber die Daten werden nur in eine geschrieben, die letzte Datei, Daten an der letzten Position.