エラー、バグ、質問 - ページ 101

 
Urain:

どっちでもいい。

if(a==0){expression} は a が 0 ならば真なので {expression} を実行する、という意味です。

if(a=0){expression} は if(a){a=0;expression} と同じ意味です。が真であれば、{a=0;式}となる。

2つ目は間違いで、次のように書くべきです。

if(a=x) { 式 } xの値を変数aに代入し、その後aが0でなければ式を実行する。

if(a=0) { } 最適化後はa=0しかない

 
mql5:

2つ目は間違いです。 正しくは次のように書きます。

if(a=x) { 式 } 変数aにxの値を代入し、その後aが0でなければ式を実行する。

if(a=0) { } 最適化後はa=0しかない

すみません、そうなんです、表現は左から右に実行されます。

だからこそ、まずはアサインメントから始めて、真偽を確認するのです。

 
Renat:

だいたいこんな感じです。

このコードは、最大ボリュームを 計算するだけでなく、シンボル設定の制限に正確にフィットさせることができます。

計算するのですが、挿入するときになぜ計算したのか忘れてしまいます。

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=minvol;

この時点までのロットの値は、最小限のマージンで利用可能なすべてのマージンを消費するように計算されます。

この値が少なくともボリュームステップ増加した場合、ポジションを開くのに十分な資金がないことになります。

しかし、引用したコードの2行目は、ifの条件が満たされた場合のlotの値を作り出しており、実際にはvolume min = 0.1 と volume step = 0.01 が存在するため、volume stepの値よりもはるかに大きな値で増加させることができます。

そして、この下のコードでは、ゼロによる除算が発生する可能性があり、これに対する保護はありません。

   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);

SymbolInfoDouble()が0を返したら、それでおしまいです。MQL5のプログラムは、0による除算で終了しますよね?0を返すことはできないのですか?ここで、情報系の関数がよく0を返すと文句を言う人がいますが、「0は返さない」と言い切ることはできません。なぜなら、第一に返す可能性があり、第二に、0による除算は致命的だからです。

入力の正確さ」については、あまり重要ではない、つまり、それほど重大な結果をもたらさないので、無視してよいという指摘もあります。

コードが "おおよそ "であるという議論を想定して、このような "悪いところ "を発見し、適切に修正できるユーザーがどれだけいるのか?

彼らにとっては、これが「開発者からのコード」なのです。見習うべきは、お手本。

 

必須項目がすべて入力されているのに、「次へ」ボタンがアクティブにならないのはなぜですか?

 
EvgeTrofi:

必須項目がすべて入力されているのに、「次へ」ボタンがアクティブにならないのはなぜですか?

メールマガジンの郵送を希望される場合は、ご本人の承諾が必要です。
 
simpleton:

計算はするのですが、何のために計算していたのか忘れてしまうのです。

このような "悪いところ "を正しく修正できるユーザーがどれだけいるのだろうか。

コードはおおよそのもの(2枚からコピーしたもの)でしたが、コメントはその通りです。

以下は、その修正版です。

double CalculateMaxVolume(string symbol)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,price))                return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,symbol,1.0,price,margin)) return(0.0);
   if(margin<=0.0)                                            return(0.0);

   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
     {
      double newlot=stepvol*NormalizeDouble(lot/stepvol,0);
      if(newlot>lot) lot=NormalizeDouble(newlot-stepvol,2);
      else           lot=newlot;
     }

   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol) lot=0.0;   // 

   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol) lot=maxvol;
//--- return trading volume
   return(lot);
  }
 
gumgum:

また、session_index=1がすでにfalseなのに、なぜsession_index++;なのでしょうか。

ツールごとのセッション数を事前に把握することはできない。そこで、各セッションを番号で問い合わせる。もし、それが本当なら

session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);

その始まりと終わりの時間に興味があるのです。もし、falseが出たら、その番号のセッションはありません。

 
Rosh:

楽器のセッション数を事前に把握することはできません。そのため、各セッションを番号でお願いしています。もし、それが本当なら

その始まりと終わりの時間を分析します。もし、falseが出たら、その番号のセッションはありません。

A...... では、なぜ金曜日は24時ですべてが終わり、実際には23時なのでしょうか?
 
gumgum:
A......では、なぜ金曜日は24時、現実は23時にすべてが終わるのでしょうか?
なぜなら、サーバーがそう言っているからです。調べてみます、ありがとうございます。
 
プロフィールでメールを変更できるようになったとのことですが?電子メール 欄の変更は可能ですが、保存はされません。