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

 
バグでしょうか?
struct STRUCT
{
  int a;
  
  STRUCT() {} // Если закомментировать, ошибка пропадает
};

void OnStart()
{
  STRUCT Struct = {1}; // cannot be initialized with initializer list
}
 

スタイラスを 使用する際のバグ?

タブを使用して書いていたとします。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
   input int x=0;
   #define  TWO_DIM (10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+

エラーはない。

で、スタイラスを使用すると、次のようになります。

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int x=0;
#define  TWO_DIM(10000)
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double      massive[][TWO_DIM];
  }
//+------------------------------------------------------------------+
'10000' - unexpected in macro formal parameter list     bug.mq5 7       17
'[' - invalid index value       bug.mq5 13      25

すなわち、スタイラスはTWO_DIM(10000) の間のスペースを消去します。

 
コンパイルエラー
template <typename T>
struct STRUCT
{
  template <typename T1>  
  STRUCT( T1 Value ) {} // 'STRUCT<int><int>' - declaration without type

};

void OnStart()
{
  STRUCT<int> Struct(0); // 'STRUCT<int>' - cannot to apply function template
}
 
ちょっとだけ脱帽。代入演算 子のバイパス
template <typename T>
struct STRUCT_COPY
{
  T Value;
  
  STRUCT_COPY( const T& tValue)
  {
    this = (STRUCT_COPY)tValue;
  }  
};

struct STRUCT
{
  int i;
  
  void operator =( const STRUCT& )
  {
    this.i = 5;
  }
};

#define  PRINT(A) ::Print(#A + " = " + (string)(A));

void OnStart()
{
  STRUCT Struct;  
  Struct.i = 1;  
  PRINT(Struct.i);
  
  STRUCT StructCopy1 = Struct;
  PRINT(StructCopy1.i);
  
  // Обходим void STRUCT::operator=(const STRUCT&)
  STRUCT_COPY<STRUCT> StructCopy2(Struct);
  PRINT(StructCopy2.Value.i);  
}

結果

Struct.i = 1
StructCopy1.i = 5
StructCopy2.Value.i = 1
 

正しい方法とは?

struct STRUCT
{
  template <typename T>
  void operator []( int ) {}
};

void OnStart()
{
  STRUCT Struct;
  
  Struct.operator[]<int>(0); // Нормально
  Struct[0]<int>;            // Ошибка
}
 
MT5では、CopyClose バッファの最初のコピー時間は、以下のものに依存すると理解しています。

1.以前はティッカーのクォートを全く受信せず、チャートも開かなかった場合など。(Ping、インターネット速度、ハードディスク、Bases/Broker/history/ticker/cache/ファイルの準備に依存します。)

2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 0  время= 8355581
2017.04.11 11:27:38.828 время копирования буфера (EURUSD,M1)    проход = 1  время= 1083

2. 相場が以前に受信され、その後ターミナルが再ロードされた場合、このティッカーのチャートが開かれていないことを条件とします(Bases/Broker/History/Ticker/Cache/ファイルの準備)。

2017.04.11 11:29:14.672 время копирования буфера (EURUSD,M1)    проход = 0  время= 599396
2017.04.11 11:29:14.734 время копирования буфера (EURUSD,M1)    проход = 1  время= 259
/////////////////////////////
2017.04.12 19:32:46.489 время копирования буфера (FULT,M5)      проход = 0  время= 98167
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 1  время= 155
2017.04.12 19:32:46.557 время копирования буфера (FULT,M5)      проход = 2  время= 14

の時間はp.1より10-15倍短くなります。


の比較のため、ポイント2によるМТ4でのアクセス時間、すなわち端末リセット後

2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 2  время= 276
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 1  время= 434
2017.04.12 19:30:38.831 время копирования буфера EURUSD,M1: проход = 0  время= 2260
2017.04.12 19:30:38.816 время копирования буфера EURUSD,M1: initialized
2017.04.12 19:30:38.666 время копирования буфера EURUSD,M1 inputs: Pair=USDCAD;

すなわち、MT4ターミナル再起動後の時間は数桁少なくなります。

今回はSSDを使わず、Windowsで全て確認しました

引用元:端末が再起動されず、データにアクセスしたところ

2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 0  время= 89
2017.04.11 11:35:30.648 время копирования буфера (EURUSD,M1)    проход = 1  время= 42

キャッシュをロードした後、端末がそれ以上の要求(2回目の要求から)に対して必要とする時間がかなり短くなるというのは正しい理解でしょうか?

ターミナル再起動後の初回呼び出しの時間を何とか短縮して、MT4と同じようにできないでしょうか?

コードは https://www.mql5.com/ru/forum/1111/page1870#comment_4856899 にありました。

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум алго-трейдеров MQL5
 
kaus_bonus:
MT5では、同じCopyCloseバッファの最初のコピー時間が依存することを理解しています。

環境と再生方法の記述が全く無いので、非常に汚いテスト方法になっていますね。

特になし。

  • ウィンドウ内のバーの制限
  • 端末データベースの実データ量
  • すべてのデータがディスク上にあることが保証されている必要があります。
  • テストするプラットフォームとビットレート(Wine環境?)
  • かいほうそう

これなくしては、結論に根拠がない。


例えばEURUSDのM1を見て ください。MT5には600万本以上のバーがありますが(チャートで無制限モードの場合)、MT4にはいくつあるのでしょうか?実際のデータベースには、数万本のM1バーがあるのですか?
 
Renat Fatkhullin:

環境と再生方法の記述が全くないので、非常に雑なテスト方法になっていますね。

特になし。

  • ウィンドウのバーの制限

  • 端末データベースの実データ量
  • サーバーとは何なのか、ベースはディスクなのか、すべてのデータがディスク上にあることが保証されていなければならない。
  • テストするプラットフォームとビットレート(Wine環境?)
  • オープンウィンドウの可用性

それがなければ、結論に根拠がない。


私の投稿でほとんど質問されましたが、問題ありません、今すぐすべてのデータをお渡しします。

の答えがまず一つ。

какой точно сервер, находятся ли базы на диске? все данные обязаны быть гарантированно на диске.

MQ-demoサーバーでは、前回の記事のポイント2、ポイント3のように、データを読み込んでいます。ポイント1については、すべてが明確であり、質問はありません。

лимиты баров в окне

エムティーフォー

MT5

фактические объемы данных в базах терминалов

エムティーフォー

MT5

платформа и битность тестирования (под вайном? нужно указывать детально)

win XP 32bit、MTの全ビルド最新版。

наличие открытых окон

MT4 - 1つのチャートを開き、別のシンボルで確認します。

MT5 - 1つのチャートを開き、別のシンボルで確認します。

ターミナルをリロードし、チャートにスクリプトを送信し、ターミナルをリロードする前に読み込まれた他のシンボルを選択することを繰り返してください。

エムティーフォー

2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 2  время= 36
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 1  время= 282
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: проход = 0  время= 1871
2017.04.12 21:18:31.575 время копирования буфера EURUSD,M1: initialized
2017.04.12 21:18:31.405 время копирования буфера EURUSD,M1 inputs: Pair=GBPUSD; 

MT5

2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 0  время= 303951
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 1  время= 29
2017.04.12 21:19:47.735 время копирования буфера (EURUSD,H1)    проход = 2  время= 25
 

ここでは、より詳細に、より精度を上げてテストしています。

条件説明
MetaTrader 4 ビルド 1065
MetaTrader 5 x64 build 1580
ハードウェアとオペレーションシステム
Windows 10 Pro x64、Intel Xeon E5-2690 v3 @ 2.60GHz、RAM: 32Gb、SSDディスク
トレードサーバー
MetaQuotes-デモ
MetaQuotes-デモ
設定でチャートにバーを制限する
10 000
10 000
履歴の設定にバーを制限する 10 000 000
制限なし
EURUSDの実際のバー数(M1)
3.382百万円
6,538百万円
検証済みシンボルとピリオド
EURUSD, M1
EURUSD, M1
オープンチャート
GBPUSD、M1のみ、スクリプトも投げています。
GBPUSD, M1のみ、同じスクリプトを投げています。
結果は端末起動後のコールド状態
#0 pass, 1000 records in 680 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

#0 pass, 1000 records in 113497 msc
#1 pass, 1000 records in 3 msc
#2 pass, 1000 records in 3 msc

結果はウォームアップ、1本目の直後に2本目を実行
#0 pass, 1000 records in 13 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc
#0 pass, 1000 records in 14 msc
#1 pass, 1000 records in 2 msc
#2 pass, 1000 records in 2 msc

テストファイルを添付します。時間はすべてマイクロ秒(ミリ秒ではありません、1ミリ秒=1000マイクロ秒)です。

さて、結論です。

  1. 唯一の違いは、チャートキャッシュの初期化速度で、MT4が0.6msであるのに対し、MT5は113msです

    ここでは問題ありません。リフティングには常にリソースが必要です。
    特に、概念的に異なるアーキテクチャを使用する場合:MT5は、スケーリングのために、より複雑なキャッシュ(cache*.hcファイルがオリジナルの*.hccから構築される)+サーバーデータ(バイナリ*.hccチャンク)との完全同期制御を必須とします。

  2. 繰り返しリクエストしても、1回のデータコピーで2〜3マイクロ秒と同じ速度が出ます。

    どちらの端末の実装でも失敗はなく、すべてが高速に動作しています。
ファイル:
 

ご返信ありがとうございました。

全体としては、私の投稿で示したような結果になっています。

普通のやつでテストしてきました。

それなのに、MT4とMT5の結果は200倍近く違う(原因は -サーバーデータとの完全な同期を制御しなければならない?).

ここに書き込む前になんとなく端末の機能なんだろうなと慣れてしまったんです。生活もできるのですが、難しいところもあります。例えば、MTにはマーケットスクリーナーがないので、マーケットウォッチにシンボルを追加する小さなスクリプトを書きましたが、価格はCopyCloseを介してのみ利用可能で、シンボルがウォッチに追加されるまでSymbolInfoDoubleやMqlTickを介しては利用できないので、非常に大きなステークで実行すると このスクリプトは「無限に」長く動作します。これはあくまで一例です。