Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 477

 
Artyom Trishkin:

Lo he comprobado yo mismo: todo compila en mql4.

Has cometido un error en otra parte.

Este no es mi código, es la clase de Vasiliy Sokolov. Dos personas se han quejado de que no compila bajo MT4. Yo también tengo un error, build 1090. ¿Podría comprobar esta clase en la compilación de MT4? Parece una tontería. Gracias de antemano.

https://www.mql5.com/ru/articles/1334#summary - la clase en sí está en la parte inferior del artículo.

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

Este no es mi código, es la clase de Vasiliy Sokolov. He tenido dos personas que se quejan de que no compila bajo MT4. Yo también tengo un error, build 1090. ¿Podría comprobar esta clase en la compilación de MT4? Parece una tontería. Gracias de antemano.

https://www.mql5.com/ru/articles/1334#summary - la propia clase en la parte inferior del artículo

Compilado por
 
Artyom Trishkin:
Compilado por

Muéstrame cómo lo has probado.

 
Victor Nikolaev:

Muéstrame cómo lo has probado.

Vitya, no puedo mostrártelo ahora, no estoy en mi ordenador.
Utilizo esta clase de Basil en mi biblia. Para ambas plataformas.
Y también - acaba de insertar estas líneas en la sección privada de mi primera clase cuaternaria encontrada. Y todo compilado.
 
Victor Nikolaev:

Muéstrame cómo lo has probado.

Esta clase

Archivos adjuntos:
Dictionary.mqh  45 kb
 
Saludos.
Creo un archivo llamado = ticket+símbolo.
Escribo en el archivo el precio de apertura de la posición y el precio actual, la letra "P" o "L" dependiendo de la ubicación del precio.
Es necesario escribir los datos de aquellas posiciones cuyo tiempo de apertura no sea superior a 30 minutos.
El problema es que los datos se escriben sólo para una posición, la última.
La escritura en otros archivos no se realiza. Hay 4 puestos.
¿Cómo solucionarlo?

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:

Esa es la clase.


Bueno, bueno, bueno. He encontrado otro error. Una vez tuve el terminal MT4 para desarrollo incompletamente actualizado. La versión del terminal es la 1090 y la del editor la 1562. En otros terminales la unión compila normalmente, ¡la versión del editor es 1601! Debe ser porque el editor ya estaba abierto en el momento de la actualización, por lo que se dejó la versión antigua. Tío, me he pasado medio día con esta basura.

De todos modos, todo compila bien bajo el editor 1601.

 
lil_lil:
Saludos.
Creo un archivo llamado = ticket+símbolo.
Escribo en el archivo el precio de apertura de la posición y el precio actual, la letra "P" o "L" dependiendo de la ubicación del precio.
Es necesario escribir los datos de aquellas posiciones cuyo tiempo de apertura no sea superior a 30 minutos.
El problema es que los datos se escriben sólo para una posición, la última.
La escritura en otros archivos no se realiza. Hay 4 puestos.
¿Cómo solucionarlo?

Skip FileSeek- busca el final del archivo y después de FileOpen se escribe al principio cada vez

 

Alexey Volchanskiy:

Bueno, bueno, bueno. He encontrado otro error. Tenía mi terminal de desarrollo MT4 incompletamente actualizado en ese momento. La versión del terminal es 1090 y la del editor es 1562. En otros terminales la unión compila normalmente, ¡la versión del editor es 1601! Debe ser porque el editor ya estaba abierto en el momento de la actualización, por lo que se dejó la versión antigua. Tío, me he pasado medio día con esta basura.

De todos modos, todo compila bien bajo el editor 1601.

Bueno, me alegro por ti ;)

 
STARIJ:

te faltó FileSeek() - busca el final del archivo y después de FileOpen se escribe al principio cada vez

HayFileSeek(File,0,SEEK_END); y todo se escribe en el archivo desde una nueva línea.

El problema es que hay 4 archivos y se necesita escribir datos en cuatro posiciones, cada uno en un archivo separado, cada archivo tiene una entrada de posición en el nombre, pero los datos se escriben sólo en uno, el último archivo, los datos en la última posición.

Razón de la queja: