错误、漏洞、问题 - 页 2754

 
fxsaber:

关键是要能够通过引用来传递。

字符串 一样,开发者有机会(如果还没有做的话)通过引用传递一切,而不需要实际复制变量。

void f()
{
        MqlTick tick;
        SymbolInfoTick( NULL, tick );
        g( tick );
}
inline void SymbolInfoTick( string symbol, MqlTick& tick )
{
      tick = _LastTick; //л енивое программирование: а не будем ничего копировать,
                        //пока _LastTick не изменится
}


而且它将是一个解决方案,不是针对某个特定的MqlTick 结构,而是针对所有的场合

 
A100:

这再次证实了直接使用_Digits,_Point , _Period, _LastError等没有意义(甚至_Symbol也可以用NULL代替)。事实上,它们必须被声明为const volatile

而你,恰恰相反,建议扩大这个范围

你是对的,但它们几乎是 不稳定的,除了标志IsStopped--它是100%不稳定的,也就是说,任何对IsStopped的读取都是100%的内存读取。
对于其他人来说,几乎是ollatylе 意味着编译器可以在第一次调用时在寄存器中缓存一个变量的值,并在下次访问该变量时使用缓存的值,但只能在一个函数或调用的分支中,如果它们在一个函数中被内联。
这是可能的(也是必要的),因为改变预定义 的变量(除了IsStopped)不能发生在MQL入口点(OnXXX函数)内。

关于变量VARIABLE MODIFICATOR 我们说它是由const 程序员为程序员使用的。
我们知道,你可以通过转换来改变一个变量的常数,所以编译器不能相信const 修饰符。
如果编译器看到变量没有改变它的值,并且被初始化为常量,那么即使没有const 修饰符

,它也会把这样的变量变成一个即时值(ImmentValue)。关于_LastTick,我们正在讨论,但...
这是一个结构,而不是一个简单的原子类型,它可以突然改变,在MQL程序的任何时候,包括获取值的时候。
事实证明,为了解决这种结构,你需要引入一个同步器。

我们一直在努力提高性能,特别是由于这种高发布率的构建。
我们计划做大量的工作来加快MQL代码的速度

Документация по MQL5: Предопределенные переменные
Документация по MQL5: Предопределенные переменные
  • www.mql5.com
Для каждой выполняющейся mql5-программы поддерживается ряд предопределенных переменных, которые отражают состояние текущего ценового графика на момент запуска программы - эксперта, скрипта или пользовательского индикатора. Значение предопределенным переменным устанавливает клиентский терминал перед запуском mql5-программы на выполнение...
 
Ilyas:

关于_LastTick,我们正在讨论,但...

这是一个结构,而不是一个简单的原子类型,它可以突然改变,在MQL程序的任何一点,包括获得值的时候。
事实证明,为了解决这种结构,我们需要引入一个同步器。

但在测试中_LastTick不能在MQL程序的任何一点上改变?

如果是,那么只为测试人员提供这样的解决方案,因为计算的速度是最重要的。

 
Igor Makanu:

但在测试中,_LastTick不能在MQL程序的任何地方改变?

如果是的话,那么只为计算速度最重要的测试人员提供这样的解决方案。

那么,是什么阻止了你在OnTick处理程序中请求这个tick一次,然后对获得的数据进行处理呢? 这实际上是没有任何成本的。 为什么我要请求它100次(如上述测试),人为地在一个均匀的地方制造刹车? 所以,建议通过复杂化MT的内部工作来解决歪曲EA代码的问题。还是你有一些正常的测量方法?
 
Alexey Navoykov:
那么,是什么阻止了你在OnTick处理程序中请求这个tick一次,然后对收到的数据进行处理?

市场》和《云》所装载的EA创作者 的低资质是一个障碍。

 
Alexey Navoykov:
那么,是什么阻止了在OnTick处理程序中请求一次tick,并阻止了对收到的数据的进一步处理呢? 这实际上是没有成本的。 为什么要重新请求100次(如之前引用的测试),人为地制造刹车呢? 所以,建议通过复杂化MT的内部工作来解决歪曲EA代码的问题。还是你有一些正常的测量方法?

要由 "OnTick "处理的事件从外部接收到一些有优先级的队列中。在其他处理程序中,确保没有这样的新事件发生是很有用的,否则前一个tick的数据是无效的/过期的。

 
Alexey Navoykov:
那么,是什么阻止了你在OnTick处理程序中请求一次这个tick,然后处理产生的数据呢? 这实际上是没有价值的。 为什么要费力地请求它100次(如上面的测试),人为地在现场制造一个刹车。

这正是我在测试器中做的事情

Alexey Navoykov:
也就是说,歪曲的EA代码的问题应该是通过复杂化MT的内部运作来解决的。还是你有一些正常的测量方法?

那么,代码是由常见的编码实践决定的,看看这些例子中的QB和安全线的使用吧

我不使用SB,我已经用剖析器 测量了几个月,并寻找解决方案,有一个关于速度测试的主题,部分抛出了替代解决方案

这是一个滑坡,必须认真处理,我对我的EA优化很满意,在18个月6秒时有一个通过,现在是2.5秒,我认为我对自己做得很好))))。

 
根据.... 的材料出现了以下考虑。
鉴于UninitializeReason()可以在程序的任何部分被调用,特别是在OnInit()中(如果这样的调用不是有意的,范围可以扩大)。
有人建议。

如果_UninitReason变量的值在OnDeinit()被调用之前生成。
以及如果不能定义EA之前的去初始化的原因(REASON_PROGRAM,REASON_REMOVE,等等)。
在这个调用之前,它应该是未定义的(-1)。现在是0,也就是说,实际上是REASON_PROGRAM

如果EA完全重新启动(REASON_RECOMPILE,REASON_ACCOUNT,REASON_CLOSE,等等),那么
在启动一个新的程序实例时,似乎可以将_UninitReason变量设置为一个适当的值(REASON_RECOMPILE,REASON_ACCOUNT,REASON_CLOSE,等等)。

而不是目前的0,也就是说,实际上REASON_PROGRAM

如果专家顾问被部分重启(REASON_CHARTCHANGE等),OnInit()中的_UninitReason变量仍然等于相应的值(REASON_CHARTCHANGE等)。
并不需要改变
 
MT5错误(build 2450)模板类方法的正向声明的编译错误

template<typename T>
class A{};


class B{
public:
   template<typename T>
   void test(A<T> &a);
};

template<typename T>
void B::test(A<T> &a){}   // 'test' - member function already defined with different parameters 


void OnStart(){ 
   B b;
} 
 

当重新启动终端时,它连续不停地写到记录日志上

2020.05.24 03:36:03.342 HistoryBase     'GBPUSD' 1 invalid bars removed

日志中的历史栏时间不断增加。英镑兑美元日线图 是开放的,而且是躁动的--零,第一和第二条被删除/创建。就这样周而复始。

我在这里等待。它是否会用这些日志填满所有的固态硬盘,还是会最后停止...

昨天的日志在拖车上。

附加的文件:
20200523.zip  304 kb