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

 

谢谢你,但她是

Vitaly Muzichenko:

iCustom来帮忙


iCustom是一个很好的解决方案,但iCustom总是执行指标的整个代码,如果我在EA中需要许多指标参数(而且是),那么我们将得到多个指标计算,而不是一个指标计算,这会大大减慢进程,直到错过当前的tick,我忘了预定义变量.....

int rates_total=Bars;

定义的全局变量

int prev_calculated=0。

在数组元素的数量上发生崩溃

 
ijonhson:

我很抱歉,但我不明白为什么oncalculate要传递预定义变量 的值,如果它们是全局的并且也是可用的。

请看一个例子

//+-------------------------------------------------------+
//|Параметры функции                             PROBA.mq4|
//+-------------------------------------------------------+
#property   strict

void OnStart()
{
 Alert(Сумма(2,5));
 
 int Сум=0;
 Сумма(2,5,Сум);  // Передаем в функцию 2 числа и получаем сумму
 Alert(Сум);
}

int Сумма(int a, int b)
{
  return a+b;
}

void Сумма(int a, int b, int & s)
{
  s= a+b;
}

一个函数的参数可以是输入--我们传递给它的,以及输出--它返回给我们的。

 
ijonhson: int rates_total=Bars; int prev_calculated=0;

计算整个指标线时 需要这些变量,但你需要一个单一的值。一切都简单多了。分析指标方案,并确定使用哪种公式进行计算。并在专家顾问中使用这个公式

 

伙计们,告诉我如何实现这种算法。

有一个具有体积的时间序列

我想比较Volume[1]是否大于之前的Volume[1]条 并通过外部变量(extern int)指定一个之前条的窗口(数量)。


写一个代码样本,如果不难的话

 
John Smith:

伙计们,告诉我如何实现这种算法。

有一个具有体积的时间序列

我想比较Volume[1]是否大于之前的Volume[1]条 并通过外部变量(extern int)指定一个之前条的窗口(数量)。


写一个代码样本,如果不难的话

  for(int i=1; i<NumBar; i++) {
    ArrayResize(Buf, i);
    Buf[i-1] = Volume[i];
  }

 double min= Buf[ArrayMinimum(Buf)];
 double max= Buf[ArrayMaximum(Buf)];

 if(max < Volume[0]) { ... }
 
STARIJ:

它起作用了吗?以前是怎么做的?


它的工作没有错误,我似乎自己把它删除了,通过ctrl+h的自动替换,没有注意到>_<。总之,可能是光照派干的。再次感谢!

 
John Smith:

伙计们,告诉我如何实现这种算法。

有一个具有体积的时间序列

我想比较Volume[1]是否大于之前的Volume[1]条 并通过外部变量(extern int)指定一个之前条的窗口(数量)。


写一个代码样本,如果不难的话

这并不难。我根据记忆在膝盖上写的(我可能遗漏了什么)......

//+------------------------------------------------------------------+
bool IsLastVolumeTheLargest(const string symbol_name, const ENUM_TIMEFRAMES timeframe,const int start_pos,const int count)
  {
   long array[];  // Массив для хранения объёмов
   //--- если скопировалось меньше, чем нужно, вернём false
   if(CopyTickVolume(symbol_name,timeframe,start_pos,count,array)<count) return false;
   //--- вернём флаг того, что максимальный объём находится в последней ячейке массива (соответствует индексу start_pos)
   return ArrayMaximum(array)==count-1;
  }
//+------------------------------------------------------------------+
 

你好。我不能分享这个文件。任务 - 我需要在МТ4(MQL4)测试器的手动测试过程中,在М1上生成旧时期的文件(例如M20)。为此,我写了一个 基于PeriodConverter脚本的指标。由于在测试模式下,不可能将文件(EURUSD20.csv)直接保存到历史记录文件夹中,该文件被保存在所有终端共享的文件夹中 - \MetaQuotes\Terminal\Common。然后,循环脚本在标准的M1图表上工作,将数据从文件EURUSD20.csv复制到位于History文件夹中的文件EURUSD20.hst。 如果同时在测试仪的指标中打开文件EURUSD20.csv,则无法在脚本中打开(5004 ERR_FILE_CANNOT_OPEN 文件打开错误)。如果你从测试器中删除指标,脚本中的文件被打开并复制,没有问题。该文件在指标中的打开方式如下: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);
请指出我的错误。

 
tvv:

你好。我不能分享这个文件。任务 - 我需要在МТ4(MQL4)测试器的手动测试过程中,在М1上生成旧时期的文件(例如M20)。为此,我写了一个 基于PeriodConverter脚本的指标。由于在测试模式下,不可能将文件(EURUSD20.csv)直接保存到历史记录文件夹中,该文件被保存在所有终端共享的文件夹中 - \\MetaQuotes\Terminal\Common。然后,循环脚本在标准的M1图表上工作,将数据从文件EURUSD20.csv复制到位于History文件夹中的文件EURUSD20.hst。 如果同时在测试仪的指标中打开文件EURUSD20.csv,则无法在脚本中打开(5004 ERR_FILE_CANNOT_OPEN 文件打开错误)。如果你从测试器中删除指标,脚本中的文件被打开并复制,没有问题。文件在指标中的打开方式如下: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_COMMON);
请指出我的错误

你指出来了吗?

 
Alexey Viktorov:

你指定了吗?

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