错误、漏洞、问题 - 页 8

 
FEDOR_MQL:

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

我不知道以证券的百分比来增加风险是否更容易。我想用这个代码作为例子,展示我的交易机器人的盈利能力。

我给了你一个没有错误的代码
 
sergey1294:

每个 案例变体 可以用一个整数常数、一个字符常数或一个常数表达式来标记 一个常量表达式不能包括变量或函数调用 switch 语句 必须是整数类型 的。
 
Valmars:
每个 案例 变体 可以用一个整数常数、一个字符常数或一个常数表达式来标记 一个常量表达式不能包括变量或函数调用。 switch 语句 必须是整数类型 的。
这一点已经得到了处理。
 
sergey1294:
我给你的代码是可以无误工作的
你是对的,其余的代码应该被扔掉,而不是被保存......
 

我想知道为什么这样的结构不能工作,它给出了一个错误--'}'。- 不是所有的控制路径都会返回一个值

 //+------------------------------------------------------------------+
#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;

  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));
}
 
sergey1294:
我给了你没有错误的代码。
对不起,谢尔盖,我不知怎么就错过了。我现在找到了,非常感谢你们,我没想到会花这么长时间。
 
sergey1294:

我想知道为什么这样的结构不能工作,它给出了一个错误--'}'。- 不是所有的控制路径都会返回一个值


你认为这个函数应该返回什么?我的看法是
return(Lot);
 
Interesting:
你认为这个函数应该返回什么?在我看来--

它不是这样工作的。


  if (LotStep == 0.01)return(NormalizeDouble(Lot,2));
  if (LotStep == 0.1) return(NormalizeDouble(Lot,1));
  if (LotStep == 1.0) return(NormalizeDouble(Lot,0));

这就是它的工作方式。

  if (LotStep == 0.01)Lot=NormalizeDouble(Lot,2);
  if (LotStep == 0.1) Lot=NormalizeDouble(Lot,1);
  if (LotStep == 1.0) Lot=NormalizeDouble(Lot,0);

  return(Lot); 

	          
 
sergey1294:

它不像这样工作

对,而且没有用。这取决于每个人,但我个人一直认为, return() 应该在任何函数的结尾处声明,而且编译器也支持我这样做。


PS

就个人而言,早在MQL4中我就开始使用Result 变量来计算返回值。我应该注意到,在函数代码的结尾调用return() 是强制性的,它在代码的开头/中间出现有时会被认为是break 的某种类似物(唯一的区别是break 本身并不被编译器认为是返回函数结果值的命令)。

 

double类型的 变量使用==条件是不正确的。建议像这样进行比较。

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;

  if (MathAbs(LotStep-0.01)<0.001)return(NormalizeDouble(Lot,2));
  if (MathAbs(LotStep-0.1)<0.001) return(NormalizeDouble(Lot,1));
  if (MathAbs(LotStep-1.0)<0.001) return(NormalizeDouble(Lot,0));
  return(-1);
}
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Основы языка / Типы данных / Вещественные типы (double, float) - Документация по MQL5