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

 
Andrey Khatimlianskii:

インジケータが間違ったパラメータセットで呼び出された

はい、このインジケータにはかなり多くのパラメータがありますが、iCustomがメモリを満たすようにする方法はありますか?メモリを埋めるのに約2時間かかるので、空のiCustomをテストし、パラメータを1つずつ追加していくと時間がかかるでしょう。何かアドバイスはありますか?
P.S. 私もすべてのパラメーターをビジュアルで確認することにします。

 
Nauris Zukas:

確かにインジケータにはかなりの数のパラメータがありますが、iCustomがメモリを正確に埋めるようにする方法はないでしょうか?

過去ログにインジケータが大量に作成されることになる
 
TheXpert:
過去ログには様々なインジケーターが表示されます

そうですね、私もストラテジーテスターで、テスト後にたくさんのインジケーターが表示されるのを見たことがあるので、言いたいことはわかります。しかし、こちらのストラテジーテスターではすべて問題なく動作します。そして、すべてログに正しく表示されます。

 
Nauris Zukas:

はい、このインジケータにはかなり多くのパラメータがありますが、iCustomがメモリを満たすようにする方法はありますか?メモリを埋めるのに約2時間かかるので、空のiCustomをテストし、パラメータを1つずつ追加していくと時間がかかるでしょう。何かアドバイスはありますか?
P.S. 私もすべてのパラメーターをビジュアルで確認することにします。

パラメータを付けずに呼び出す(そうすれば、デフォルトが使われる)、そして観察する。漏れがなくなれば、それが問題なのです。

 
Nauris Zukas:

EAは少しずつ溜まっていくメモリを食いつぶす。

少し」とはどの程度ですか?

もしかしたら本当に少しで、これが発売以降に登場した引用履歴なのでしょうか?

 
Andrey Khatimlianskii:

"少しずつ "とは、どのくらい?

もしかしたら本当にほんの少しで、スタート時から登場している引用履歴なのかも?

複数のEAでMT4を起動し、メモリロギングを有効にしています。矢印が示す場所で、「EX4ファイルのメモリが不足しています」とクラッシュしています。


 
Andrey Khatimlianskii:

パラメータを付けずに呼び出す(そうすれば、デフォルトが使われる)、そして観察する。漏れがなくなれば、それが問題なのです。

よし、この方法でやってみよう。

 
Nauris Zukas:

複数のEAでMT4を起動し、メモリの記録を有効にします。矢印が示す場所で、「EX4ファイルのメモリが不足しています」とクラッシュしています。

どれくらいの割合で4割が使われているのでしょうか?

直線的に成長する、湾曲したインジケーターの呼び出しの ように見える、そうです。

 
Andrey Khatimlianskii:

4割はどの程度使われているのか?

直線的に成長する、カーブインジケーターの呼び出しの ように見える、そうです。

パラメータに問題があるようです。ありがとうございました。

 

MT4ではこのような状況が起こり得ます(理由については割愛します)。

  • ポジションが空いて います。残りはNに等しい。
  • ある瞬間からポジションが消える。エクイティとバランスはNに等しい。取引履歴では、ポジションに関する情報はありません。
  • 端末のリセットは効きません。
  • 数時間後、取引履歴にポジションが表示される(特定の条件で決済された)。これにともない、残高および資本は調整されます。

これは、さまざまな状況が重なったために起こる、非常に稀な事態です。しかし、確率はほぼゼロでも、発生することはある。

私は、すべての戦闘ロボットに、このような状況を識別するメカニズムを持たせることを提案します。

そのためには、未決済注文のチケットを記憶しておき、それが消えた場合に取引履歴でその存在を確認する必要がある。取引履歴にない場合は、Alertim!


そのような保護の機能。

#define  TICKET_TYPE int

// Получаем все текущие тикеты.
int GetTickets( TICKET_TYPE &Tickets[] )
{
  int Amount = ArraySize(Tickets);
    
  for (int i = ArrayResize(Tickets, Amount + OrdersTotal()) - Amount - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      Tickets[Amount++] = OrderTicket();
          
  return(ArrayResize(Tickets, Amount));
}

// Проверяет наличие потерянных тикетов.
int CheckTickets( void )
{
  static const bool IsTester = MQLInfoInteger(MQL_TESTER);
  int Amount = 0;
  
  if (!IsTester)
  {
    static TICKET_TYPE Tickets[];
    TICKET_TYPE BadTickets[];
    
    for (int i = ArrayResize(BadTickets, ArraySize(Tickets)) - 1; i >= 0; i--)
      if (!OrderSelect(Tickets[i], SELECT_BY_TICKET))
      {
        BadTickets[Amount++] = Tickets[i];
        
        Alert("Ticket " + (string)Tickets[i] + " is not found!");
      }
        
    ArrayResize(BadTickets, Amount);    
  
  #ifdef __MQL5__
    ArraySwap(Tickets, BadTickets);
  #else // __MQL5__
    ArrayFree(Tickets);
    
    ArrayCopy(Tickets, BadTickets);  
  #endif // __MQL5__
      
    GetTickets(Tickets);
  }
      
  return(Amount);
}
OnTickの先頭でCheckTickets()を呼び出す。
理由: