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

 
Комбинатор:

一般的には10進数型が便利でしょう、重宝します。

そう、価格と連動するソフトウェアにその存在がないことは、MTが誕生した当初から、控えめに言っても混乱を招いていたのだ。

PS.OOP言語が存在する今、MQは希望する人が自分でクラスを書けばいいと考えているのだろう。ただ、その後に単純な構造 体に入れることはできません。ulongのような単純なものにシリアライズ/デシリアライズする必要があります。
 
Slava:

こんなに詳しく答えていただいて、本当に感謝しています。正規化は取引要求の 生成に使用されます。

// Point = 0.001, Digits = 3
OrderSend(8274 * Point);
OrderSend(NormalizeDouble(8274 * Point, Digits));

この例では、これら2つのOrderSendで異なる価格が送信されているように見えるでしょう。

整数に Point を掛けると、追加の正規化は必要ないとされてきた(例えば SL と TP はそのように設定されている)。

では、2行のうちどちらがエラーになるのでしょうか?

 
Stanislav Korotky:

そう、価格と連動するソフトウェアにその存在がないことは、控えめに言ってもMTの誕生当初から恥ずべきことだったのだ。

誰もSDに書き込まないということはありえません
 
fxsaber:

こんなに詳しく答えていただいて、本当に感謝しています。正規化は取引要求の 生成に使用されます。

この例では、これら2つのOrderSendで異なる価格が送信されているように見えるでしょう。

整数に Point を掛けると、追加の正規化は必要ないとされてきた(例えば SL と TP はそのように設定されている)。

では、2つの行のうち、どちらがエラーを起こすのでしょうか?

クール

#include <MT4Orders.mqh>

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);  
   
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
  
  Print((double)DoubleToString(Num, 3) == Num);     // true - без нормализации все замечательно
  Print((double)DoubleToString(Norm, 3) == Norm);   // false - а после нормализации полный облом!
  
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Num, 0, 0, 0);
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Norm, 0, 0, 0);
}

結果

script Test (EURUSD,M1) loaded successfully
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260308 buy limit 1.00 / 1.00 USDSEK at market done in 98.718 ms
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260309 buy limit 1.00 / 1.00 USDSEK at market done in 120.328 ms
script Test (EURUSD,M1) removed

価格が異なる両クエリですが、同じ価格であれば問題なく実行されました。どうしてですか?

 
fxsaber:

クール

結果

価格が異なる両クエリだが、同価格で問題なく実行された。なぜ、こんなことが?

簡単に言うと、doubleは仮数52ビット、小数点以下15桁を記憶しているので、doubleから見ると、これらの数値は同一である。後続のビットのプラスマイナスの差はカウントされません。ここでは、フブラに関する 記事を紹介します。

 
Stanislav Korotky:

ごく簡単に言うと、doubleは仮数52ビット、つまり小数点以下15桁を記憶しているので、doubleから見ればこれらの数値は同じである。それ以降の桁のプラスマイナスの差はカウントしない。ここでは、フブラに関する 記事を紹介します。

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}
 

fxsaber, 2017.07.19 13:00

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}

И?

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2017.07.17 21:49

一回の実行中に「停止」をクリックすると、OnDeinitとデストラクタが呼び出されない。

これは欠陥なのかバグなのか?

現在、「停止」ボタンを押すと、Agentとの接続がハード的に切断されます。1回の実行完了を待たないとレポートが見られないほどのハードさ。

MT4では、常に未完成の単一取引の取引履歴を見ることができます。しかし、MT5では方法がない。

接続を強制終了するのではなく、Agentにフラグを送信し、それをキャッチしてOnDeinitを実行することは可能でしょうか?

 
Stanislav Korotky:

И?

スタニスラフ・コロツキー

簡単に言うと、doubleは仮数52ビット、小数点以下15桁 を記憶しているので、doubleから見れば、これらの数値は同じである。後続のビットのプラスマイナスの差はカウント されません。ここでは、フブラに関する 記事を紹介します。

その差は1e-15より大きい。さらに、Num !=Normである。同じ数字ではなく、違う数字です。
 
Stanislav Korotky:

И?

実際、私もそう思います。リテラルを設定した場合、その二重表現はリテラルの桁数で正規化されるのが論理的でしょう