記事"クロスプラットフォームEA: CExpertAdvisor と CExpertAdvisors クラス"についてのディスカッション - ページ 2

 


52959000 undeleted objects left

6619875 objects of type CExpertAdvisor left

6619875 objects of type CAccountInfo left

6619875 objects of type CSymbolManager left

6619875 objects of type COrderManager left

13239750 objects of type COrders left

6619875 objects of type CTradeManager left

6619875 objects of type CCandleManager left

1689399848 bytes of leaked memory


これらのエラーを修正するにはどうすればよいですか?プログラムはあなたのサンプルに基づいて設計されています。

OnDeinit()関数では、experts.OnDeinit()しかありません。

OnInit()ではexperts.OnTick()のみです;

シグナル関数では、サンプルと同じようにカスタムインジケータオブジェクトを作成しています。

 
mbjen:


52959000 undeleted objects left

6619875 objects of type CExpertAdvisor left

6619875 objects of type CAccountInfo left

6619875 objects of type CSymbolManager left

6619875 objects of type COrderManager left

13239750 objects of type COrders left

6619875 objects of type CTradeManager left

6619875 objects of type CCandleManager left

1689399848 bytes of leaked memory


これらのエラーを修正するにはどうすればよいですか?プログラムはあなたのサンプルに基づいて設計されています。

OnDeinit()関数では、experts.OnDeinit()しかありません。

OnInit()ではexperts.OnTick()のみです;

そしてシグナル関数では、あなたのサンプルと同じようにカスタムインジケーターオブジェクトを作成しているだけです。


大丈夫です。

 

もし差し支えなければ、もう一つ可能性のあるバグを報告させてください。

未決済注文の数が返ってこないのです。調べ 始めたところ、この問題はOrdersBaseとソートモードに関係していることがわかりました。

以下のコードを追加しなければならなかった:

COrder *COrdersBase::NewOrder(const ulong ticket,const string symbol,const int magic,const ENUM_ORDER_TYPE type,const double volume,const double price)
  {
   COrder *order=new COrder(ticket,symbol,type,volume,price);
   if(CheckPointer(order)==POINTER_DYNAMIC)
     {
      order.SetContainer(GetPointer(this));
      if(SortMode()==-1)
         Sort(0);
      if(InsertSort(GetPointer(order)))
        {
         order.Magic(magic);
         if(type==ORDER_TYPE_BUY || type==ORDER_TYPE_SELL)
            order.Init(GetPointer(this),m_stops);
         else order.Initialized(false);
         return order;
        }
     }
   return NULL;
  }


なぜ適切なソートモードで初期化されないのか、あるいは追加で初期化しなければならないのか...見当もつきません。

 
mbjen:

もし差し支えなければ、もう一つ可能性のあるバグを報告させてください。

未決済注文の数が返ってこないのです。調べ始めたところ、問題はOrdersBaseとソートモードに関連していることがわかりました。

以下のコードを追加しなければならなかった:


なぜ適切なソートモードで初期化されないのか、あるいは追加で初期化しなければならないのか、理由はわかりません。

COrdersBaseのコンストラクタには次のようなコードがあります:

COrdersBase::COrdersBase(void)
  {
   if(!IsSorted())
      Sort();
  }

はじめに、内部のオブジェクト配列がまだソートされていない場合、それをソートします。

NewOrder()を使用せずに他の項目が追加されると、ソートされなくなる可能性があります(例えばAdd())。

あなたのような問題は再現できません。私の結果は、テスト全体を通して常にソートされています。テストの中で、配列が最初にソートされなくなった時点を探してみてください。それが問題の原因を突き止める手がかりになるかもしれません。

 

こんにちは、

また問題に直面したら連絡します。

もう一つ質問があります。シグナルモジュールを呼び出している現在のエキスパートのインスタンスを取得する方法を教えてください。

以前の注文結果をチェックする関数を 持つシグナルクラスがあるとします。複数のエキスパート・インスタンスがあります。では、シグナルチェック関数を呼び出している現在のエキスパート注文を取得するにはどうすればいいのでしょうか?

あるいは、別の適切な解決策があるかもしれません。そのためのアイデアやコードを教えてください。

私の目標は、以前の注文/ポジションの結果に応じて異なる動作をするシグナルを作成することです。

 

その方法はたくさんあり、プログラマーによって異なるかもしれない。デフォルトでは、エキスパート・インスタンスは互いに独立して動作する。インスタンスが同じ情報を共有できるように実装してもよい。

各エキスパートがオープンした取引を区別したい場合は、各インスタンスに一意のマジックナンバーを割り当てることから始めるとよいでしょう。コードをお見せいただけない限り、これ以上のお手伝いはできません。

 

エンリコ、

私のコードは完全にあなたの最後の例に基づいています。

私はただ一つのグローバル定義CExpertAdvisors expertsを持っています;

OnInit()では、money/stops/signalモジュールを初期化し、次に各エキスパートのインスタンスにそれらを追加します。

OnTick()では、experts.OnTick()のみを持っています。

そして、Calculate()、LongCondition()、ShortCondition()などのカスタム・シグナル・クラスを持っています。このシグナルはエキスパートのインスタンスごとに追加されます。

シグナルのロジックは、各エキスパート・インスタンスの最後の注文/ポジション結果に依存するようにしたい。マジック・ナンバーとは関係ありません(私のエキスパート・インスタンスはすべて異なるマジックを持っています)。Calculate()、LongCondition()、ShortCondition()と呼ばれるシグナル関数には、エキスパート・インスタンスを特定し、次にその注文を見つけるのに役立つマジックやその他の詳細はありません。

コードとしては、このようにCalculate()関数とします:

bool SignalClass::Calculate()

{ //--- some code to find out if the expert last order was profitable or not return true;

}

ご理解いただけたでしょうか。ライブラリのコードを変更せずに、これを実装する方法はありますか?

 

こんにちは、エンリコ、

どのエキスパート・インスタンスがシグナルチェック関数を呼び出して いるのかを特定する方法を探しています。どうすればいいでしょうか?何かヒントがあれば教えてください。

 

もう一つの質問です。マルチペアトレードのエキスパートを持ちたい場合、どのように初期化するのでしょうか?CExpertAdvisorBase::Init() でシンボル名を指定しなければなりません。

 

過去の注文結果に基づいてMMタイプを作成するには?融通が利かないですね...。