記事"クロスプラットフォームEA: シグナル"についてのディスカッション - ページ 3

 
Karl Klang:

エンリコ、こんにちは、

MAとTEMAインジケータがクロスしたときに機能するようなヒステリシス機能を含むCalculate関数を処理する方法を見つけました。

しかし、オーダーマネージャーで問題が発生しました。それは、最適化中にストラテジー・テスターをいくつかのループで実行したときに起こります。最初のループでは問題なく動作しますが、いくつかのループの後、すべてのローソク足に対して注文が発注されます。

ここでは問題なく動作します:


しかし、ここでOrder Managerが複数の注文を出し始めます:


COrderManagerの以下のコード部分をデバッグしたところ、orders_total = OrdersTotal();というステートメントがうまくいくと1になり、失敗すると0になります。

うまくいけば、この問題を解決できるかもしれません。

よろしくお願いします/
Karl

こんにちは、カール、

この問題に遭遇したことはありません。OrdersTotal()メソッドは、単にアクティブなCOrderオブジェクトの数をカウントするだけです。もしコード化されたストラテジーに何か問題があるのであれば、修正しなければなりません。そうでない場合は、COrderインスタンスの管理方法(作成/破棄)および/またはカウント方法に何らかの問題があるはずです。この問題が見つかり次第、すぐにお知らせします。

 

こんにちは、エンリコ、

mt5のOrdersTotal()の問題でググってみると、他の人も同じような問題を抱えていることがわかります。例ストラテジーテスターを 試せば同じ問題が再現できるかもしれません。エキスパートセットもアップロードしますので、私と同じ入力でストラテジーテスターを実行してみてください。

よろしくお願いします/
Karl

How to use the OrdersTotal() correctly?
How to use the OrdersTotal() correctly?
  • 2010.09.09
  • www.mql5.com
I tried many times to check OrdersTotal(), but I found it did not work...
 
Karl Klang:

エンリコ、こんにちは、

mt5のOrdersTotal()の問題でググってみると、他の人も同じような問題を抱えていることがわかります。例えばストラテジーテスターを 試せば、同じ問題を再現できるかもしれません。エキスパートセットもアップロードしますので、私と同じ入力でストラテジーテスターを実行してみてください。

よろしくお願いします/
Karl

ファイルをありがとう。ご指摘の問題が発生しました。

メインのインクルードファイルで、これ(OnInit)を変更してください:

file.Open(savefile,FILE_READ);
if(!experts.Load(file.Handle()))
   return(INIT_FAILED);
file.Close();

をこれに変更してください:

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
   file.Open(savefile,FILE_READ);
   if(!experts.Load(file.Handle()))
      return(INIT_FAILED);
   file.Close();
}


そして this (OnDeinit):

file.Open(savefile,FILE_WRITE);
experts.OnDeinit(reason,file.Handle());
file.Close();

をこれに変更してください:

#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION)))
#else
if (!(IsTesting() || IsOptimization()))
#endif
{
  file.Open(savefile,FILE_WRITE);
  experts.OnDeinit(reason,file.Handle());
  file.Close();
}

何らかの理由で、以前のセッションから保存されたデータが将来のセッションにリロードされています。そのため、この問題は最初のバックテスト後にのみ発生し、時にはメモリー・リークも発生します。私のテストによると、この問題はネッティング・モードのみに存在し、MT4やMT5のヘッジ・モードには存在しないようです。しかし、この問題が引き続き発生する場合はお知らせください。上記のコードでは、バックテストと最適化中にデータのロードと保存ができません(最終的な記事を書いている間、このことに言及しているのを見落としていました)。

 

また、MT5 の OrdersTotal() については、保留中の注文のみをカウントします(MT4 の OrdersTotal と同等ではありません)。TradeOpen の OrderManager:

bool COrderManager::TradeOpen(const string symbol,ENUM_ORDER_TYPE type,double price,bool in_points=true)
  {
   bool ret=false;
   double lotsize=0.0;
   int trades_total =TradesTotal();
   int orders_total = OrdersTotal();

のコードでは、クラスの OrdersTotal() メソッドを使用していますが、これは COrders のメソッド(同じ名前)のラッパーにすぎません。COrders は CArrayObj を拡張しているため、実際には MT5 ネイティブのOrdersTotal() 関数を 使用していません。上記も使用するのと同じです:

int orders_total = this.OrdersTotal();

一方、:

int orders_total = ::OrdersTotal();

を使用すると、MT5 ネイティブ関数が明示的に呼び出されます。すでにご存じかもしれませんが、同じような問題に遭遇した人のために念のため。

 

エンリコ、ありがとう。問題は解決した。

/カール

 
Enrico Lambino:
#ifdef __MQL5__
if (!(MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION))) // MQL5だけでなく、MQL4のコードも。
#else
if (!(IsTesting() || IsOptimization()))
#endif
MQLInfoInteger(MQL_TESTER) || MQLInfoInteger(MQL_OPTIMIZATION) == MQLInfoInteger(MQL_TESTER)
 
fxsaber:
なるほど。そうだね。
 

こんにちは、エンリコ、

iceron/MQLxのGithubにm_new_signalとm_new_signal_closeの変更通知があります。

m_signal_newはvoid CSignalsBase::NewSignal(const bool value)メソッドで変更できますが、m_new_signal_closeを変更するメソッドがありません。

m_new_signalとm_new_signal_closeの使い方を詳しく教えてください。

   if(m_invert)
     {
      CSignal::SignalInvert(m_signal_open);
      CSignal::SignalInvert(m_signal_close);
     }
   if(m_new_signal)
     {
      if(m_signal_open==m_signal_open_last)
         m_signal_open = CMD_NEUTRAL;      
     }
   if(m_new_signal_close)
     {
      if(m_signal_close==m_signal_close_last)
         m_signal_close = CMD_NEUTRAL;      
     }

よろしくお願いします。

カール

iceron - Overview
iceron - Overview
  • github.com
Sign up for your own profile on GitHub, the best place to host code, manage projects, and build software alongside 36 million developers. Sign up
 

これらの方法はMT5Bridgeで使えますか?

 

マスターの皆さん、こんにちは!

SignalACクラスに属する以下のMql Signalコードで、"キャンドルカウント"(1番目、2番目、3番目=idx、idx++、...)を理解するのに深刻な問題があります。

どなたか、コードを下に移動する ときにidx番号に浸透させる手助けをしていただけませんか?

よろしくお願いします。

//+------------------------------------------------------------------+
//| 価格が上昇することに "投票 "する。|
//+------------------------------------------------------------------+
int CSignalAC::LongCondition(void)
  {
   int result=0;
   int idx   =StartIndex();
//--- 最初に分析されたバーが「赤」の場合、「買い」に「投票」しない。
   if(DiffAC(idx++)<0.0)
      return(result);
//--- 最初の分析バーが "緑"(インジケーターは買いに異論なし)。
   if(IS_PATTERN_USAGE(0))
      result=m_pattern_0;
//--- 2本目の分析バーが "赤 "の場合、買いの条件はない。
   if(DiffAC(idx)<0.0)
      return(result);
//--- 2本目の分析バーが "緑"(買いの条件が満たされた可能性がある)
//--- 2本目の分析バーが0より小さい場合、3本目のバーを分析する必要がある。
   if(AC(idx++)<0.0)
     {
      //--- 3本目の分析バーが "赤 "の場合、買いの条件はない。
      if(DiffAC(idx++)<0.0)
         return(result);
     }
//--- 購入には条件がある
   if(IS_PATTERN_USAGE(1))
      result=m_pattern_1;
//--- 前に分析したバーが "赤 "であれば、買いの条件が満たされたことになる。
   if(IS_PATTERN_USAGE(2) && DiffAC(idx)<0.0)
      result=m_pattern_2;
//--- 結果を返す
   return(result);
  }