記事"マーケットでの公開前にトレードロボットに行うべき検査"についてのディスカッション - ページ 3

 
Bogdan Bovykin:

パネルとして作成し、そのようにチェックするのですか? それともどのようにするのですか?

今現在、手動でトレードを開始し、このEAがチャートにオープンオーダーのチケットにアタッチされています。

OK

もしあなたがユーティリティを自分で書いたのであれば、INITのテスターで取引を開くことができ、アシスタントがそれを管理します。

 

ターミナルでExpert Advisorがテストに合格し、取引を開始した 場合、自動チェックでは、取引が開始されていない(ペアとTFが同じ)というエラーが表示され、それぞれ "自動チェック "に合格しません。

偶然ですか?私はそうは思いません!

どうすればいい?

 
私も最近同じエラーに見舞われた。
 

MetaQuotesが開発者用のテンプレートを作成することは可能でしょうか?開発者にとってはより簡単になりますし、MetaQuotesは提出されたEAをチェックする ための膨大な費用とリソースを節約することができます。

開発者用のテンプレートはコードベースにあります。

https://www.mql5.com/ja/code/mt4/experts/best

 
Alain Verleyen:

興味深い記事だが、残念なことに誤字脱字が多すぎる(提案されているコードに誤字脱字や論理的な誤りがある)。

//+------------------------------------------------------------------+
//| シンボルに対する注文の最大許容数量を返す。
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- オーダーの最大量の制限を取得する
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- シンボルによるボリュームの制限を得る
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- シンボルでオープンポジションの出来高を取得する
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)  There is no opened positions
     {
      //--- 容積を使い果たした場合
      if(max_volume-opened_volume<=0)
         return(0);

      //--- オープン・ポジションの出来高がmax_volumeを超えないこと。
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

論理的エラー。まだポジションがない場合、ペンディングボリュームをチェックし、許容ボリュームを計算する必要があります。このコードは、未決済のポジションがない場合、allowed_volume=0を返します。

なぜかというと、このコードでは未決済注文の 数量もチェックしているからです。
 
Alain Verleyen:


+パラメータがない(PrintFormatには%はあるが、パラメータは3つしかない)。

ありがとうございます!修正

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- チケット順の選択
   if(orderinfo.Select(ticket))
     {
      //--- 未決注文が発注されたシンボルのサイズとシンボル名。
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- オープン価格に変化があるかどうかをチェックする。
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- ストップロス・レベルに変更があるかどうかをチェックする。
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- タケプロフィット・レベルに変更があるかどうかをチェックする。
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- レベルに変化があれば
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)
         return(true);  // 順序は変更可能 
      //--- オープン、ストップロス、テイクプロフィットのレベルに変更はありません。
      else
      //--- エラーを通知する
         PrintFormat("Order #%d already has levels of Open=%.5f SL=%.5f TP=%.5f",
                     ticket,orderinfo.PriceOpen(),orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//--- 最後まで来たが、オーダーに変更はない。
   return(false);       // 修正する意味はない 
  }
 
Alain Verleyen:

上記2°と同様のエラー。

また、OrderModifyCheck() mql4バージョンでも同じエラーが発生します。


すべて修正しました!

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- チケット順の選択
   if(orderinfo.Select(ticket))
     {
      //--- 未決注文が発注されたシンボルのサイズとシンボル名。
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- オープン価格に変化があるかどうかをチェックする。
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- ストップロス・レベルに変更があるかどうかをチェックする。
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);

その他の論理エラー。SL/TPを1ポイント変更することは許される。であるべきです。

私が記憶している限りでは、このような方法は、取引要求がサーバーに届くまでの間、価格が変化して、取引サーバーから拒否されないようにするためです。

より安全な方法です。

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- チケット順の選択
   if(orderinfo.Select(ticket))
     {
      //--- 未決注文が発注されたシンボルのサイズとシンボル名。
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- オープン価格に変化があるかどうかをチェックする。
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- ストップロス・レベルに変更があるかどうかをチェックする。
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- タケプロフィット・レベルに変更があるかどうかをチェックする。
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- レベルに変化があれば
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)

+ タイプミス です。"-tp)>=point); "とすべきです。

ありがとう
 
bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);

//--

bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-tp)>point);