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

 
開発者の方へのご注意


https://docs.mql4.com/ru/basis/types/integer


C++規格ではchar 型のサイズのみを保証しています。他のタイプの長さは、実装に依存します。マッチテーブルが正しくなく、未定義の動作になる可能性があります。

Целые типы - Типы данных - Основы языка - Справочник MQL4
Целые типы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Целые типы представлены в языке MQL4 одиннадцатью видами. Некоторые из типов могут использоваться вместе с другими, если этого требует логика программы, но при этом необходимо иметь ввиду правила преобразования типов. В таблице приведены характеристики каждого типа. Кроме того, в...
 
このトピックに関連しないコメントは、「MQL4 MT4 MetaTrader 4初心者からの質問」に移動しました。
 

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

バグ、バグ、質問

fxsaber さん 2018.12.01 11:15

スーパーブレーキデザイン
string Str[];
const int handle = FileOpen(FileName, FILE_READ | FILE_ANSI | FILE_TXT);  

FileReadArray(handle, Str);

100万行の40Mbのファイルを読むのに18秒かかる。


同じ出力結果でも、やり方が違う

  uchar Bytes[];
  const int handle = FileOpen(FileName, FILE_READ | FILE_BIN);
  
  FileReadArray(handle, Bytes);

  string Str[];
  StringSplit(CharArrayToString(Bytes), '\n', Str);

すでに0.5秒で終了しています。


 

16Gb RAMにタスクをオーバーロードしています。Chromeはフリーズしてしまいましたが、MT5で最適化を実行したところ、問題ありませんでした。しかし、もっと面白いのはMT4です。

インジケータは動作していますが、Expert AdvisorはArrayResizeの結果チェックがないため、「範囲外」となって停止しています。

ArrayResizeを常にチェックしたいとは思いませんが、このチェックをしないと、例えばVPSで戦って いるExpert Advisorが 停止することがあることをここで確認しました。


唯一理解できないのは、ArrayResizeが以前に大きなReserveで行われた場合、結果が「範囲外」になってしまうことでしょうか。

 
fxsaber:

16Gb RAMにタスクをオーバーロードしています。Chromeはフリーズしてしまいましたが、MT5で最適化を実行したところ、問題ありませんでした。しかし、もっと面白いのはMT4です。

インジケータは動作していますが、Expert AdvisorはArrayResizeの結果チェックがないため、「範囲外」で停止しています。

ArrayResizeを常にチェックしたいとは思いませんが、このチェックをしないと、例えばVPSで戦って いるExpert Advisorが 停止することがあることをここで確認しました。


ただ一つ理解できないのは、 ArrayResizeが以前大きなReserveで行われた場合、どうして「範囲 外」になったのか、ということです。

簡単です :-) これは、ほとんどの言語/システムで言えることです。

リザーブで仮想メモリを割り当て、物理メモリが足りなくなったときに、空きページが見つからなかったのです。プロセッサの例外が発生し、一連の処理の後、範囲外の処理になった

ちなみに、MTが全くクラッシュしなかったのは、出来栄えの良さを裏付けています :-)

 

歴史の中の秩序整理というテーマでタフなミスを した。閉店時間順の並び替えは、残念ながら、必ずしもそうではありません。

スクリプトを確認する

#property strict

void OnStart()
{
  datetime time = INT_MAX;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      if (OrderCloseTime() > time)
      {
        Print(time);
        OrderPrint();
        
//        break;
      }
      
      time = OrderCloseTime();
    }
}


なぜ、このような初歩的なコードが、セルフテスト用にすぐに書けなかったのか、謎である。

また、オーダーが時間順に並ばないのは、どうしてなのか、という謎もあります。QBでカスタムテスターを使用したので質問させていただきます。そして、論理的には、その順番が歴史に入ったので、先に入ったものよりも後にそこに記録されることになるのです。このロジックをどう揺さぶるかは、まったくもって不明である。

おそらく、注文が異なるMT5サーバーに保存されており、同期の際にこの混乱が発生したのでしょう。MT4サーバーのバグではなく、Terminalのバグであることを祈ります。また、MTでのトレードでこのようなことが起きないようにしてほしいです。

 
fxsaber:

歴史の中の秩序整理というテーマでタフなミスを した。閉店時間順の並び替えは、残念ながら、必ずしもそうではありません。

スクリプトを確認する


なぜ、このような初歩的なコードが、セルフテスト用にすぐに書けなかったのか、謎である。

また、オーダーが時間順に並ばないのは、どうしてなのか、という謎もあります。QBでカスタムテスターを使ったので質問します。そして、論理的には、その順番が歴史に入ったので、先に入ったものよりも後にそこに記録されることになるのです。このロジックをどう揺さぶるかは、まったくもって不明である。

おそらく、注文が異なるMT5サーバーに保存されており、同期の際にこの混乱が発生したのでしょう。MT4サーバーのバグではなく、Terminalのバグであることを祈ります。また、MTでのトレードでこのようなことが起きないようにしてほしいです。

アカウント履歴の並び順を変更してみましたか?

 
Artyom Trishkin:

アカウント履歴の並び順を変更してみましたか?

結果に影響を与えない

 
Artyom Trishkin:

アカウント履歴の並び順を変更してみましたか?

はい、何の影響もないはずです。アカウント履歴タブの注文数 のみ影響します。それを見守っていてほしい。

 
fxsaber:

結果には影響しません。

ポジションの終了 時刻は、サーバーから通知されます。

理由: