错误、漏洞、问题 - 页 1724

 
MK,你为什么不在标准库中 加入二进制搜索的正常函数?ArrayBsearch只适用于类型简单,不需要自定义比较器的简单情况。模板就在那里,在c++::std::lower/upper_bound之上做一个覆盖。到目前为止,我不得不自己写,这是不正常的(几乎完全从cppreference抄袭)。
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

在这个过程中,出现了几个问题。
1.为什么不能在Comp中写operator()(由于某些原因被禁止)?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2.为什么我们不能把pr值传递给接受常数引用的函数?
lower_bound(ar, 6, cmp) ); // ошибка
ZS: 还有一个非常恼人的警告:"结构没有成员,大小分配为1字节"
 
coderex:

那里一切正常,下单应该通过OnTradeTransaction来控制,顺便说一下,如果你通过Plaza2直接连接到交易所,情况是一样的--你需要控制关于下单的消息的到来。在MT4中,该功能是同步的,但在MT5中也有同样的选项,只是在这种情况下,逻辑将停止,直到该功能没有收到回应。

如果你需要,我可以把控制类发给你,但它是为市场配售而写的,但很快我就会把它定下来用于限制器。

为了控制请求,你需要记住其放置的事实。该班级将寄给你。
 
fxsaber:
我非常希望你能在kodobase上发布一些信息!用于教育目的。

不能,因为你自己指出的原因,https://www.mql5.com/ru/forum/1111/page1743#comment_2877482。 最近我无法定位错误,花了很多时间将源代码形成servicedesk - 最后什么都没有出来,因为有很多交叉引用(一个拉着另一个的几何级数) - 我发了.ex5

出于教育目的,我可以建议这样的任务:在不引入额外变量的情况下简化h(),使f()在任何情况下都被调用一次。

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

编译错误

(*) 一般来说,在模式(1)中,A->(2)和const A->(3)都可以代替T。

这是为什么呢?一个带有const的模式不能接受非const--它违反了契约。

 
A100:

出于教育目的,我可以提出以下任务:在不引入额外变量的情况下,简化h(),使f()在任何情况下都被调用一次

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

这是为什么呢?带有const的模板不能接受非const--它违反了契约。

模板本身不是(与函数不同)--它的任务是进行替换(与#define相类似)。如果在替换结束时没有任何矛盾(也没有任何矛盾),模板就完成了它的任务。至少我试着用C++编译它,编译器没有给出错误或警告。
 
fxsaber:
这并不是真正的简化。在原来的MACRO+2*f+g1+g2=5 - 你有:MACRO+2*f+2*g1+2*g2=7。
 
Sergey Diubakin:

有人遇到过类似的问题吗?是终端的 "错误 "还是我的?

GetLastError()返回什么?
 
fxsaber:

MT5-OrderSend不是完全同步的 - 没有与交易环境同步。这意味着历史读数不符合真实情况。

没有超时是不可能的。这个问题没有可靠的解决方案,因为你必须在终端层面处理同步问题,而不是在服务器层面。

事实上,MT5用户正面临着MT4桥梁开发者所面临的问题。

如果发送了OrderSend,你必须记住(这就是潜在的漏洞所在),它已经完成了。然后忽略当前历史(交易环境),直到OnTrade中出现相应的信息。一旦到了,要记得忘记。

当没有REMEMBER时,你可以像MT4一样相信历史。

MT4-OrderSend是完全同步的。
我想知道--这样做是出于什么原因......。
我知道如果你异步地弄乱OrderSendAsync,你可以同时处理OnTrade和OnTradeTransaction。对于OrderSend,我希望有简单的行为,就像在MT4中一样。一旦它被调用,我们就会在输出中获得已经修改过的开仓和历史记录。
有一个微妙的观点。如果当前状态被存储在全局变量 中,并且对状态变化的预期需要相对较长的时间,而交易者设法改变EA的参数,全局变量将被重置,状态将被丢弃。
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef  MACRO
        }
#endif
                 g2();
#ifndef  MACRO
        }
#endif
}