错误、漏洞、问题 - 页 7

 
FEDOR_MQL:

而在这个发展阶段:参数、函数调用 和函数本身是否应该显示编译时错误。如果是这样,为什么?我有错误。

是的,它确实由于某种原因显示错误,尽管不应该有任何错误。我请开发人员注意这一点。 我这样改了,没有错误,但当我使用switch开关时,仍然显示错误。

 //+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters

input double   Lots=0.1;
input bool     MM = true;
input double   Risk = 10.0;

double lots;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
  return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(MM) lots = LotSon();      //вызов функции LotSon 
   else lots = Lots;
  }
//+------------------------------------------------------------------+
double LotSon()
{
  double LotMin     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
  double LotMax     = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
  double LotStep    = SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
  double Lot        = AccountInfoDouble(ACCOUNT_FREEMARGIN)/100000.0 * Risk;
  Lot               = MathMin(LotMax,MathMax(LotMin,Lot));
  
  if (Lot < LotMin) Lot = LotMin;
  if (Lot > LotMax) Lot = LotMax;
  // Вариант первый
  /*
  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }
  */
  // Вариант второй
  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
  // Вариант третий
  // if (LotStep == 0.01)     Lot=NormalizeDouble(Lot,2);
  // else if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  // else if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);
 return(Lot); 
}
 
sergey1294:

是的,的确,由于某些原因出现了错误,尽管应该没有。我请开发人员注意这一点,我重新这样做了,没有错误,但当使用开关 时,仍然出现错误。

  switch(LotStep)
  {
   case 0.01: Lot=NormalizeDouble(Lot,2);break;
   case 0.1 : Lot=NormalizeDouble(Lot,1);break;
   case 1.0 : Lot=NormalizeDouble(Lot,0);break;
  }

你必须以int形式发送手数,即0.01=1000,0.10=10000......

 
Interesting:

手数应在此以int形式发送,即0.01=1000,0.10=10000......

根据你的说法,事实证明,函数
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
返回1000,而不是0.01
 
sergey1294:
所以你是说,函数
返回值为1,000,而不是0.01。

不,我的意思是,如果代码看起来像这样,错误就会消失。

  switch(StepSize)
  {
   case 1000:   Lot=NormalizeDouble(Lot,2);break;
   case 10000:  Lot=NormalizeDouble(Lot,1);break;
   case 100000: Lot=NormalizeDouble(Lot,0);break;
  }
 
现在才注意到,在
switch
不能使用双精度数字,那么在这种情况下就不能使用这个选项。
 
sergey1294:
现在才注意到,在
不能使用双精度数字,那么在这种情况下就不能使用这个选项。
如果你事先把很多东西转换为int,你就可以。正如我上面所说的...
 
问题是,为什么不能使用这种设计?
  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
 
Interesting:
如果你把地段转换为int,你可以这样做。我在上面所说的...

如果你不介意的话,我可以看看代码吗?我试过各种方法,但都不奏效。

我不知道以证券的百分比来增加风险是否更容易。谢谢你!

 
FEDOR_MQL:

如果你不介意的话,我可以看看代码吗?我试过各种方法,但都不奏效。

我不知道是否有其他简单的变体,只是在EA中加入存款百分比的风险。谢谢你!

这取决于你需要什么结果。 例如,在这里,我给出了一些关于风险计算的有趣函数


而要使这段代码工作,你只需要将手数乘以100000,并将其作为参数(int类型的 变量)送入switch(StepSize)。


PS

而且总的来说,说实话,我不太理解所有这些变体的目的?我的意思是,在这个函数的背景下,最后的一个....,就足够了。

 
Interesting:

这取决于你想在最终结果中得到什么,这里,例如,我给出了一些关于风险的有趣函数


为了使这段代码工作,你只需要将lot乘以100000,然后作为一个参数(int类型的 变量)传给switch(StepSize)。

你的文章是我认为我需要的。谢谢
原因: