mql5言語の特徴、微妙なニュアンスとテクニック - ページ 128

 
これは私にとって大きな啓示です
// Скрипт показыает, что цены открытия/закрытия не просто не нормализованы, но и разные при схожем значении

#property strict

#include <MT4Orders.mqh>

// Заполнение массива ценами открытия/закрытия
int FillPrices( double &Prices[] )
{
  const int Total = OrdersHistoryTotal();
  
  ArrayResize(Prices, Total << 1);
  
  int Amount = 0;
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      Prices[Amount++] = OrderOpenPrice();
      Prices[Amount++] = OrderClosePrice();
    }

  return(ArrayResize(Prices, Amount));
}

// true - нормализованная разность равна нуля, сама разность - отлична от нуля.
bool IsBadPrices( const double &Price1, const double &Price2 )
{
  return(!NormalizeDouble(Price1 - Price2, 5) && (Price1 != Price2));
}

// Находит цены открытия/закрытия, которые
// с нормализацией равны друг другу,
// без нормализации - не равны.
int CheckPrices( const double &Prices[] )
{
  int Res = 0;
  const int Size = ArraySize(Prices);
  
  for (int i = 0; i < Size - 1; i++)
  {
    const double Price = Prices[i];
    
    for (int j = i + 1; j < Size; j++)
      if (IsBadPrices(Price, Prices[j]))
      {
        Print((string)Price + " - " + (string)Prices[j] + " = " + (string)(Price - Prices[j])); // Распечатываем найденые цены
        
        Res++;
      }
  }
    
  return(Res);
}

void OnStart()
{
  double Prices[];
  
  FillPrices(Prices);
  Print(CheckPrices(Prices)); // Количество "несовпадающих" пар цен.
}


結果

1.95562 - 1.95562 = -2.220446049250313 e-016
1.95562 - 1.95562 = -2.220446049250313 e-016
1.71599 - 1.71599 = -2.220446049250313 e-016
1.71599 - 1.71599 = -2.220446049250313 e-016
1.58028 - 1.58028 = -2.220446049250313 e-016
14.806 - 14.806 = -1.77635683940025 e-015
1.95521 - 1.95521 = -2.220446049250313 e-016
1.95521 - 1.95521 = -2.220446049250313 e-016
8


MT4で同じスクリプトを実行するとさらに落ち込みますが、そこにはもっと大きなストーリーがあります。説明しよう。


ここでは、ポジションが同じ価格でオープンされ、クローズされたことがわかります。しかし、正規化せずに比較すると、両者の価格は同じではありません


ZZY Checked Tester - そこには、そのような悪意はないようです。

 
Ilya Malev:

タイプミスがあったようです。

そこで最小スプレッドは本当なのか? もしそうなら、技術サポートに書いて修正してもらうべき(中程度に)。 そうでなければ、テスターのgrailsの ための豆知識だ。

 
fxsaber:

テスターで確認したところ、そのような悪意はないようです。

リアルティックを除くすべてのテスターモードでは、価格は正規化されません。

// Советник выводит цены, которые не нормализованы

#property strict

// true - нормализованная цена не равна оригинальной
bool IsBadPrice( const double &Price )
{
  return(NormalizeDouble(Price, 5) != Price);
}

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

//const bool Init = EventSetMillisecondTimer(50);
//void OnTimer()
void OnTick()
{
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const string Symb = SymbolName(i, true);
    
    const double PriceBid = SymbolInfoDouble(Symb, SYMBOL_BID);
    const double PriceAsk = SymbolInfoDouble(Symb, SYMBOL_ASK);
    
    if (IsBadPrice(PriceBid))
      Print(TOSTRING(Symb) + TOSTRING(PriceBid) + TOSTRING(NormalizeDouble(PriceBid, 5) - PriceBid));

    if (IsBadPrice(PriceAsk))
      Print(TOSTRING(Symb) + TOSTRING(PriceAsk) + TOSTRING(NormalizeDouble(PriceAsk, 5) - PriceAsk));
  }
}


結果

2019.02.18 23:57:24   Symb = EURUSD PriceBid = 1.13088 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313 e-016 
2019.02.18 23:57:26   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313 e-016 
2019.02.18 23:57:27   Symb = EURUSD PriceBid = 1.13085 NormalizeDouble(PriceBid,5)-PriceBid = -2.220446049250313 e-016 
2019.02.18 23:58:18   Symb = EURUSD PriceAsk = 1.13112 NormalizeDouble(PriceAsk,5)-PriceAsk = -2.220446049250313 e-016 


大げさに言えば、これはテスターのバグです。

 

アカウントにログインしようとしたときに、取引サーバーに接続できなかったとします。

また、例えば、デモ口座の有効期限が切れていて、ログインしようとすると「無効な口座です」と表示される場合。


この障害にもかかわらず、ターミナルに表示されない場合でも、すべての取引履歴を利用できます!

 
fxsaber:

アカウントにログインしようとしたときに、取引サーバーに接続できなかったとします。

また、例えば、デモ口座の有効期限が切れていて、ログインしようとすると「無効な口座です」と表示される場合。


この障害にもかかわらず、ターミナルに表示されない場合でも、すべての取引履歴を利用できます!

では、その履歴はどこに保存されているのでしょうか。

 
Alexey Navoykov:

つまり、最小スプレッドが現実的に存在するのか? もしそうなら、テクニカルサポートに書いて、(中程度に)直してもらうべきです。 そうでなければ、テスターのgrailsのための豆知識です。

バグ、質問 "ブランチでは、すでに何も変更されませんと公式に答えている。正確には、合理的な質問をすべて無視し、「本物のティックでテストしてください」と答えただけで、厳密には否定的な答えだと解釈しています。

不幸な自己欺瞞のための「豆知識」なのです。が、多分誰かが何らかの方法でカンニングするために商業的にそれを使用することができます(すなわち、証券会社 - 人は本当のティックに取得しない場合は、このようにスプレッド規範の誤った印象を作成し、99.9%がそうしないでしょう)。
 
Ilya Malev:

それは他の誰かが何とかごまかすために商業的にそれを使用することができますが(すなわち、証券会社 - 人は本物のダニに取得しない場合は、このようにスプレッド規範の誤った印象を作成し、99.9%はありません)。

理論的には、サーバー上ですべてが同期されるはずです。 ティックにあるものはバーにもあるはずです。 しかし、もちろん、現実にはどうなのかはわかりません。

 
このトピックに関係のないコメントは、「mql4言語の特徴、複雑さ、テクニック」に移動しました。
 

MEには、ALT+Vの組み合わせで、システムクリップボードの以前の値を見ることができます。ブラウザから何かをコピーして、MEがバックグラウンドで作業していたとしても、MEはそれを見て記憶しています。

大雑把に言うと、MEはあなたがコンピュータで行う多くのことを見ているのです。例えば、他のリソースのアカウントや個人アカウントのパスワードをバッファ経由で貼り付けると、現在のMEセッションの履歴に入ります。

 
fxsaber:

MEには、ALT+Vの組み合わせで、システムクリップボードの以前の値を見ることができます。ブラウザから何かをコピーして、MEがバックグラウンドで作業していたとしても、MEはそれを見て記憶しています。

大雑把に言うと、MEはあなたがコンピュータで行う多くのことを見ているのです。例えば、バッファ経由でアカウントのパスワードを貼り付けると、現在のMEセッションの履歴に入ります。

うわー、暗号通貨のパスワードをコピーしちゃった。それが私にとってどれだけ不利なことか。

理由: