エラー、バグ、質問 - ページ 101 1...949596979899100101102103104105106107108...3185 新しいコメント Ilyas 2010.08.18 14:41 #1001 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しかない Mykola Demko 2010.08.18 14:47 #1002 mql5:2つ目は間違いです。 正しくは次のように書きます。 if(a=x) { 式 } 変数aにxの値を代入し、その後aが0でなければ式を実行する。if(a=0) { } 最適化後はa=0しかないすみません、そうなんです、表現は左から右に実行されます。だからこそ、まずはアサインメントから始めて、真偽を確認するのです。 削除済み 2010.08.19 02:32 #1003 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による除算は致命的だからです。入力の正確さ」については、あまり重要ではない、つまり、それほど重大な結果をもたらさないので、無視してよいという指摘もあります。コードが "おおよそ "であるという議論を想定して、このような "悪いところ "を発見し、適切に修正できるユーザーがどれだけいるのか?彼らにとっては、これが「開発者からのコード」なのです。見習うべきは、お手本。 Evgeniy Trofimov 2010.08.19 07:46 #1004 必須項目がすべて入力されているのに、「次へ」ボタンがアクティブにならないのはなぜですか? Andrey Dik 2010.08.19 08:30 #1005 EvgeTrofi:必須項目がすべて入力されているのに、「次へ」ボタンがアクティブにならないのはなぜですか? メールマガジンの郵送を希望される場合は、ご本人の承諾が必要です。 Renat Fatkhullin 2010.08.19 10:06 #1006 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); } Rashid Umarov 2010.08.19 15:59 #1007 gumgum:また、session_index=1がすでにfalseなのに、なぜsession_index++;なのでしょうか。ツールごとのセッション数を事前に把握することはできない。そこで、各セッションを番号で問い合わせる。もし、それが本当ならsession_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish); その始まりと終わりの時間に興味があるのです。もし、falseが出たら、その番号のセッションはありません。 gumgum 2010.08.19 16:04 #1008 Rosh:楽器のセッション数を事前に把握することはできません。そのため、各セッションを番号でお願いしています。もし、それが本当ならその始まりと終わりの時間を分析します。もし、falseが出たら、その番号のセッションはありません。 A...... では、なぜ金曜日は24時ですべてが終わり、実際には23時なのでしょうか? Rashid Umarov 2010.08.19 16:07 #1009 gumgum: A......では、なぜ金曜日は24時、現実は23時にすべてが終わるのでしょうか? なぜなら、サーバーがそう言っているからです。調べてみます、ありがとうございます。 gumgum 2010.08.19 19:39 #1010 プロフィールでメールを変更できるようになったとのことですが?電子メール 欄の変更は可能ですが、保存はされません。 1...949596979899100101102103104105106107108...3185 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
どっちでもいい。
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しかない
2つ目は間違いです。 正しくは次のように書きます。
if(a=x) { 式 } 変数aにxの値を代入し、その後aが0でなければ式を実行する。
if(a=0) { } 最適化後はa=0しかない
すみません、そうなんです、表現は左から右に実行されます。
だからこそ、まずはアサインメントから始めて、真偽を確認するのです。
だいたいこんな感じです。
このコードは、最大ボリュームを 計算するだけでなく、シンボル設定の制限に正確にフィットさせることができます。計算するのですが、挿入するときになぜ計算したのか忘れてしまいます。
この時点までのロットの値は、最小限のマージンで利用可能なすべてのマージンを消費するように計算されます。
この値が少なくともボリュームステップ増加した場合、ポジションを開くのに十分な資金がないことになります。
しかし、引用したコードの2行目は、ifの条件が満たされた場合のlotの値を作り出しており、実際にはvolume min = 0.1 と volume step = 0.01 が存在するため、volume stepの値よりもはるかに大きな値で増加させることができます。
そして、この下のコードでは、ゼロによる除算が発生する可能性があり、これに対する保護はありません。
SymbolInfoDouble()が0を返したら、それでおしまいです。MQL5のプログラムは、0による除算で終了しますよね?0を返すことはできないのですか?ここで、情報系の関数がよく0を返すと文句を言う人がいますが、「0は返さない」と言い切ることはできません。なぜなら、第一に返す可能性があり、第二に、0による除算は致命的だからです。
入力の正確さ」については、あまり重要ではない、つまり、それほど重大な結果をもたらさないので、無視してよいという指摘もあります。
コードが "おおよそ "であるという議論を想定して、このような "悪いところ "を発見し、適切に修正できるユーザーがどれだけいるのか?
彼らにとっては、これが「開発者からのコード」なのです。見習うべきは、お手本。
必須項目がすべて入力されているのに、「次へ」ボタンがアクティブにならないのはなぜですか?
必須項目がすべて入力されているのに、「次へ」ボタンがアクティブにならないのはなぜですか?
計算はするのですが、何のために計算していたのか忘れてしまうのです。
このような "悪いところ "を正しく修正できるユーザーがどれだけいるのだろうか。コードはおおよそのもの(2枚からコピーしたもの)でしたが、コメントはその通りです。
以下は、その修正版です。
また、session_index=1がすでにfalseなのに、なぜsession_index++;なのでしょうか。
ツールごとのセッション数を事前に把握することはできない。そこで、各セッションを番号で問い合わせる。もし、それが本当なら
session_exist=SymbolInfoSessionQuote(symbol,day,session_index,start,finish);その始まりと終わりの時間に興味があるのです。もし、falseが出たら、その番号のセッションはありません。
楽器のセッション数を事前に把握することはできません。そのため、各セッションを番号でお願いしています。もし、それが本当なら
その始まりと終わりの時間を分析します。もし、falseが出たら、その番号のセッションはありません。
A......では、なぜ金曜日は24時、現実は23時にすべてが終わるのでしょうか?