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

 
tvv:

我不明白。这个选项表示文件的位置 - \MetaQuotes\Terminal\Common。如果没有这个选项,我将无法抓取在测试器中生成的文件。如果没有这个选项,文件将在MQL4\Files中被搜索到--而我将不能把测试者的文件放在那里。

我指出的是没有这面旗帜的问题。

 
Alexey Viktorov:

我指出的是没有这面旗帜的问题。

谢谢你的帮助--这只是一个打字错误--我知道这个旗子。问题没有得到解决--文件不想在共享阅读模式下打开--即使不使用测试器。只要这个文件被指标打开 - 脚本就不能打开它。另一方面,记事本可以毫无问题地打开它。

 
tvv:

谢谢你的帮助--这只是一个打字错误--我知道那面旗子。问题没有得到解决--文件不想在共享阅读模式下打开--即使不使用测试器。只要这个文件是由指标打开的--脚本就不能打开它。另一方面,记事本打开它没有任何问题。

尝试通过FileFlush() 定期强制数据到磁盘。


hmmm: 另一件我没有马上注意到的事情

tvv

ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_COMMON) 。
脚本中的文件是这样打开的:ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ)。
请指出我的错误。

很奇怪的是,它的内容是:"。应该有一个FILE_CSV 标志。
FileFlush - Файловые операции - Справочник MQL4
FileFlush - Файловые операции - Справочник MQL4
  • docs.mql4.com
При выполнении операции записи в файл физически данные могут оказаться в нем только через некоторое время. Для того чтобы данные сразу же сохранились в файле, нужно использовать функцию FileFlush(). Если не использовать функцию, то часть данных, еще не попавших на диск, принудительно записывается туда только при закрытии файла функцией...
 
Alexey Viktorov:

尝试通过FileFlush() 周期性地强制数据到磁盘。


提示:我不久前注意到的另一件事

很奇怪的是,它的内容是:"。应该有一个FILE_CSV 标志。

.CSV是一个文件扩展名--你可以使用任何扩展名--我选择它是为了让你能在记事本中查到它。这里有一篇有趣的文章--https://www.mql5.com/ru/articles/2720。我的代码符合那里描述的规则--但我不能以编程方式读取文件。 在FILE_SHARE_READ模式下。对于扩展名为.HST的EURUSD20.HST文件 - 标志必须是FILE.BIN,以便在MT 4文件可以离线打开。

Основы программирования на MQL5: Файлы
Основы программирования на MQL5: Файлы
  • 2016.09.28
  • Dmitry Fedoseev
  • www.mql5.com
Функции для работы с файлами есть почти во всех языках программирования, и MQL5 в этом смысле — не исключение. Хотя при программировании советников и индикаторов на MQL5 работать с использованием файлов приходится не всегда, (а скорее даже — очень редко), но тем не менее, каждый экспертописатель рано или поздно с этим сталкивается. Диапазон...
 
tvv:

.CSV是一个文件扩展名--它可以是任何东西--我选择它是为了能在记事本中查到它。这里有一篇有趣的文章--https://www.mql5.com/ru/articles/2720。我的代码符合那里描述的规则--但我不能以编程方式读取文件。 在FILE_SHARE_READ模式下。对于扩展名为.HST的EURUSD20.HST文件 - 标志必须是FILE.BIN,以便在MT 4文件可以离线打开。

我试着不在测试器中工作,而只是在一个正常的图表(EURUSD M1)上工作--我运行生成TF M20的指标。

打开该文件

ExtHandle= FileOpen("EURUSD20.csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ) 。

然后,该文件将出现在MQL4\Files文件夹中。然后我们在一个普通的图表(EURUSD M5)上运行脚本,将EURUSD20.csv的内容复制到EURUSD20.HST。文件EURUSD20.HST在与MQL4同一目录的历史文件夹中生成。

脚本代码。

ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ) 读取文件。

ExtHandleW=FileOpenHistory("EURUSD20.hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ) 。

只有当我把指标从M1图表中移除时,一切才会正常。就是说,我没有让文件共享的读取模式工作。

 

你好!欧元图表上的metatrader故障是什么?2011年10月9日星期日的日线蜡烛出现了,在小时图上,该日期只有一个小时23:00。这可能是由于时钟改变为冬令时的缘故。如何解决这个问题?以前没有这样的蜡烛。

 
tvv: 只有当我把指标从M1图表中移除时,一切才会正常。就是说,我没有读取分割文件模式的工作。

这个问题的解决方法如下:写文件的程序必须在每次写操作后关闭 FileClose,从而释放文件供其他程序读取。这是因为数据首先被写入缓冲区,在一段时间内没有实际存在于文件中。关闭文件 会释放进入文件的缓冲区。在下一次写作之前

   // Открытие или создание файла и перемещение указателя в конец
   Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE, " "); // еще COMMON  SHARE...
   FileSeek(Файл, 0, SEEK_END);

文件被重新打开,指针被移到了

 

你好!你能告诉我,在两种表达方式中,获得的点数将是相同的,这种说法是否正确?这对我来说真的很重要!

"Цена закрытия последнего закрытого ордера"-Ask>=30*Point

Ask-"Цена закрытия последнего закрытого ордера">=30*Point //Если цена Выше

更准确地说,点数不能是负数吗?还是.....))

 

晚上好。

我开始学习mql5,有一些问题,请大家帮忙。

任务是将最后n个烛台的值放入一个数组中,并对数组进行排序,只选择不败的烛台。

我已经写了这个函数。

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
   {
      double high=0;
      int k=0;
      int s=0;
      ArraySetAsSeries(High,true);
         if(CopyHigh(Symbol(),Period(),0,NumCand,High)==-1)
               {
               Print("Не удалось скопировать значения цен High! Код ошибки = ",GetLastError());
               }  
               
      
       for(int x=NumCand-1; x==0; x--)
            {
            if(IsStopped())
            break;
                  for (int j = NumCand-x-1; j == 0; j--) 
                  {
                  if (High[j+1] > High[j])
                     {
                     // Если хай не побит записываем в массив
                     temp[k] = High[j+1];
                     k++;
                     }   
                   }
            }
      s=sizeof(temp);               
      high=temp[index];
      return(high);
   } 

它产生了一个错误的数组,超出了范围

 high=temp[index];

根据我的理解,这个错误是由寻址一个不存在的数组单元引起的。

但我无法从移动中找到错误,请告知我哪里出了问题,或者也许有更优雅的排序。

 
WhiteBerkut:

晚上好。

我开始学习mql5,有一些问题,请大家帮忙。

任务是将最后n个烛台的值放入一个数组中,并对数组进行排序,只选择不败的烛台。

我已经写了这个函数。

它产生了一个错误的数组,超出了范围

根据我的理解,这个错误是由寻址一个不存在的数组单元引起的。

但我无法从移动中找到错误,请告知我哪里出了问题,或者也许有更优雅的排序。

将索引值与数组尺寸 进行比较。请注意,数组元素 的编号是从0开始的,最后一个的编号比索引维度少1。而NumCand等于什么?
原因: