错误、漏洞、问题 - 页 2101

 
damirqa:

你好,我从https://www.mql5.com/ru/articles/100,开始学习MQL5。我启动了代码,得到了错误4756。 我翻阅了文档,也没有好转。我想我应该从简单的东西开始(警报/打印......)。其中一个最重要的功能是OrderSend。我开始在论坛/文档中搜索如何使用OrderSend。我发现这篇文章https://www.mql5.com/ru/docs/constants/tradingconstants/enum_trade_request_actions,并 找到了开设买入头寸的代码。我得到了错误4756和检索码10030。我理解10030--它是OrderSend属性,但我没有理解这个属性应该如何使用(我看了别人的代码),它主要用于什么。然后我打开https://www.mql5.com/ru/docs/trading/ordersend, 复制了代码,运行它,工作正常。
但我仍然不明白为什么会出现错误4756,以及如何摆脱它,还有10030。

看了一下之间的代码

和这个。

在我看来它们几乎是一样的,我没有看到这些错误出现在哪里(4756和10030)。请指证和解释

结构中的一个字段没有被填入。而且这 不够,但也不是这样的错误。

即时执行

在即时执行模式(以流价交易的模式)下开仓的交易指令。9个字是必须的。

  • 行动
  • 标志
  • 价格
  • 俚语
  • tp
  • 偏差
  • 类型
  • Type_filling

你还可以指定魔法和评论字段。

市场执行

在市场执行模式下建立头寸的交易指令。需要指定5个字段。

  • 行动
  • 标志
  • 类型
  • Type_filling

你还可以指定魔法和评论字段。


 

1736年有什么更新,里面有什么内容,我在哪里可以看到?

 

我建议给一个机会,以编程方式确定在图表上绘制哪个指标缓冲区。

假设一个交易员开始自己的指标,我们不知道有多少缓冲区是用来计算的,有多少是用来在图表上 绘制指标 的。

通过以下方式解决自定义指标

intChartIndicatorGet(
longchart_id,// 图表标识符
intsub_window// 子窗口的编号
const string indicator_shortname // 短的指标名称
);


我们还可以请求画图缓冲区的数组

intChartIndicatorGet(
longchart_id,// 图表标识符
intsub_window//窗口编号
const string indicator_shortname // 短的指标名称

int & IndicatorVisualBuffer[] // 绘图缓冲区编号...)。


这将扩大与安装在图表上的未知指标一起工作的可能性...

 
Vladimir Pastushak:

我建议给一个机会,以编程方式确定在图表上绘制哪个指标缓冲区。

假设一个交易员开始他的指标,我们不知道有多少缓冲区是用来计算的,有多少是用来在图表上 绘制指标 的。

通过以下方式向指标寻址

intChartIndicatorGet(
longchart_id,// 图表ID
intsub_window// 子窗口的编号
const string indicator_shortname // 短的指标名称
);


我们也可以要求绘图缓冲区阵列

intChartIndicatorGet(
longchart_id,// 图表标识符
intsub_window//窗口编号
const string indicator_shortname // 短的指标名称

int & IndicatorVisualBuffer[] // 绘图缓冲区编号...)。


这将增加与安装在图表中的未知指标合作的可能性...

它的回报是什么?

int  ChartIndicatorGet(
   long           chart_id,              // идентификатор графика
   int            sub_window             // номер подокна
   const string   indicator_shortname    // короткое имя индикатора
   );

添加它又有什么用呢?你想添加一个输入参数,并接收相同的指标句柄作为响应...

如果你不介意的话,需要什么目的呢?我不是在讽刺。毕竟,在我看来,如果有人提出建议,你就应该为建议的必要性提供令人信服的论据。

 
Alexey Viktorov:

它的回报是什么

添加它有什么好处?你建议添加一个输入参数,并得到相同的指标手柄作为回应...

如果这并不困难,那么这种必要性是出于什么目的出现的呢?这个问题是没有讽刺意味的。毕竟,在我看来,如果提供了某种东西,就有必要给出令人信服的论据,说明提供这种东西的必要性。


用户把任何指标。

专家顾问会自动找到它并使用缓冲数据来接收信号。


现在我们必须使用iCustom,如果我们能写出参数列表,这里的问题是缓冲区....。

可以通过复制来计算缓冲区的数量,但要了解哪一个是不可能的。

 
Vladimir Pastushak:

用户放置任何指标。

专家顾问会自动找到它,并使用缓冲数据来获得信号。


现在我们必须使用iCustom,如果我们能写出参数列表,这里有缓冲区的问题....。

用Copy程序计算缓冲区的数量是可能的,但不可能了解哪一个缓冲区在画图 ...

为什么不可能呢?缓冲区INDICATOR_CALCULATIONS可以通过iCustom()取出来吗?

这是一个有趣的问题,但不是在这个主题中讨论它。我个人怀疑它是否能在某种程度上改善或简化程序员的工作。这些指标太不同了,其应用条件也太不同了。然后,我们将不得不要求能够确定图形绘制的类型 和其他一些事情,我们的内部要求会像滚雪球一样越滚越大。

 
Alexey Viktorov:

为什么不可能呢?是否可以通过iCustom()到达INDICATOR_CALCULATIONS 缓冲区

这个问题很有意思,但不是在这个主题下讨论。我个人怀疑它是否能以某种方式改善或促进程序员的工作。有太多不同的指标和太多不同的应用条件。然后,我们将不得不要求能够确定图形绘制的类型,然后是其他一些东西,要求会像雪球一样越滚越大。


理论上,默认写在指标中的东西,我不是说程序员的代码,应该是可以从外部 ...缓冲区的数量、绘图类型、颜色和其他标准 ...

 

这是我遇到的问题。

我决定使用ChartID除以1000或10000的余数作为魔法,这其实并不重要。

但由于某些原因,在不同的ChartID()下,除法的剩余部分突然变得一样了。问题:为什么?

检查脚本

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d = 100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
}/*******************************************************************/

结果

2018.01.15 13:01:45.881 Script 00 EURUSD,M15: removed
2018.01.15 13:01:45.881 00 EURUSD,M15: uninit reason 0
2018.01.15 13:01:45.881 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:45.881 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 13:01:45.881 00 EURUSD,M15: initialized
2018.01.15 13:01:45.871 Script Test\00 EURUSD,M15: loaded successfully
2018.01.15 13:01:40.361 Script 00 EURUSD,H1: removed
2018.01.15 13:01:40.361 00 EURUSD,H1: uninit reason 0
2018.01.15 13:01:40.361 00 EURUSD,H1: fmod(ChartID(), 100000) = 74912
2018.01.15 13:01:40.361 00 EURUSD,H1: ChartID - 131472503841474908
2018.01.15 13:01:40.361 00 EURUSD,H1: initialized
2018.01.15 13:01:40.351 Script Test\00 EURUSD,H1: loaded successfully

我预计会分别看到74907和74908,因为其余的划分应该是一样的。


我也在等待这个问题的答案。

关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

Alexey Viktorov, 2018.01.09 14:21

在MT5测试器中,"输入字段 "对象OBJ_EDIT不允许编辑其中的值这是它的设计方式还是一个错误?

在终端和MT4测试器中,它是可编辑的,但在MT5测试器中,它不想编辑,创建对象 时以编程方式输入的值完全消失了。


 
Alexey Viktorov:

但由于某些原因,不同的ChartID()突然产生了相同的除法残差。问题:为什么?

因为输入fmod是双倍的。Double不能存储大量的整数。例如,这是你的案子。

Print(DoubleToString((double)131472503841474907, 0)); // 131472503841474912

做到这一点。

long fmod( const long Value, const long Value2 )
{
  return(Value % Value2);
}


以float为例,你可以很快理解double的特殊性。

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{
  for (int i = 0; i < INT_MAX; i++)
    if ((int)(float)i != i)
    {
      PRINT(i);
      PRINT((float)i);
      PRINT((double)i);
      
      break;
    }
}


结果

i = 16777217
(float)i = 16777216.0
(double)i = 16777217.0


SZY Double不会丢失整个内部范围的信息,而长时间则不然。

 
fxsaber:

因为输入的fmod是双倍的。Double不能存储大量的整数。例如,你的案子。

做到这一点。

当然,我现在会检查这个样本,但我也有一个这样的检查代码

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", fmod(ChartID(), d));
  printf("LONG_MAX = %I64d",LONG_MAX);
  printf("DBL_MAX = %.16e",DBL_MAX);
  Print("DBL_MAX-LONG_MAX = ", DBL_MAX-LONG_MAX);
}/*******************************************************************/

结果是

2018.01.15 14:07:20.440 Script 00 EURUSD,M15: removed
2018.01.15 14:07:20.440 00 EURUSD,M15: uninit reason 0
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX-LONG_MAX = 17976931348623157081452742373170435679807 0567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
2018.01.15 14:07:20.440 00 EURUSD,M15: DBL_MAX = 1.7976931348623157 e+308
2018.01.15 14:07:20.440 00 EURUSD,M15: LONG_MAX = 9223372036854775807
2018.01.15 14:07:20.440 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:07:20.440 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:07:20.440 00 EURUSD,M15: initialized
2018.01.15 14:07:20.430 Script Test\00 EURUSD,M15: loaded successfully

它表示不应该有值截断。


但在这里,我检查了这个变体,并略微改变了建议的内容

/********************Script program start function*******************/
void OnStart()
{
  long chartID = ChartID(), d=100000;
  Print("ChartID - ", ChartID());
  Print("fmod(ChartID(), ",  d, ") = ", (long)fmod(ChartID(), d));
  Print("ChartID() % ", d, " = ", ChartID() % d);
}/*******************************************************************/

并得到了预期的变体。

2018.01.15 14:17:51.301 Script 00 EURUSD,M15: removed
2018.01.15 14:17:51.301 00 EURUSD,M15: uninit reason 0
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID() % 100000 = 74907
2018.01.15 14:17:51.301 00 EURUSD,M15: fmod(ChartID(), 100000) = 74912
2018.01.15 14:17:51.301 00 EURUSD,M15: ChartID - 131472503841474907
2018.01.15 14:17:51.301 00 EURUSD,M15: initialized
2018.01.15 14:17:51.291 Script Test\00 EURUSD,M15: loaded successfully

另一个问题出现了。

如果MathMod以及fmod 两个数字相除后 返回实数余数而根据文件规定的百分比

余下的分钟数=时间%60


为什么会有区别?