新しいビルド604でのテスターは正しく動作しません。 - ページ 4

 

このシンプルなEAは、MQデモ口座444の509と604で、同じ日付でバックテストを行うために作成されました。

  • EAは買い売り交互にトレードを行う
  • 固定SL/TP。口座 残高に基づくロットサイジング。以下ソースコード。
  • 509は509でコンパイルし、509でテストしました。
  • 600は604でコンパイルし、604でテストしています。
ストラテジーテスターレポート
テストEA 509
MetaQuotes-新MT4テスト(ビルド509)

シンボルEURUSD (ユーロ vs 米ドル)
期間1時間(H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01~2013.12.31)です。
モデルすべてのティック(利用可能なすべての最小タイムフレームに基づく最も正確な方法)
テスト中のバー1384モデル化されたティック1448514モデリング品質46.42%
ミスマッチ・チャート・エラー0
初期預金10000.00
総純利益-1199.25総利益20200.90総損失-21400.15
利益率0.94期待ペイオフ-8.75
絶対的ドローダウン2515.20最大ドローダウン3725.52 (33.23%)相対ドローダウン33.23% (3725.52)
総トレード数137ショートポジション (勝率)68 (41.18%)ロングポジション(ウォン)69 (44.93%)
利益取引 (%)59 (43.07%)損失取引 (全体に占める割合)78 (56.93%)
最大利益取引394.33損失トレード-337.74
平均値利益取引342.39損切り取引-274.36
最大連勝(儲け)4 (1494.97)連続損失(資金での損失)12 (-3337.77)
最大連続利益(勝利数)1494.97 (4)連続損失(損失額カウント)-3337.77 (12)
平均値連勝2連敗2
平均値連勝2連敗2

 
テストEA 600+
MetaQuotes-新MT4テスト(ビルド604)

シンボルEURUSD (ユーロ vs 米ドル)
期間1時間(H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01~2013.12.31)です。
モデルすべてのティック(利用可能なすべての最小タイムフレームに基づく最も正確な方法)
テスト中のバー1384モデル化されたティック1459801モデリング品質46.42%
ミスマッチ・チャート・エラー0
初期預金10000.00スプレッド現在 (6)
総純利益-1985.08売上総利益19147.44売上総損失-21132.52
利益率0.91期待ペイオフ-14.81
絶対値ドローダウン2677.75最大ドローダウン4021.28 (35.45%)相対ドローダウン35.45% (4021.28)
総取引数134ショートポジション (勝率)67 (40.30%)ロングポジション (ウォン)67 (44.78%)
利益取引 (%)57 (42.54%)損失トレード (全体に占める割合)77 (57.46%)
最大利益取引394.33損失トレード-337.74
平均値利益トレード335.92損切り取引-274.45
最大連勝(儲け)4 (1494.97)連続損失(損失額)12 (-3336.50)
最大連続利益(勝利数)1494.97 (4)連続損失(損失額カウント)-3336.50 (12)
平均値連勝2連敗2
 
//========================================================================
//|                                                      Test EA 509.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"

//========================================================================
  int start()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return(0);
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return(0);
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 509 Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 
//========================================================================
//|                                                     Test EA 600+.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"
#property version   "1.00"
#property strict
//========================================================================
  void OnTick()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return;
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return;
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 600+ Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 

509 グラフ

604 グラフ

 

同じサーバーでベータテスト版を動かしていたため(デモ口座は 違いますが)、おそらくライブフィードデータにギャップがあり、テストに支障をきたしているのだと思われます。チャート履歴を削除して、両方の端末に同じチャート履歴をダウンロードさせて、テストをやり直そうと思います。

Edit: それ自体が試練になることは分かっていたかもしれません。MQは1974年からの1分足チャートデータを持っているのはいいのだが、全部はいらない!!!。私の端末は今、700MBのRAMを動かしています*rollseyes*。

 
SDC:

同じサーバーでベータテスト版を動かしていたため(デモ口座は違いますが)、おそらくライブフィードデータにギャップがあり、テストに支障をきたしているのだと思われます。チャート履歴を削除して、両方の端末に同じチャート履歴をダウンロードさせて、テストをやり直そうと思います。

Edit: それ自体が試練になることは分かっていたかもしれません。MQは1974年からの1分足チャートデータを持っているのはいいのだが、全部はいらない!!!。そのように、あなたは全く持っていないか、またはあなたのPCでシルコンバレーの半分を必要とするように多くのことができます!私の端末は現在700MB RAM *rollseyes*を実行しています。


こんにちは、M15とM1のテストを試してみてください。

このコードで使用されているインジケータを見ることができませんでした。

604の可能性のある問題は、指標や他の数値のために、いくつかの数値の精度が失われることです。

2つの環境の変数の正確な値を比較するための数値テスト方法を開発する必要があります。

 

おそらく問題の根本的な原因ではないと思いますが、60xではどこかにResetLastError()を含める必要があるのでしょうか?(whileループ内の最初のコマンド?)

 
cbalta:


古いmq4から新しいものにコードを変換しましたか? 新しいmq4に変換した古い複雑なmq4 EAで試してみてください。

このコードで使用されているインジケータは見当たりませんでしたが...。

604の問題点は、インジケータや他の数値の精度が落ちることです。

2つの環境で変数の正確な値を比較するための数値テスト方法を開発する必要があるのですが...


私は投稿した同じソースコードを使いました。509のテストコードを509 Metaeditorでコンパイルし、600のソースコードを604 Metaeditorでコンパイルしました。2つの違いは、新しいものは void OnTick() を使い、古いものは start() を使っていることだけです。

私は、これが未知の可能性ができるだけ少ない基本的なテストであることを望んだので、私はどんな指標も使いませんでした。あなたがテストパラメータを 広げたいなら、指標と他の取引基準を使うためにEAを修正することができます。

 
ydrol:

おそらく問題の根本的な原因ではないと思いますが、60xではどこかにResetLastError()を含める必要があるのでしょうか?(whileループ内の最初のコマンド?)

必要なのかよくわからないのですが?私はそれを調べます、EAはエラーなしでテストを実行したので、私は新しいターミナルでGetLastError()がどのように実行されるかを見ることができませんでした。RAMの使用量が多い(最大1GB以上)のは、履歴センターでダウンロードボタンを押したときに、metaquotesデモサーバーからダウンロードされた何十もの1分チャートデータのためで、そのうちのいくつかを削除しなければならなかったのです。