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

 

如何连接到Meta Quotes服务器,使dll库能够发送订单和交换数据,从而使c++语言,而不是mql4,尽可能地参与EA的实现?


是否可以使用dll库在MT4中绘制对象,有什么可以学习的?

 
Mihail Matkovskij:

但为什么用iBars(符号,时间框架)时,故事会变得不完整,而用iBars(符号(),周期()时,则很正常?而且它只在终端重新启动时发生,并不总是如此。在初始化部分,符号、时间框架等变量被正确初始化(我自己检查过)。

试着挤一挤我的例子:https://c.mql5.com/3/324/Test.mq5

行动的顺序。

1.把编译好的文件扔给图表。当你这样做时,你得到的信息。

2.终止终端并再次启动。日志中的信息将如下。

解决了。

而不是这样的代码

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }

我写了以下内容

public:  
  Loader(): symbol(NULL), timeframe(PERIOD_CURRENT) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe));
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); 
  }

现在,重启终端时没有错误。但是,符号和时间框架只需要用空值进行初始化。

这里有两个版本的源代码,有一个错误和一个工作版本。让我提醒你,测试的顺序如下:https://www.mql5.com/ru/forum/160683/page1189#comment_17047032

附加的文件:
Bug.mq5  7 kb
Correct.mq5  6 kb
 
Seric29:

如何连接到Meta Quotes服务器,以便dll库可以发送订单和交换数据,从而使专家顾问的实现尽可能涉及C++语言而不是mql4?

没有办法。该协议已经结束。

是否可以使用dll库在MT4中绘制对象? 我可以研究一下吗?

不,你不能。

 
Seric29:

哇,我去看看。我知道你可以用函数初始化带有数组元素 的变量,但我不知道它会自动改变,我想在C++中也没有这样的东西,我以后再查。

我犯了一个错误(

如果你需要在交易操作前重新计算手数,你最好将手数定义放在OnTick的开始处

或(如我所改)OnTimer

 

你好!请帮助我输出所有的值,我只能输出最后的值。第二个问题,如何将这些数值向右移动 后输出(设置任何移动)。谢谢你!

   for(int p = 0; p < 4; p++)
      for(int c = 0; c < 4; c++)
         for(int ps = 0; ps < 4; ps++)
            Comment(StringFormat("Выводим значения\nP = %G\nC = %G\nPS = %d", p, c, ps));
 

我在哪里可以读到印刷中的定界符? 不是加号就是逗号定界符,我看不懂,很乱。

Print(a, b + "abc") ;

 
Koldun Zloy:

负面的。该协议已经结束。

你不能。

你的意思是协议已经关闭。在mql4中有订单开放功能,它本质上只是代码。对于图形对象也是如此。我听说mql4是一个商业产品,这就是为什么没有源代码或嵌入式函数(如Arrayresize/Range等)。例如,我不太愿意用mql4来写程序,它是太死的语言,非常有限。语言Win API 32怎么样,它对我的问题无能为力吗?我想,对于Win API 32来说,一切也都是封闭的。

 
Seric29:

你的意思是协议已经关闭。在mql4中有订单开放功能,它本质上只是普通的代码。对于图形对象也是如此。我听说mql4是一个商业产品,这就是为什么没有源代码或嵌入式函数(如Arrayresize/Range等)。例如,我不太愿意用mql4来写程序,它是太死的语言,非常有限。语言Win API 32怎么样,它对我的问题无能为力吗?也许,一切都被锁定在Win API 32上。

最好是做一个单独的主题,这样会更有活力)

 
MakarFX:

我犯了一个错误(

如果你在进行交易操作前需要重新计算手数,最好将手数定义放在OnTick的开始部分。

或(如我所改)OnTimer

我的意思是,你用表达式初始化了 "lot "变量,你不能让这个表达式自动填入。你甚至可以检查一下,拿一个简单的计数器,在初始化过程中分配计数器的值,然后改变计数器,除非你自己改变它,否则Lot的值不会改变。它在C++中工作。

int Pomidor=9;
int Pomidor1(int q=Pomidor){return q;}//при инициализации
Вызов
Print(Pomidor());// результат будет автоматически равен Pomidor и это будет регулярная смена значений 

但它在mql4中不工作,它只像这样工作

int Pomidor1(int q=67){return q;}

结果67。

 
Valeriy Yastremskiy:

最好另起炉灶,这样会更有活力)

我也在想,这个话题是有意义的,但当然不是说值得把论坛塞满,也许很多人对这个话题不感兴趣。我很感兴趣,我喜欢用C++写代码。

原因: