初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1446

 
Alexey Viktorov #:

1.如果没有收到底座手柄,则无需关闭底座。

2.如果收到 INVALID_HANDLE,为什么还要继续执行程序?我认为在这种情况下最好中断程序,返回

我现在反复尝试打开和关闭一个不存在的数据库,却无法得到错误的打印输出。我认为在向数据库创建查询的过程中会出现打印错误,因为数据库无法打开。

我将制作一个最小的测试智能交易系统,每秒更新数据库中的记录。让我们在 10 个交易对上运行它,一切就会清楚了。我将把它发布在这里...
 
Evgeny Dyuka #:
我将制作一个最小的测试智能交易系统,每秒更新数据库中的记录。在 10 个货币对上运行它,一切都会很清楚。我会把它发布在这里。

很有意思。我等着呢...

 
Alexey Viktorov #:

真有意思我会等着...

这里有一个专家。它创建了一个基数(如果还不存在的话),每秒向其中写入一次当前时间。
代码中没有 Print()。
我在 10 对数据上运行了它,结果出现了错误:

CS      2       11:44:36.561    Test_DB (EURUSD,M10)    database error, database is locked
CS      2       11:55:27.018    Test_DB (BTCUSD,M10)    database error, database is locked
CS      2       11:55:28.026    Test_DB (BTCUSD,M10)    database error, database is locked
CS      2       11:55:49.177    Test_DB (TRXUSD,M10)    database error, database is locked
CS      2       11:55:51.183    Test_DB (EURUSD,M10)    database error, database is locked
CS      2       11:55:53.182    Test_DB (TRXUSD,M10)    database error, database is locked

如果出现错误,您必须关闭并重新启动 MT5,然后所有 EA 开始同步工作。

最好是:
1.了解如何摆脱此错误。
2. 发明一种模板机制,在基础不可用的情况下排队。

我通过添加带有随机时间的 Sleep() 解决了第 2 点,但它看起来像一根拐杖。

更新:重新上传了文件,第一个文件出现了错误

附加的文件:
Test_DB_1.mq5  3 kb
 
Evgeny Dyuka #:

这里有一位专家。它创建了一个基数(如果还不存在的话),每秒向其中写入一次当前时间。
代码中没有 Print()。
我在 10 对时间对上运行了它,结果出现了错误:

如果出现错误,您应该关闭并重启 MT5,然后所有智能交易系统开始同步运行。

最好是:
1.了解如何摆脱此错误。
2. 发明一种模板机制,在基础不可用的情况下排队。

我通过添加带有随机时间的 Sleep() 解决了第 2 点,但它看起来像一根拐杖。

更新:重新上传了文件,第一个文件出现了错误

唉,我的知识还不够。只知道打印出了一个错误

      DatabaseExecute(db, sql);

在创建查询之前,无法检查可用性。

数据库可以打开,但无法创建查询。

 
服务器上没有打开订单,没有止损和止盈,启用了算法模式,设置命令通过,但日志是无声的CTrade。测试仪在真实交易中是静默的。需要检查什么?
 
mwwm CTrade 类。测试仪在真实交易中是静默的。要检查什么?

终端日志

 
Vladimir Deryagin #:

终端日志

我猜我打开了日志,但无法计算批次。我不明白为什么它不愿意进行实际计算?

void OpenBuy(const int index,double sl,double tp)
  {
   sl=m_symbol.NormalizePrice(sl);
   tp=m_symbol.NormalizePrice(tp);
   double long_lot=0.0;
   if(InpLotOrRisk==risk)
     {
      long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);
      if(InpPrintLog)
         Print(__FILE__," ",__FUNCTION__,", OK: ","sl=",DoubleToString(sl,m_symbol.Digits()),
               ", CheckOpenLong: ",DoubleToString(long_lot,2),
               ", Balance: ",    DoubleToString(m_account.Balance(),2),
               ", Equity: ",     DoubleToString(m_account.Equity(),2),
               ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));
      if(long_lot==0.0)
        {
         ArrayRemove(SPosition,index,1);
         if(InpPrintLog)
            Print(__FILE__," ",__FUNCTION__,", ERROR: ","CMoneyFixedMargin.CheckOpenLong returned the value of 0.0");
         return;
        }
     }
 
mwwm #:

我猜我打开了日志,但它无法计算批次。我不明白为什么它不愿意进行实际计算?

因为没有日志,所以可能会有更多的猜测。

作为一个选项,在进行交叉盘交易时,如果在市场概览中没有选择与存款货币相同的货币对,则不会进行交易。

例如,我们交易 EURJPY,入金货币为美元,则在市场概览中必须显示 EURUSD 和 USDJPY。

 
Aleksandr Slavskii #:

没有日志,所以可能会有更多倍的猜测。

作为一个选项,在进行交叉盘交易时,如果在市场概览中没有选择存款货币对,则不会进行交易。

例如,我们交易 EURJPY,入金货币为美元,则在市场概览中必须显示 EURUSD 和 USDJPY。

以美元为单位的账户,交易 XAUUSD

 

大家好。在 MQL5 中,我无法使用缓冲区在第一个条形图上绘制一个箭头。

在 MQL4 中,我的做法如下:

声明一个全局变量 double XX[];

写入 init:

SetIndexBuffer(0,XX);

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,108);

在 "计算 "中,我写道

XX[1]=High[1];我在蜡烛图 1 上得到一个绘制的箭头。

我在 MQL5 中也是这样做的:

声明一个全局变量 double XX[];

写入 init:

SetIndexBuffer(0,XX,INDICATOR_DATA);

PlotIndexSetInteger(0,PLOT_ARROW,108);

在 Oncalculate 中,我写道

XX[1]=high[1]; - 它不会绘制

XX[1]=iHigh(Symbol(),PERIOD_CURRENT,1); - 也不绘制。

当然,即使在标题中也有说明:

#property indicator_buffers 1

#property indicator_plots 1

#property indicator_type1 DRAW_ARROW

#property indicator_color1 clrGreen

#property indicator_width1 1

我做错了什么,请告诉我 !!!!

原因: