Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 477

 
Artyom Trishkin:

J'ai vérifié moi-même - tout se compile dans mql4.

Vous avez fait une erreur ailleurs.

Ce n'est pas mon code, c'est le cours de Vasily Sokolov. Deux personnes se sont plaintes qu'il ne compile pas sous MT4. J'ai eu une erreur aussi, build 1090. Pourriez-vous vérifier cette classe sur la compilation MT4 ? Ça ressemble à une sorte d'absurdité. Merci d'avance.

https://www.mql5.com/ru/articles/1334#summary - le cours lui-même se trouve au bas de l'article.

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

Ce n'est pas mon code, c'est le cours de Vasiliy Sokolov. Deux personnes se sont plaintes qu'il ne compile pas sous MT4. J'ai eu une erreur aussi, build 1090. Pourriez-vous vérifier cette classe sur la compilation MT4 ? Ça ressemble à une sorte d'absurdité. Merci d'avance.

https://www.mql5.com/ru/articles/1334#summary - la classe elle-même en bas de l'article

Compilé par
 
Artyom Trishkin:
Compilé par

Montre-moi comment tu l'as testé.

 
Victor Nikolaev:

Montre-moi comment tu l'as testé.

Vitya, je ne peux pas te montrer maintenant - je ne suis pas devant mon ordinateur.
J'utilise ce cours de Basil dans ma bible. Pour les deux plateformes.
Et aussi - je viens d'insérer ces lignes dans la section privée de mon premier cours de quaternaire rencontré. Et tout a été compilé.
 
Victor Nikolaev:

Montre-moi comment tu l'as testé.

Cette classe

Dossiers :
Dictionary.mqh  45 kb
 
Salutations.
Je crée un fichier nommé = ticket+symbole.
J'écris dans le fichier le prix d'ouverture de la position et le prix actuel, la lettre "P" ou "L" selon l'emplacement du prix.
Il est nécessaire d'écrire les données de ces positions, dont le temps d'ouverture ne dépasse pas 30 minutes.
Le problème est que les données ne sont écrites que pour une seule position, la plus récente.
L'écriture dans d'autres fichiers n'est pas faite. Il y a 4 positions.
Comment le résoudre ?

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:

C'est la classe.


Eh bien, eh bien, eh bien. J'ai trouvé un autre bug. J'ai déjà eu le terminal MT4 pour le développement incomplètement mis à jour. La version du terminal est 1090 et la version de l'éditeur est 1562. Sur d'autres terminaux, l'union compile normalement, la version de l'éditeur est 1601 ! Cela doit être dû au fait que l'éditeur était déjà ouvert au moment de la mise à jour, de sorte que l'ancienne version a été laissée. Mec, j'ai passé une demi-journée sur cette merde.

Quoi qu'il en soit, tout se compile bien sous l'éditeur 1601.

 
lil_lil:
Salutations.
Je crée un fichier nommé = ticket+symbole.
J'écris dans le fichier le prix d'ouverture de la position et le prix actuel, la lettre "P" ou "L" selon l'emplacement du prix.
Il est nécessaire d'écrire les données de ces positions, dont le temps d'ouverture ne dépasse pas 30 minutes.
Le problème est que les données ne sont écrites que pour une seule position, la plus récente.
L'écriture dans d'autres fichiers n'est pas faite. Il y a 4 positions.
Comment le résoudre ?

Vous avez omis FileSeek- recherche de la fin du fichier et après FileOpen, il est écrit au début à chaque fois.

 

Alexey Volchanskiy:

Eh bien, eh bien, eh bien. J'ai trouvé un autre bug. Mon terminal de développement MT4 était incomplètement mis à jour à l'époque. La version du terminal est 1090 et l'éditeur est 1562. Sur d'autres terminaux, l'union compile normalement, la version de l'éditeur est 1601 ! Cela doit être dû au fait que l'éditeur était déjà ouvert au moment de la mise à jour, de sorte que l'ancienne version a été laissée. Mec, j'ai passé une demi-journée sur cette merde.

Quoi qu'il en soit, tout se compile bien sous l'éditeur 1601.

Eh bien, tant mieux pour vous ;)

 
STARIJ:

vous avez oublié FileSeek() - qui recherche la fin du fichier et après FileOpen, le fichier est écrit au début à chaque fois.

Il y aFileSeek(File,0,SEEK_END) ; et tout est écrit dans le fichier à partir d'une nouvelle ligne.

Le problème est qu'il y a 4 fichiers et que vous devez écrire des données sur quatre positions, chacune dans un fichier séparé, chaque fichier a un ticket de position dans le nom, mais les données ne sont écrites que dans un seul, le dernier fichier, les données sur la dernière position.