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

 

バグを弾く

  1. Metaquotes-Demoへ移動します。
  2. AUDJPYのみマーケットオーバービューに表示され、そのチャートを開いてください。
  3. ターミナルをリロードして、本格的な接続を待つ - 見積もりが来ています。
  4. チャート上でスクリプトを実行する

void OnStart()
{  
  for (int i = 0; i < 5; i++)
    Print(SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE));
}


結果は以下の通りです。

2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0
2017.10.05 09:02:27.460 Test6 (AUDJPY,M1)       0.0


再スタート

2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851
2017.10.05 09:02:32.028 Test6 (AUDJPY,M1)       0.8868393047179851


すなわち、SYMBOL_TRADE_TICK_VALUEは、Sleep()が使用されていない場合、最初の実行でゼロを返します。


HI 「Market Watch」の「見えない記号」を題材に。スクリプトの開始前にUSDJPYのチャートを開こうとすると(Enterキーを押して「USDJPY」と入力)、うまくいきません。スクリプトを実行した後、それが動作する場合。Market Watchは変わっていないのですが。

 
fxsaber:

バグを弾く

  1. Metaquotes-Demoへ移動します。
  2. AUDJPYのみマーケットオーバービューに表示され、そのチャートを開いてください。
  3. ターミナルをリロードして、本格的な接続を待つ - 見積もりが来ています。
  4. チャート上でスクリプトを実行する


結果は以下の通りです。


再スタート


すなわち、SYMBOL_TRADE_TICK_VALUEは、Sleep()が使用されていない場合、最初の実行でゼロを返します。


HI 「Market Watch」の「見えない記号」を題材に。スクリプトの開始前にUSDJPYのチャートを開こうとすると(Enterキーを押して「USDJPY」と入力)、うまくいきません。スクリプトを実行した後、それが動作する場合。Market Watchは変わっていませんが。

このループをスクリプトの先頭に追加します。

   for(int i = 0; i < SymbolsTotal(true); i++)
     Print(SymbolName(i, true));

そして、シンボルがいくつ印刷されるかを見てください。

最初の実行で、AUDJPYにアクセスすると、マーケット概要にAUDUSDとUSDJPYを追加するだけで、これらのペアを介して2回目の呼び出しでシンボルプロパティを取得します。私の場合、これがOrderCalcMarginの問題を引き起こしているのです。

 
fxsaber:

何度も書かれていることです。なぜか修正しないんですよね。

サービスデスクから回答があった。直してくれる。
 

みなさん、こんにちは。

初心者のためのヘルプをお願いします。

価格の最大値を求める関数が実行されます。ある最大価格のBAR NUMBERを計算し、コードに戻すにはどうしたらよいですか?

 
Alexey Viktorov:

スクリプトの冒頭に以下のようなループを追加します。

そして、何文字印刷されるかを確認します。

最初の実行で、AUDJPYにアクセスすると、マーケット概要にAUDUSDとUSDJPYを追加するだけで、これらのペアを介して2回目の呼び出しでシンボルプロパティを取得します。私の場合、これがOrderCalcMarginの問題を引き起こしているのです。

どうすればいいのか、うまくいくと思うんです。

アナトリ・カザルスキー
サービスデスクから回答がありました。直してくれるそうです。

ありがとうございます。

 

OrderCalcMargin() の不具合「周辺」について、SRに申請しました。

 
Kirill Belousov:

MQL4/5のヘルプに直接的な矛盾が ある場合は、確信が持てません。

...パラメータは関数内で逆順に渡さ れることを覚えておいてください 。つまり、最後のパラメータが最初に計算されて渡され、次に最後から2番目のパラメータ が渡される、というようになります。開始括弧の後に最初に来るパラメータが順番に計算されて渡される。


.
..式x1,..., xnの順序は 保証 されていることに注意

ここにある矛盾は何でしょうか?後ろ向きで、それだけです。逆はありません。
 
Alexey Navoykov:
何が矛盾しているのか?後ろ向きで、それだけです。反対語はありません。

- この2つの提言は、ヘルプの中で別々のセクションに書かれています。

の下を読むと

"引数x1, x2,..., xnを持つ関数を呼び出す"

x1,...,xnという式の順番が保証 されていますが、どの順番を考えているのでしょうか?

x1,...,xnという順番か、xn,...,x1という順番か?

 
Kirill Belousov:

- この2つの提言は、ヘルプの中で別々のセクションに書かれています。

の下を読むと

"引数x1, x2,..., xnを持つ関数を呼び出す"

x1,...,xnという式の順番が保証 されていますが、どの順番を考えているのでしょうか?

x1,...,xnという順番か、xn,...,x1という順番か?

たしかに、紛らわしいですね。

しかし、アルゴリズムの論理を特定の順番で並べる のは、どう考えても悪手だと思います。このような右から左への計算が、コードの理解を混乱させるのであれば、なおさらである。そのため、もし適用するのであれば、プリントアウトのような重要でない一部の場所にのみ行う必要があります。

 
Kirill Belousov:

Print()内の式の計算順序は、右から左の順です。なんとなく...じゃあね...また、事前に確認しました :)

MQL5 Reference●言語の 基本操作と式 ●その他の操作

引数x1, x2,..., xnを持つ関数呼び出し。

なお、式x1,..., xnの 順序は保証 されている。

C++のキーワードであるinlineの有用性を改めて示しています(ここでは、inlineはもう古いという意見もあったようです)。
中でもインラインとは、実際にはプログラマが関数のパラメータの計算順序を拒否し、コンパイラがインライン関数をインラインにすると決めた場合、コンパイラはより効率的な計算順序として順方向の計算順序を使用することができます(逆方向の計算順序は呼び出し可能な関数にのみ効率的であることは明らかです)。
同時に、コンパイラがインラインでない関数を埋め込むことを決定した場合、たとえそれが効率の低下につながるとしても、(プログラマが関数のインライン化を宣言せずにこの順序を仮定したため)評価の(一般的な)逆の順序を使用する必要があります。

インラインは、計算順序を明示的に制御できないMQLでも適切です。

理由: