Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 477

 
Artyom Trishkin:

Ho controllato io stesso - tutto si compila in mql4.

Hai fatto un errore da qualche altra parte.

Questo non è il mio codice, è la classe di Vasily Sokolov. Due persone si sono lamentate con me che non compila sotto MT4. Anche io ho un errore, build 1090. Potresti controllare questa classe sulla compilazione di MT4? Sembra un'assurdità. Grazie in anticipo.

https://www.mql5.com/ru/articles/1334#summary - la classe stessa è in fondo all'articolo.

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

Questo non è il mio codice, è la classe di Vasiliy Sokolov. Due persone si sono lamentate che non compila sotto MT4. Anche io ho un errore, build 1090. Potresti controllare questa classe sulla compilazione di MT4? Sembra un'assurdità. Grazie in anticipo.

https://www.mql5.com/ru/articles/1334#summary - la classe stessa in fondo all'articolo

Compilato da
 
Artyom Trishkin:
Compilato da

Mostrami come l'hai testato.

 
Victor Nikolaev:

Mostrami come l'hai testato.

Vitya, non posso mostrartelo ora - non sono al mio computer.
Io uso questo corso di basilico nella mia bibbia. Per entrambe le piattaforme.
E anche - ho appena inserito queste righe nella sezione privata della mia prima classe quaternaria incontrata. E tutto compilato.
 
Victor Nikolaev:

Mostrami come l'hai testato.

Questa classe

File:
Dictionary.mqh  45 kb
 
Saluti.
Creo un file chiamato = biglietto+simbolo.
Scrivo nel file il prezzo di apertura della posizione e il prezzo corrente, la lettera "P" o "L" a seconda della posizione del prezzo.
È necessario scrivere i dati di quelle posizioni il cui tempo di apertura non è più vecchio di 30 minuti.
Il problema è che i dati vengono scritti solo per una posizione, l'ultima.
La scrittura in altri file non viene effettuata. Ci sono 4 posizioni.
Come risolverlo?

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:

Questa è la classe.


Bene, bene, bene. Ho trovato un altro bug. Una volta ho avuto il terminale MT4 per lo sviluppo aggiornato in modo incompleto. La versione del terminale è 1090 e la versione dell'editor è 1562. Su altri terminali l'unione compila normalmente, la versione dell'editor è 1601! Deve essere perché l'editor era già aperto al momento dell'aggiornamento, quindi è rimasta la vecchia versione. Amico, ho passato mezza giornata su questa spazzatura.

Comunque, tutto si compila bene sotto l'editor 1601.

 
lil_lil:
Saluti.
Creo un file chiamato = biglietto+simbolo.
Scrivo nel file il prezzo di apertura della posizione e il prezzo corrente, la lettera "P" o "L" a seconda della posizione del prezzo.
È necessario scrivere i dati di quelle posizioni il cui tempo di apertura non è più vecchio di 30 minuti.
Il problema è che i dati vengono scritti solo per una posizione, l'ultima.
La scrittura in altri file non viene effettuata. Ci sono 4 posizioni.
Come risolverlo?

Hai saltato FileSeek- cerca la fine del file e dopo FileOpen viene scritto all'inizio ogni volta

 

Alexey Volchanskiy:

Bene, bene, bene. Ho trovato un altro bug. Avevo il mio terminale di sviluppo MT4 incompletamente aggiornato in quel momento. La versione del terminale è 1090 e l'editor è 1562. Su altri terminali l'unione compila normalmente, la versione dell'editor è 1601! Deve essere perché l'editor era già aperto al momento dell'aggiornamento, quindi è rimasta la vecchia versione. Amico, ho passato mezza giornata su questa spazzatura.

Comunque, tutto si compila bene sotto l'editor 1601.

Beh, buon per te ;)

 
STARIJ:

ti sei perso FileSeek() - cerca la fine del file e dopo FileOpen viene scritto all'inizio ogni volta

C'èFileSeek(File,0,SEEK_END); e tutto viene scritto nel file da una nuova linea.

Il problema è che ci sono 4 file e bisogna scrivere i dati su quattro posizioni, ognuno in un file separato, ogni file ha un biglietto di posizione nel nome, ma i dati vengono scritti solo su uno, l'ultimo file, i dati sull'ultima posizione.

Motivazione: