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

 

在最后一个答案之后,画面变得更加清晰,最明显的是,我注定不会成为一个程序员 :-)

到目前为止,我从最简单的清单开始,结果是这样的。


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



在某些情况下,由于某种原因,价格在任何一个方向都超过了点后两个有效数字的尺寸。

而这种情况的发生没有任何计算上的错误,只是从图表基数中输出了价格值,tmp1[i]=close[i]。

有什么办法可以解决这个问题,或者直接忽略它?



 

你可以从里面拿出所有与五有关的东西,得到一个四的模板。


这可以由知道五分和四分之间区别的人写,而这绝对不是我 :-)


//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;


数字4从何而来,它的神圣含义是什么?

 
psyman:


这可以由知道五分和四分之间区别的人写,而这绝对不是我 :-)



数字4从何而来,它有什么神圣的意义?

你当然不会听或读...我是。

关于交易、自动交易系统和策略测试的论坛

任何MQL4初学者的问题,协助和讨论的算法和代码

Artyom Trishkin, 2018.10.18 09:26

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
psyman:

在最后一个答案之后,画面变得更加清晰,最明显的是,我注定不会成为一个程序员 :-)

到目前为止,我从最简单的清单开始,结果是这样的。


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



在某些情况下,由于某种原因,价格在任何一个方向都超过了点后两个有效数字的尺寸。

而这种情况的发生没有任何计算上的错误,只是从图表基数中输出了价格值,tmp1[i]=close[i]。

有什么办法可以解决这个问题,或者直接忽略它?



这很好。要打印小数,只需使用DoubleToString(),并设定所需精度。在这种情况下,要求的精度应该是Digits()

 
psyman:

在最后一个答案之后,画面变得更加清晰,最明显的是,我注定不会成为一个程序员 :-)

到目前为止,我从最简单的清单开始,结果是这样的。


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.09999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.98999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00


在某些情况下,由于某种原因,价格在任何一个方向都超过了点后两个有效数字的尺寸。

而这种情况的发生没有任何计算上的错误,只是从图表基点输出价格值,tmp1[i]=close[i]。

能否以某种方式战胜它,或者直接忽略它?

这些都是实数的正常值。你可以学习写程序,每个人都是从那里开始的--你只需要大量阅读,并尝试写和写自己的代码。

实数的精度,尾数,以及它在内存中的存储方式,你可以在网上谷歌一下,存储的原理在哪里都是一样的。

如果你想要漂亮的输出,请使用DoubleToStr()。

 
Igor Makanu:

这些都是实数的常用值,你可以学习写程序,每个人都是从这里开始的--你只需要大量阅读,并尝试写和写自己的代码。

实数的精度,尾数,以及它在内存中的存储方式,你可以在网上谷歌一下,存储的原理在哪里都是一样的。

如果你想要漂亮的输出,可以使用DoubleToStr()。

如果有可能使用兼容的功能,最好是提供给他们使用。否则这段史诗将重新开始。在这种情况下。DoubleToString()

 

你怎么能阻止EA在相同的工具上运行?

例如,EA在eur/usd窗口中工作,但当在eur/usd的其他窗口中运行时,会显示一些警告 信息。我将非常感谢您的帮助。

 
gans71:

你怎么能阻止EA在相同的工具上运行?

例如,EA在eur/usd窗口中工作,但当在eur/usd的其他窗口中运行时,会显示一些警告信息。我将非常感谢您的帮助。

你需要将数据从一个EA转移到另一个,请搜索论坛

或者使用终端的全局变量(这是最简单的方法)--在那里你可以写下第一个EA的值,随后的EA副本将读取这个值,不会运行https://www.mql5.com/ru/docs/globals

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 
Igor Makanu:

你需要将数据从一个EA转移到另一个,请搜索论坛

或者使用终端的全局变量(这是最简单的方法)--在那里你可以写下第一个EA的值,随后的EA副本将读取这个值,不会运行https://www.mql5.com/ru/docs/globals

EA是一样的,你需要禁止它在相同的工具上运行。
 
gans71:
该EA是相同的,它不应该被允许在相同的符号上运行。

你不可能在2分钟内研究完这些帮助。

如果你具体谈论的是如何将一个字符串传递给一个全局变量,唯一的方法是为全局变量创建一个名称,即在你的案例中,你在欧元兑美元上运行一个EA,做一个检查

如果(GlobalVariableCheck(_Symbol)) .....

如果没有这样的变量,那么就创建一个超大的变量,像这样

if(GlobalVariableSet(_Symbol,Magic)==0) Print("Error writing to global variable #",GetLastError())。

然后在退出专家顾问时,删除全局变量

因为它是,终端是不方便的,而且我有点指出了搜索的方向。

原因: