新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 477

 
Artyom Trishkin:

我自己检查过了--一切都在mql4中编译。

你在其他地方犯了错误。

这不是我的代码,是Vasily Sokolov的课。有两个人向我抱怨说,它在MT4下无法编译。我也得到了一个错误,构建1090。能否请你在MT4的编译上检查一下这个类?这看起来像是某种无稽之谈。提前感谢。

https://www.mql5.com/ru/articles/1334#summary - 课堂本身在文章的底部。

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

这不是我的代码,是Vasiliy Sokolov的课。有两个人抱怨说它在MT4下无法编译。我也得到了一个错误,构建1090。能否请你在MT4的编译上检查一下这个类?这看起来像是某种无稽之谈。提前感谢。

https://www.mql5.com/ru/articles/1334#summary - 文章底部的类本身

汇编者
 
Artyom Trishkin:
汇编者

让我看看你是如何测试的。

 
Victor Nikolaev:

让我看看你是如何测试的。

维蒂亚,我现在不能给你看--我不在我的电脑前。
我在我的圣经中使用这个巴西尔班。对于这两个平台。
还有--刚刚在我第一次遇到的四级班的私人部分插入了这几句话。而所有的东西都编好了。
 
Victor Nikolaev:

让我看看你是如何测试的。

这类

附加的文件:
Dictionary.mqh  45 kb
 
问候。
我创建了一个名为=门票+符号的文件。
我把头寸的开盘价 和当前价格写进文件,根据价格的位置,写上字母 "P "或 "L"。
有必要写入那些开仓时间不超过30分钟的仓位的数据。
问题是,数据只写入一个位置,即最新的位置。
写入其他文件是不可能的。有4个职位。
如何解决这个问题?

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:

就是这个阶层。


好吧,好吧,好吧。我发现了另一个错误。我曾经有一个开发用的MT4终端没有完全更新。终端版本是1090,编辑版本是1562。在其他终端上,联盟编译正常,编辑器的版本是1601!这一定是因为更新时编辑器已经打开,所以留下了旧版本。伙计,我在这个垃圾上花了半天时间。

总之,在编辑器1601下,一切都编译得很好。

 
lil_lil:
问候。
我创建了一个名为=门票+符号的文件。
我把头寸的开盘价 和当前价格写进文件,根据价格的位置,写上字母 "P "或 "L"。
有必要写入那些开仓时间不超过30分钟的仓位的数据。
问题是,数据只写入一个位置,即最新的位置。
写入其他文件是不可能的。有4个职位。
如何解决这个问题?

你跳过了FileSeek--搜索文件的末尾,在FileOpen之后,每次都被写到开头。

 

Alexey Volchanskiy:

好吧,好吧,好吧。我发现了另一个错误。当时我的MT4开发终端还没有完全更新。终端的版本是1090,编辑器是1562。在其他终端上,联盟编译正常,编辑器的版本是1601!这一定是因为更新时编辑器已经打开,所以留下了旧版本。伙计,我在这个垃圾上花了半天时间。

总之,在编辑器1601下,一切都编译得很好。

嗯,对你有好处;)

 
STARIJ:

你错过了FileSeek()--搜索文件的结尾,在FileOpen之后,它每次都被写到开头。

FileSeek(File,0,SEEK_END);并且所有的东西都从新的一行 写到文件中。

问题是有4个文件,你需要在4个位置上写入数据,每个文件都是独立的,每个文件的名称中都有一个位置票,但数据只写入一个,即最后一个文件,数据在最后一个位置。

原因: