エラー、バグ、質問 - ページ 214

 
Ashes:

この結果は、単純なExpert Advisorで得られたものであり、実質的に分析に時間をかけず、指標も使用していません。

EAのコードを掲載してください。
 
Ashes:

この結果は、実質的に分析に時間をかけず、インジケータも使用しない、単純なExpert Advisorで得られたものであることをお忘れなく。

比較のため。

Windows 7マシン、Intel Pentium Dual-Core E5400 @ 2.70 GHz、2038 MB(PR111)で10000トレードでこのテストを実行したところ472866msかかりました。

以上のことから、「チャンピオンシップ2010」の候補者の中には、15分の壁やテスターの特殊性(案件が多かった場合)により、不当に落選した可能性があると思われます。

** - テスターの終了時にトレードが表示されたシンボルチャートが表示されないことが数回ありました。

このような結果を示す「シンプルなEA」を書くことはできませんでした。以下は私のコードです。

//+------------------------------------------------------------------+
//|                                                  TimeOnDeals.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      deals=1000;
input double   lot=0.01;
uint start;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   start=GetTickCount();
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   PrintFormat("deals=%d  time=%d",deals,(GetTickCount()-start));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OnTester()
  {
   return(GetTickCount()-start);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int done_deals=0;
//---
   if(done_deals<deals)
     {
      if(Buy(lot)) done_deals++;
      else Print("Не удалось выполнить Buy, ошибка ",GetLastError());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Buy(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_BUY;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
bool Sell(double v)
  {
   double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   MqlTradeRequest   m_request;         // request data
   MqlTradeResult    m_result;          // result data   
   m_request.action=TRADE_ACTION_DEAL;
   m_request.symbol      =_Symbol;
   m_request.magic       =555;
   m_request.volume      =v;
   m_request.type        =ORDER_TYPE_SELL;
   m_request.price       =price;
   m_request.sl          =0;
   m_request.tp          =0;
   m_request.deviation   =10;
   return(OrderSend(m_request,m_result));
  }
//+------------------------------------------------------------------+


以下は最適化の結果で、Result欄には実行時間がミリ秒単位で表示されています。


 
Rosh:

このような結果を示す「シンプルなEA」を書くことはできていません。以下は私のコードです。

以下は最適化の結果で、Result欄には実行時間がミリ秒単位で表示されています。

面白い...

アレクサンダー
EAコードを掲載してください。

Expert Advisorは、自動売買チャンピオン2010のExpert Advisorを素早く書く 方法の記事にあるテンプレートをベースにしています。

CExpertAdvisorクラスは、そのまま使用します。もしかしたら、これはクラスを使っている副作用かもしれませんね。テスト結果からは、ある閾値を超えると減速が始まるような印象を受けます。もしかしたら、限られたサイズのトランザクションテーブルで、それを過ぎるとメモリの再割り当て/ゴミ収集が始まるのでは?

PS.エキスパートアドバイザーはアルパリデモ口座の機能(ゼロマージン)を使用しており、そうでない場合は取引回数が変更される可能性があることを再度お断りしておきます。

ファイル:
 
Rosh:

このような結果を示す「シンプルなEA」を書くことはできていません。以下は私のコードです。

以下は最適化の結果で、Result欄には実行時間がミリ秒単位で表示されています。

XLSXへの出力も問題ないですか?

 
Rosh:

このような結果を示す「シンプルなEA」を書くことはできていません。以下は私のコードです。

以下は最適化の結果で、Result欄には実行時間がミリ秒単位で表示されています。

表 - オプティマイザーの結果:ログオフ?ログの副作用?

 
Ashes:


自動売買王決定戦2010のクイックEAの書き方という 記事のテンプレートを元に作成したEAです。

CExpertAdvisorクラスは、そのまま使用します。もしかしたら、これはクラスを使っている副作用かもしれませんね。テスト結果からは、ある閾値を超えると減速が始まるような印象を受けます。もしかしたら、限られたサイズのトランザクションテーブルで、それを過ぎるとメモリの再割り当て/ゴミ収集が始まるのでは?

PS.エキスパートアドバイザーはアルパリデモ口座の機能(ゼロマージン)を使用しており、そうでない場合は取引回数が変更される可能性があることを再度お断りしておきます。

このクラスは GetDealByOrder(ulong order) メソッドを含んでいます。

ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки 
     }
   return(0);
  }

は、取引のたびに呼び出されます。そのため、毎回取引の全履歴を確認し、取引回数の2乗に比例してテスト時間が遅くなる。

このようなものは、最適化やテストが必要なExpert Advisorでは、時間のロスが避けられないため、使用しない方がよいでしょう。このような場合は、アルゴリズムでこれらの呼び出しを置き換えるのがよいでしょう。

 
Rosh:

このクラスは GetDealByOrder(ulong order) メソッドを含んでいます。

これは、各トランザクションで呼び出されます。その結果、毎回取引の全履歴を検索することになり、取引数の二乗に比例してテスト時間が遅くなる。

最適化やテストが必要なExpert Advisorでは、どうしても時間をロスしてしまうので、そのようなものは使わない方がよいでしょう。このような場合は、アルゴリズムでこれらの呼び出しを置き換えるのがよいでしょう。

つまり、Expert Advisorのテンプレートを使用した全員が「影響を受ける」のです...。

XLSXはどうですか?Expert Advisorのコードとは関係ないんですよね?

 
Rosh:

このクラスは GetDealByOrder(ulong order) メソッドを含んでいます。

 ulong CExpertAdvisor::GetDealByOrder(ulong order) // получение тикета сделки по тикету ордера
  {
   PositionSelect(m_smb);
   HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));
   uint total=HistoryDealsTotal();
   for(uint i=0; i<total; i++)
     {
      ulong deal=HistoryDealGetTicket(i);
      if(order==HistoryDealGetInteger(deal,DEAL_ORDER))
         return(deal);                            // запомнили тикет сделки
     }
   return(0);
  } 

は、各トランザクションで呼び出されます。したがって、この 特定 条件のエキスパートアドバイザーでは、毎回、全取引履歴を検索し、取引件数の2乗に比例するテスト時間が遅くなっています。

このようなものは、最適化やテストが必要なExpert Advisorでは、時間のロスが避けられないため、使用しない方がよいでしょう。このような場合は、アルゴリズムでこれらの呼び出しを置き換えるのがよいでしょう。

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

この方法は、履歴全体を検索するのですか、それとも、オープンポジションに 関連する履歴の一部だけを検索するのですか?オープンポジションでつながっている案件が5件以下なら、履歴全体を見るよりHistorySelectByPositionを 使った方がいいと思う。 HistorySelect(0,TimeCurrent())

P.S. CExpertAdvisorは見ませんでした。

 
Konstantin83:

HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER));

この方法は、歴史全体を検索するのでしょうか。 また、オープンポジションに関連する歴史の一部だけを検索するのでしょうか。オープンポジションでつながっている案件が5件以下なら、履歴全体を見るよりHistorySelectByPositionを 使った方がいいと思う。 HistorySelect(0,TimeCurrent())

P.S. CExpertAdvisorは見ませんでした。

この 場合、1つのポジションに数千の案件があり、それらはすべて同じPOSITION_IDENTIFIER ポジション識別子を持っています。したがって、 この場合の HistorySelectByPosition の呼び出しはHistorySelect(0,TimeCurrent()) の呼び出しと同等 あり、これらの案件の列挙は履歴からすべての案件を検索 することにつながる。

仮に 、記事のパターンを使った残念な例ができたとしましょう。シベリアの男と日本のチェーンソーの話と同じです。

 
Ashes:

XLSXはどうですか?EAコードは関係あるのでしょうか?

ここは必ず直る。開発者は承知しています、ありがとうございます。