エラー、バグ、質問 - ページ 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を 使用するとやはりエラーが出ます。

  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;
  }

0.01=1000、0.10=10000というように、ロットをintで送る必要がある......。

 
Interesting:

0.01=1000、0.10=10000といった具合に、ロットはint型としてここに送られるはずだ...。

あなたの話によると、結局、関数
SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
は0.01の代わりに1000を返す
 
sergey1294:
ということは、関数
は0.01ではなく1,000の値を返します。

いえ、このようなコードにすれば、エラーはなくなるという意味です。

  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:
であることに今気づきました。
が倍精度の数値を使用できない場合、このオプションは使用できません。
あらかじめlotを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倍して、それをswitch(StepSize)にパラメータ(int型の 変数)として入力するだけでよいのです。


追記

また、一般的には、正直なところ、このようなバリエーションがあることの目的がよくわからないのですが?つまり、この機能の文脈では、最後のひとつ......で十分なんです。

 
Interesting:

最終的に何を得たいかによりますが、例えば、ここでは、リスクに関する興味深い関数をあげてみました。


そして、このコードを動作させるには、lotに100000を掛けて、それをパラメータ(int型の 変数)としてswitch(StepSize)に渡せばよいのです。

あなたの記事は、私に必要なものだと思います。感謝