专家: Multik

 

Multik:

多币种EA交易.

多币种EA交易

作者: Andrew Kornishkin

 

我们是否要按当前仪器对所有货币对进行标准化处理?

dsma2 = NormalizeDouble(SMA[2] - SMA[3], _Digits);      // 2-3 号站点的 MA
dsma1 = NormalizeDouble(SMA[1] - SMA[2], _Digits);      // 1-2 号站点的 MA
 
Valmars:

我们是否要按当前仪器对所有货币对进行标准化处理?


是的,这里有一个错误。此外,定义新条形图 的功能可以在不使用时间复制功能的情况下实现。
 
Valmars:

我们是否要按当前仪器对所有货币对进行标准化处理?


如何正确执行才不会出现警告?

在原始版本中是这样的:

     int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS) + 4;
     dsma2 = NormalizeDouble(SMA[2] - SMA[3], Digits_);      // 2-3 号站点的 MA
     dsma1 = NormalizeDouble(SMA[1] - SMA[2], Digits_);      // 1-2 号站点的 MA
[删除]  
AM2:

不发出警告的正确方法是什么?

原始版本是这样的:

+4 和它有什么关系?逻辑上应该是这样的

int Digits_ = SymbolInfoInteger(Symbol_, SYMBOL_DIGITS);
dsma2 = NormalizeDouble(SMA[2] - SMA[3], Digits_); // 2-3 号站点的 MA
dsma1 = NormalizeDouble(SMA[1] - SMA[2], Digits_); // 1-2 号站点的 MA
 
Interesting:

这和 +4 有什么关系?这应该是符合逻辑的。

警告也是这样写的

类型转换可能 导致数据丢失 Multik.mq5 218 18

 
AM2:

警告也是这样发出的:

类型转换可能 导致数据丢失 Multik.mq5 218 18

为避免警告,您需要像这样进行转换

int Digits_ = (int)SymbolInfoInteger(Symbol_, SYMBOL_DIGITS);
 

干得不错,但如果您用相同的设置交易相关的货币对,多工具不是就失去意义了吗?我预计它们的缩水会在同一时间出现,这可能是个问题。但不幸的是,所有货币对都是相互关联的,这可能是不可避免的。实际上,我也同时交易欧元/美元英镑/美元货币对,但其中一个使用趋势跟踪器,另一个使用反转、顶部和底部类型的 EA。

 
sergey1294:

如果不想收到警告,就必须这样转换。

谢谢,可以了!
 

request.volume = Money_M();

这套 EA 是代码井井有条的典范,而且有很好的注释。 不过,我有一个问题,是关于您的手数大小函数 Money_M()。 这背后的决策树是什么,在哪里?

我试着在支持网站上搜索,但没有找到任何参考资料,而且似乎也没有链接到相关的类。

[删除]  
bdwezensky:

request.volume = Money_M();

这套 EA 是代码井井有条的典范,而且有很好的注释。 但我有一个问题,关于您的手数大小函数 Money_M()。 这背后的决策树是什么,在哪里?

我试着在支持网站上搜索,但没有找到任何参考资料,而且似乎也没有链接到相关的类。

double Money_M()
  {
   double Lots=AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000*10;
   Lots=MathMin(5,MathMax(0.1,Lots));
   if(Lots<0.1)
      Lots=NormalizeDouble(Lots,2);
   else
     {
      if(Lots<1) Lots=NormalizeDouble(Lots,1);
      else       Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
  }

该函数用于计算交易手数的大小。

double Lots=AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000*10;

在这个字符串中,计算的是交易手数的大小。计算以可用资金(ACCOUNT_FREEMARGIN) 为基础。风险 = 可用自由资金的 10%。

Lots=MathMin(5,MathMax(0.1,Lots));
在这一行中,执行交易手数的标准化。0.1 <= 手数 <= 5.0