//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)if(rates_total<4) return0;
//--- Проверка и расчёт количества просчитываемых баров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 callreturn(rates_total);
}
//+------------------------------------------------------------------+
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
在最后一个答案之后,画面变得更加清晰,最明显的是,我注定不会成为一个程序员 :-)
到目前为止,我从最简单的清单开始,结果是这样的。
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]。
有什么办法可以解决这个问题,或者直接忽略它?
你可以从里面拿出所有与五有关的东西,得到一个四的模板。
这可以由知道五分和四分之间区别的人写,而这绝对不是我 :-)
数字4从何而来,它的神圣含义是什么?
这可以由知道五分和四分之间区别的人写,而这绝对不是我 :-)
数字4从何而来,它有什么神圣的意义?
你当然不会听或读...我是。
关于交易、自动交易系统和策略测试的论坛
任何MQL4初学者的问题,协助和讨论的算法和代码
Artyom Trishkin, 2018.10.18 09:26
在最后一个答案之后,画面变得更加清晰,最明显的是,我注定不会成为一个程序员 :-)
到目前为止,我从最简单的清单开始,结果是这样的。
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()
在最后一个答案之后,画面变得更加清晰,最明显的是,我注定不会成为一个程序员 :-)
到目前为止,我从最简单的清单开始,结果是这样的。
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()。
这些都是实数的常用值,你可以学习写程序,每个人都是从这里开始的--你只需要大量阅读,并尝试写和写自己的代码。
实数的精度,尾数,以及它在内存中的存储方式,你可以在网上谷歌一下,存储的原理在哪里都是一样的。
如果你想要漂亮的输出,可以使用DoubleToStr()。
如果有可能使用兼容的功能,最好是提供给他们使用。否则这段史诗将重新开始。在这种情况下。DoubleToString()
你怎么能阻止EA在相同的工具上运行?
例如,EA在eur/usd窗口中工作,但当在eur/usd的其他窗口中运行时,会显示一些警告 信息。我将非常感谢您的帮助。
你怎么能阻止EA在相同的工具上运行?
例如,EA在eur/usd窗口中工作,但当在eur/usd的其他窗口中运行时,会显示一些警告信息。我将非常感谢您的帮助。
你需要将数据从一个EA转移到另一个,请搜索论坛
或者使用终端的全局变量(这是最简单的方法)--在那里你可以写下第一个EA的值,随后的EA副本将读取这个值,不会运行https://www.mql5.com/ru/docs/globals。
你需要将数据从一个EA转移到另一个,请搜索论坛
或者使用终端的全局变量(这是最简单的方法)--在那里你可以写下第一个EA的值,随后的EA副本将读取这个值,不会运行https://www.mql5.com/ru/docs/globals。
该EA是相同的,它不应该被允许在相同的符号上运行。
你不可能在2分钟内研究完这些帮助。
如果你具体谈论的是如何将一个字符串传递给一个全局变量,唯一的方法是为全局变量创建一个名称,即在你的案例中,你在欧元兑美元上运行一个EA,做一个检查
如果(GlobalVariableCheck(_Symbol)) .....
如果没有这样的变量,那么就创建一个超大的变量,像这样
if(GlobalVariableSet(_Symbol,Magic)==0) Print("Error writing to global variable #",GetLastError())。
然后在退出专家顾问时,删除全局变量
因为它是,终端是不方便的,而且我有点指出了搜索的方向。