文章 "自定义品种(符号):实践基础" - 页 6

 
Mr David Frederick Roberts #: 谢谢你,费尔南多,我怀疑是我做了什么蠢事,但我就是看不出来!正如我所说,我对 MT4 要熟悉得多(大约 8 年),我没有发现 MT5 中有两个"£Every Tick "选项。 我刚启动它,看到它被设置为 "Every Tick",就想如果它有真正的刻度,就会使用它们。这一定是个很简单的问题,再次感谢您的发现。
不客气!
 

也许在某个地方有 EqualVolumeBars 的新版本?使用该 EA 时,我发现了两个问题:

1.编译 EqualVolumeBars 时,会出现 1 个警告(在 Symbol.mqh 中很容易解决,例如用 _time 替换 time):

declaration of 'time' hides global variable	Symbol.mqh	28	47

2. Bars 消失。据我所知,当终端中出现新的一天时,就会出现这种情况。例如,TimeCurrent() 中的日期是 2023.06.03(BTCUSD 在周末跳动),而最后一个区间条形图是在 2023. 06.02 打开的。

只需几步就能重现这个问题:

  • 在 EqualVolumeBars 中换行 360(这样图表就不会自行更新):
//ChartSetSymbolPeriod(id,symbolName,PERIOD_M1);
  • 在 EURAUD 图表中添加 EqualVolumeBars,参数如下:

获得如下图表:

  • 右击图表并单击刷新。结果:


 
Andrei Iakovlev #:

也许某个地方有 EqualVolumeBars 的新版本?在使用此智能交易系统时,我发现了两个问题:

1.编译 EqualVolumeBars 时出现 1 个警告(在 Symbol.mqh 中很容易解决,例如用 _time 替换 time):

2. 条形图消失。据我所知,当终端中出现新的一天时,就会出现这种情况。例如,TimeCurrent() 中的日期是 2023.06.03(BTCUSD 在周末跳动),而最后一个区间条形图是在 2023.06.02 打开的。

您只需几步就可以重现这个问题:

  • 在 EqualVolumeBars 中换行 360(这样图表就不会自行更新):
  • 在 EURAUD 图表中添加 EqualVolumeBars,参数如下:

获得如下图表:

  • 右击图表并单击刷新。结果:


没有新版本。

终端中自定义字符的实现存在错误,我曾在某处写过,但并未真正修复。

在这种情况下,您可以查看代码 - 当启动 Expert Advisor 时,现有符号会被完全重新填充,因此,如果有多余的东西,或者相反,一天的开始就会消失 - 这就是 MQL5 API 的工作方式。

由于源代码是开放的,您可以提出修复建议来解决问题。

 

斯坦尼斯拉夫-科罗茨基

感谢您就 "自定义符号 "主题的各种方法和类型所做的一切。

其次,很抱歉用英语写作,因为我不懂俄语--:)

在 "RenkoTicks "代码中出现了一个问题(一种错误)。

1

您能否抽出时间消除这个错误?

问候

Stanislav Korotky
Stanislav Korotky
  • 2023.04.26
  • www.mql5.com
Trader's profile
 
mntiwana #:

请您管理好时间,删除此错误

只需删除大括号内的 0 即可。请关注新闻公告中的 MQL5 语法更改。这一条有点旧了,我现在记不起确切的参考资料了。

 
Stanislav Korotky #:

这个有点旧了、

我又一次花了三年时间才找到这件艺术品。如果这是 "旧 "的,那么旧就是......慢。哈。谢谢。

 

关于 RenkoTicks.mq5,我在三位数定价时遇到了点数到点数的转换问题。我之前在 MT4 中的一些实用程序中也遇到过同样的问题,因此我实施了相同的修复方法:


//在全局中,插入
double _PntsToPips;

//在启动时,插入
if(_Digits == 3 || _Digits == 5)
{
 PntsToPips = 10;
}
else
{
 _PntsToPips = 1;
}

//在包含 _Point 的 2 行中(不在 sendSpread... 中),插入
* _PntsToPips //2 新行将是

double Renko::boxPoints = NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits);
Renko::setBoxPoints(NormalizeDouble(RenkoBoxSize * _Point * _PntsToPips, _Digits));


 

这里是对基于 2 MA 交叉的自定义信号的一个微小但重要的改进。底层指标对象维护着包含指标数据的内部缓冲区(不仅是 MA 情况,而且是一般情况),因此调用m_maFast.Main(ind)m_maSlow.Main(ind) 会导致从对象而不是从指标本身读取过时(缓存)的数据,如果您的交易系统是按刻度线交易的话(!)。现在,它被以下对GetData 的调用所取代,GetData 基本上是直接CopyBuffer 的封装:

class Signal2MACross : public CExpertSignal
{
    ...
    // 读取指标数据的辅助函数
    double FastMA(int ind) { static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer); return buffer[0]; }
    double SlowMA(int ind) { static double buffer[1]; m_maSlow.GetData(ind, 1, 0, buffer); return buffer[0]; }
};

更新后的头文件附后。它应该放在/MQL5/Include/Expert/Signal/MySignals/。如果没有这个头文件,信号将由已完成的条形图建立。

附加的文件:
 
<br/ translate="no">

结果更糟。有些时候,当新的刻度被触发时,时间序列还没有被重新计算 ,因此应该动态调整条形图指数,以便进行交易信号分析。例如(粗略方法):

    double FastMA(int ind)
    {
      MqlTick t;
      SymbolInfoTick(m_symbol.Name(), t);
      bool correction = false;

      if(t.time / 60 * 60 != iTime(m_symbol.Name(), PERIOD_CURRENT, 0) && ind > 0)
      {
        ind--;
        correction = true;
      }
      
      static double buffer[1]; m_maFast.GetData(ind, 1, 0, buffer);
      
      if(correction)
        PrintFormat("F: %s'%03d %s %.5f", TimeToString(t.time, TIME_SECONDS), t.time_msc % 1000, TimeToString(iTime(m_symbol.Name(), PERIOD_CURRENT, 0)), buffer[0]);
        
      return buffer[0]; 
    }

这对于在开仓时交易的 EA 和刻度稀疏的符号至关重要。

 

如何使用 (bid+ask)/2 公式制作平均价格在线图表?