class CStrategy : public CObject { protected: ulong m_magic; // マジック string m_symbol; // シンボル(取引商品) ENUM_TIMEFRAMES m_timeframe; // チャートの期間(タイムフレーム) double m_fixedLot; // オープンポジションのサイズ(固定) public: // コンストラクタ CStrategy(ulong p_magic, string p_symbol, ENUM_TIMEFRAMES p_timeframe, double p_fixedLot); virtual int Init() = 0; // 戦略の初期化 - OnInitイベント処理 virtual void Tick() = 0; // メインメソッド - OnTickイベント処理 };
コンストラクタがあるのに、なぜInitメソッドが必要なのか?
なぜか、彼らはすぐにTSクラスを1つのシンボルと時間枠に限定した。
その方が論理的だと思うのだが。
class SYSTEM { public: virtual void OnTick() {} };
私は著者のアプローチが気に入った。記事の中にそのような一節がある:
そうすると、私が理解する限り、このクラスは抽象的な ものになります。
そうなります。なぜか子孫で使われる。Deinitをしない(デストラクタがある)のであれば、Initをしない(コンストラクタがある)のは論理的です。
//+------------------------------------------------------------------+ //| コンストラクタ| //+------------------------------------------------------------------+ CSimpleVolumeStrategy::CSimpleVolumeStrategy( ulong p_magic, string p_symbol, ENUM_TIMEFRAMES p_timeframe, double p_fixedLot, int p_signalPeriod, double p_signalDeviation, double p_signaAddlDeviation, int p_openDistance, double p_stopLevel, double p_takeLevel, int p_ordersExpiration, int p_maxCountOfOrders) : // 初期化リスト CStrategy(p_magic, p_symbol, p_timeframe, p_fixedLot), // 基本クラスのコンストラクタを呼び出す signalPeriod_(p_signalPeriod), signalDeviation_(p_signalDeviation), signaAddlDeviation_(p_signaAddlDeviation), openDistance_(p_openDistance), stopLevel_(p_stopLevel), takeLevel_(p_takeLevel), ordersExpiration_(p_ordersExpiration), maxCountOfOrders_(p_maxCountOfOrders) {} //+------------------------------------------------------------------+ //| エキスパート初期化関数 //+------------------------------------------------------------------+ int CSimpleVolumeStrategy::Init() { // ティックボリュームを取得するためにインジケータをロードする。 iVolumesHandle = iVolumes(m_symbol, m_timeframe, VOLUME_TICK); // ティック・ボリュームのアレイ・レシーバーのサイズと必要なアドレッシングを設定する。 ArrayResize(volumes, signalPeriod_); ArraySetAsSeries(volumes, true); // 取引で注文を出すためのマジックナンバーを設定する trade.SetExpertMagicNumber(m_magic); return(INIT_SUCCEEDED); }
そして、可能なTCを人為的に強く絞り込むことは、奇妙な解決策である。
また、OOPのせいで入力が面倒なのもよくわかる。これを取り除くのは良いことだ。
Init()は、コンストラクタから結果を返すことが不可能であるため、今のところ省かれている。しかし、ストラテジーの初期化の結果としてINIT_SUCCESS以外のものを返す必要がなくなる可能性もあります。そのため、将来的にこのメソッドが削除される可能性は十分にある。
シンボルと時間枠という形で必須のストラテジープロパティを割り当てるのは、意図的な制限です。設計上、複数のシンボルでの取引は、このクラスを継承する多くのインスタンスの働きによって行われますが、特定のインスタンスはそれぞれ単一のシンボルで動作します。このような制限によって妨げられるようなストラテジーにはまだ出会っていない。それどころか、これらのパラメーターは検討したすべての戦略で見つかったので、一度に基本クラスに入れることにしたのである。
しかし将来的には、(もしあれば)独立した単一シンボル戦略に分割できないような複数シンボル戦略も検討するつもりだ。基本クラスにシンボルと時間枠のプロパティがあっても、複数のシンボルと複数の時間枠を使う子クラスの実装に大きな支障はないと思います。
100%邪魔にはなりません。不要な存在でしかない。OOPはアーキテクチャ上、一般的なものから特殊なものへという原則に従っている。あなたは一般的なもの(基本クラス)を "private "にした。そこで呼ばれるのはCStrategy::Tick()だけだが。
このように呼び出されたとき、このメソッドのシグネチャに悪態をつかないのはコンパイラのバグのようだ。
expert.AddStrategy(new CSimpleVolumeStrategy( magic_ + 1, "EURGBP", PERIOD_H1, NormalizeDouble(0.34 * depoPart_, 2), 130, 0.9, 1.4, 231, 3750, 50, 600, 3)
このようにすべきです。
CAdvisor::AddStrategy(CStrategy* strategy)
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事「多通貨エキスパートアドバイザーの開発(第1回):複数取引戦略の連携」はパブリッシュされました:
取引戦略にはさまざまなものがあります。リスクを分散し、取引結果の安定性を高めるためには、複数の戦略を並行して適用することが有効かもしれません。ただし、それぞれのストラテジーが個別のエキスパートアドバイザー(EA)として実装されている場合、1つの取引口座でそれらの作業を管理することは非常に難しくなります。この問題を解決するのに合理的なのは、1つのEAで異なる取引戦略の運用を実装することです。
何が欲しいのか、何を持っているのかを決める必要があります。
私たちは次を持っています(あるいは、ほとんど持っています)。
私たちは次を望んでいます。
オブジェクト指向のアプローチ、MQL5とMetaTrader 5の標準テスターを使用します。
目の前の課題はかなり大きいので、ステップごとに解決していきます。
作者: Yuriy Bykov