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

 
fxsaber

それはいい芸当ですね。コツは、TParentにパターンを適用 することです。こんなの初めてです。

まあ、多重継承ではないんですけどね。実際はBase→A→B→C→Xという連鎖です。十分であれば、直接使うことを誰が妨げるのですか?

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

まあ、多重継承ではないんですけどね。実際はBase→A→B→C→Xという連鎖です。十分であれば、直接使うことを誰が妨げるのですか?

簡潔さ。

 
fxsaber

簡潔さ。

大賛成です。IMHOは、4つの後継クラスを直接処方した方が、短時間で明確な結果を得られると思います。

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

ここは大賛成です。IMHOは、4つの後継クラスを直接処方した方が、短時間で明確な結果を得られると思います。

突然、複数継承が導入された場合でも、たった1行の小さな変更で済みます。

class X : public INHERIT3(A, B, C)  {  };   // Объявляем класс, наследуемый от A, B, C
 
fxsaber

もし、突然多重継承が導入されたとしても、たった一行の小さな置換で済みます。

フォーラムには、投票に加えて、賭け事のフォームがないのが残念です。選択肢のある投票のようなものですが、答えに対してアカウントにいくつかの「小銭」がブロックされます。正しい選択肢を選んだ人は、イベント終了後に敗者復活戦を受けることができる;-)。導入はしないと思います。

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

まあ、多重継承ではないんですけどね。実際はBase→A→B→C→Xという連鎖です。十分であれば、直接使うことを誰が妨げるのですか?

そうですね、でも全体の特徴としては、すべてのソースクラスがテンプレートとして定義され、使用されていることです。したがって、このチェーンはどのような順番でも設定することができます。要するに、多重継承と根本的な違いはないのです。すでに書いたように、クラスには落とし穴がある。インターフェースに関しては、すべて同じです。ただ、少しカサカサしているように見えますが、ここで確認するか運転するかは皆さん自由に判断してください )
 

もうひとつ、付け加えておきたいことがあります。多重継承の完全な代替案として、ghost演算子をオーバーロードすることで(より柔軟な機能を)実装することができる。しかし、MQはなぜかこのオーバーロード機能を追加してくれません。しかも、具体的な回答もなく、無視されるだけです。

 

こんなシチュエーションもあります

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

バグ、バグ、質問

fxsaber さん 2017.07.24 09:27

EAは1641でコンパイルされており、高速な取引履歴が実装されています。

Agent build 1596になると、ヒストリーの動作がVERYスローになり、結果的に最適化が何倍も遅くなることはないのでしょうか?

より一般的なケースとして、クラウド上での最適化は、時間だけでなく計算量でも異なる結果が出ることがあります。最適化の結果が1回の実行で一致しないという声を聞くことがあります。

これは、最適化に関与するAgentと、1回のランに関与するローカルAgentが異なるビルド番号を持つ場合があるためと思われます。

そして、ビルドごとに異なるバグが含まれています。例えば、現在は関連性があるが、数年前のビルドでは存在しなかったバグを紹介します。

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

バグ、バグ、質問

fxsaber さん 2017.07.17 23:08

またしてもテスターでHistorySelectのバグが発生。1626年にはなかったようです。1629年にはあります。

#include <Trade\Trade.mqh>

void OnTick()
{
  static CTrade Trade;

  const datetime NowTime = TimeCurrent();
  
  if (Trade.Buy(1) && Trade.PositionClose(_Symbol) && HistorySelect(NowTime, NowTime))
  {
    Print(HistoryDealsTotal()); // 0 - это при том, что мы открыли и закрыли позицию в NowTime-время
      
    ExpertRemove();
  }
}

従って、最適化中にEAがエージェントb1626にヒットした場合、ある結果を示すかもしれませんが、ローカルエージェントb1641シングルランで実行すると、全く別の結果を示すかもしれません。

このことから、最適化の前に、自分のEAをどのビルドに最適化したいのか、また、どのビルドに最適化しないのかを意識しておく必要があると結論付けられます。

開発者は、不適切なエージェントのためのカッター、INIT_AGENT_NOT_SUITABLEを 提供しています。


したがって、クラウドベースの最適化のために、OnInit でTerminalInfoInteger(TERMINAL_BUILD) と目的の値との マッチングチェックを記述することをお勧めします。

しかし、自分のニーズにマッチしたチェックのリストを知ることはほとんど不可能なので、ほとんどの場合、こう書くでしょう。

int OnInit( void )
{
  // Если Агент не совпадает с билдом компиляции, отказываемся от его услуг
  if (TerminalInfoInteger(TERMINAL_BUILD) != __MQLBUILD__)
    return(INIT_AGENT_NOT_SUITABLE);
//....

しかし、それは悪い解決策でもあります。より柔軟な解決策は、最適化の際にビルド番号をAgentに 渡すことです。


一般に、警戒が必要です。


SZY.各Agentの実行のトレードレポートを作成し、最適化の際にそれを正しく把握することが可能です。これにより、一度の実行でクラウドエージェントの結果がローカルのものと異なる理由をさらに理解することができます。本ライブラリを 使用することで、最適化時やシングルラン時にこのようなレポートを自動生成することが可能です。

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

バグ、バグ、質問

レナート・ファットフーリン さん 2017.07.25 08:26

クラウダでは定期的に古いビルドを切断して更新を待っていますが、これは非常に早く、気づかないうちに終わってしまいます。

これは毎回のバージョンアップではなく、変更の重要性に応じて行われます。
Report
Report
  • 投票: 12
  • 2017.07.19
  • fxsaber
  • www.mql5.com
Библиотека для MetaTrader 4/5, которая позволяет формировать отчеты по истории торгов.
 

デバッグ時(デバッグとは限らないが)、テスターでテスト間隔を早く縮めたいとき、私は以下のような機能を使っている。

// Выгружает эксперт, если количество сделок в истории больше DealsNum.
void ConditionStopExpert( const int DealsNum = INT_MAX )
{
  if ((DealsNum != INT_MAX) && ::HistorySelect(0, ::TimeCurrent()) && ::HistoryDealsTotal() > DealsNum)
    ::ExpertRemove();

  return;  
}

// Выгружает эксперт, если с момента запуска прошло AmountHours-часов.
void ConditionStopExpert( const double AmountHours )
{
  static datetime FirstTime = ::TimeCurrent();
  
  if (::TimeCurrent() > FirstTime + (datetime)(AmountHours * 3600))
    ::ExpertRemove();

  return;  
}
 
fxsaber

デバッグ時(デバッグとは限らないが)、テスターでテスト間隔を早く縮めたいとき、私は以下のような機能を使っている。

最初の関数で、DealsNumの代わりに5番が使われているので、コードを訂正してください。
理由: