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

 

ありがとうございます。

サブトピック「1シンボルによるロット数の制限」の 中で、PositionVolume() 関数のコードが2回出てくるのですが、よくわかりません。
すぐ下にNewOrderAllowedVolume() 関数とその呼び出しの説明があります:

double orders_volume_on_symbol=PendingsVolume(symbol);

PendingsVolume() 関数の記述だけが、この記事のどこにもない。

PendingsVolume() 関数の代わりにPositionVolume() 関数が誤って再度記載されている場合は、訂正をお願いします。

 
100%バリデーションをパスできるシンプルなEAの例を調べて、自分のコードと比較して、何がエラーになり得るかを見つけたい。
 

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

//+------------------------------------------------------------------+
//| シンボルに対する注文の最大許容数量を返す。
//+------------------------------------------------------------------+
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)
     {
      //--- 容積を使い果たした場合
      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を返す。

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.StopLoss(),orderinfo.TakeProfit());
     }
//--- 最後まで来たが、オーダーに変更はない。
   return(false);       // 修正する意味はない 
  }

もう一つの論理エラー。SL/TPを1ポイント変更することは可能です。であるべきです。

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

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

bool PositionModifyCheck(ulong ticket,double sl,double tp)

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

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

これらのエラーを修正していただきありがとうございました。

 

この記事に関する他のコメントもありますが、今回はエラーとは関係なく、個人的な意見です:

Access violation

このエラーは、アクセスが拒否されたメモリにアクセスしようとしたときに発生します。このような場合、プロフィールのサービスデスクまたは連絡先 ページから開発者に連絡する必要があります。
  • 面白いことに、これはユーザー(コーダー)のエラーに関する記事とは何の関係もありません。アクセス違反とは、Metaquotesコードのエラーを意味します。

この種のエラーは比較的まれで、その多くには原因を見つけるためのコードが用意されて います。

定数 説明
err_internal_error 4001 予期しない内部エラー
err_wrong_internal_parameter 4002 クライアント・ターミナル関数の内部呼び出しのパラメータが間違っています。
  • エラーコードは助けになるものだが、「予期せぬ内部エラー」はまったく役に立たないし、「クライアント端末関数の内部呼び出しでパラメータが間違っています」は実に不可解だ(少なくとも私には)。

初心者の方はエラー処理に関する記事をすべて読むことをお勧めしますし 、フォーラムや記事のコメントで質問することも できます。MQL5.コミュニティの他の経験豊富なメンバーが、不明な点を解決する手助けをしてくれるでしょう。この記事で集めた情報が、より信頼性の高い取引ロボットを短時間で作成するのに役立つことを願っています。

  • マーケットはMetaquotesによって提案された商業サービスであり、彼らはサポートを引き受けるべきであり、コミュニティに頼るべきではない。私の考えでは、それはプロフェッショナルなアプローチではありません。

このような批判があるにもかかわらず、私はMetaquotesのMT4/MT5における素晴らしい仕事に感謝し、彼らがその品質とプロフェッショナリズムのレベルを高め続けることを奨励したいと思います。

 
Andrey Barinov:

これが疑問の残る部分だ:

なぜ、必要証拠金はエクイティと比較され、フリーマージンとは比較されないのですか?

http://prntscr.com/dgd6s4

何が問題なのか?

証拠金をチェックし、十分な資金がない、取引しないが、フクロウを上げることはできません。

Снимка на екрана
Снимка на екрана
  • prnt.sc
Снимано с Lightshot
 
どうすればよいのか教えてください!私はExpert Advisor Assistantという製品を作りたいと思っています。バインドしないと、テスターにトレードが表示されず、テストに合格しません。
 
試してみたのですか? それとも単なる思いつきですか?
 
Vladislav Andruschenko:
やってみた?
やったよ! チェックアウトされなかったってメッセージが出て、フクロウはどのトレードもオープンしなかった! まあ、アシスタントならしないだろうね。
 
Bogdan Bovykin:
試してみましたが、検証されていないとのメッセージが表示され、トレードは1つも開きませんでした!まあ、アシスタントであれば開くことはないでしょう。

ユーティリティの場合は、モデレーターが個人的にEAをチェックします。

ユーティリティは、テスターが少なくとも2、3のトレードをオープンし、アシスタントとして同行するように設定できます。問題ありません。

 
Vladislav Andruschenko:

ユーティリティの場合は、モデレーターが個人的にEAをチェックします。

ユーティリティの場合、テスターが少なくとも2、3回取引を開始し、アシスタントとして同行するように設定することができます。それは問題ない。

つまり、パネルにして、そのようにチェックしたいのですか? それとも?

今現在、手動でトレードをオープンし、オープンした注文のチケットにこのEAをチャートに添付するだけです。