エラー、バグ、質問 - ページ 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() はどんな関数でも最後に宣言するべきだと考えてきましたし、コンパイラもそれを支持しています。


追記

個人的には、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