Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 477

 
Artyom Trishkin:

Verifiquei-me - tudo se compila em mql4.

Você cometeu um erro em outro lugar.

Este não é o meu código, é a classe do Vasiliy Sokolov. Duas pessoas me queixaram que não é compilado sob o MT4. Eu também tenho erro, construa 1090. Você poderia, por favor, verificar esta classe na compilação do MT4? Parece algum tipo de bobagem. Obrigado de antemão.

https://www.mql5.com/ru/articles/1334#summary - a classe em si está no final do artigo.

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

Este não é o meu código, é a classe do Vasiliy Sokolov. Já tive duas pessoas reclamando que ele não compila sob o MT4. Eu também tenho um erro, construa 1090. Você poderia, por favor, verificar esta classe na compilação do MT4? Parece algum tipo de bobagem. Obrigado de antemão.

https://www.mql5.com/ru/articles/1334#summary - a classe em si no final do artigo

Compilado por
 
Artyom Trishkin:
Compilado por

Mostre-me como você o testou.

 
Victor Nikolaev:

Mostre-me como você o testou.

Vitya, não posso te mostrar agora - não estou no meu computador.
Eu uso esta classe de Basil na minha Bíblia. Para ambas as plataformas.
E também - acabei de inserir estas linhas na seção privada da minha primeira aula quaternária. E tudo compilado.
 
Victor Nikolaev:

Mostre-me como você o testou.

Esta classe

Arquivos anexados:
Dictionary.mqh  45 kb
 
Saudações.
Eu crio um arquivo chamado = bilhete+símbolo.
Escrevo no arquivo o preço de abertura da posição e o preço atual, a letra "P" ou "L" dependendo da localização do preço.
É necessário escrever os dados dessas posições, cujo tempo aberto não seja superior a 30 minutos.
O problema é que os dados são escritos apenas para uma posição, a mais recente.
A escrita em outros arquivos não é feita. Existem 4 posições.
Como resolvê-lo?

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:

Essa é a classe.


Ora, ora, ora, ora. Eu encontrei outro bug. Uma vez eu tive o terminal MT4 para desenvolvimento incompletamente atualizado. A versão do terminal é 1090 e a versão do editor é 1562. Em outros terminais o sindicato compila normalmente, a versão do editor é 1601! Deve ser porque o editor já estava aberto no momento da atualização, então a versão antiga foi deixada. Cara, eu passei meio dia com este lixo.

De qualquer forma, tudo se compila bem sob o editor 1601.

 
lil_lil:
Saudações.
Eu crio um arquivo chamado = bilhete+símbolo.
Escrevo no arquivo o preço de abertura da posição e o preço atual, a letra "P" ou "L" dependendo da localização do preço.
É necessário escrever os dados dessas posições, cujo tempo aberto não seja superior a 30 minutos.
O problema é que os dados são escritos apenas para uma posição, a mais recente.
A escrita em outros arquivos não é feita. Existem 4 posições.
Como resolvê-lo?

Pular FileSeek- procure pelo fim do arquivo e depois de FileOpen ele é sempre escrito no início

 

Alexey Volchanskiy:

Ora, ora, ora, ora. Eu encontrei outro bug. Eu tinha meu terminal de desenvolvimento MT4 incompletamente atualizado na época. A versão do terminal é 1090 e o editor é 1562. Em outros terminais o sindicato compila normalmente, a versão do editor é 1601! Deve ser porque o editor já estava aberto no momento da atualização, então a versão antiga foi deixada. Cara, eu passei meio dia com este lixo.

De qualquer forma, tudo se compila bem sob o editor 1601.

Bem, bom para você ;)

 
STARIJ:

você perdeu FileSeek() - procure pelo fim do arquivo e depois de FileOpen ele é escrito até o início todas as vezes

FileSeek(File,0,SEEK_END); e tudo é escrito no arquivo a partir de uma nova linha.

O problema é que existem 4 arquivos e você precisa escrever dados em quatro posições, cada um em um arquivo separado, cada arquivo tem uma ficha de posição no nome, mas os dados são escritos apenas em um, o último arquivo, dados sobre a última posição.