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

 

新しい記事 マーケットでの公開前にトレードロボットに行うべき検査 はパブリッシュされました:

マーケットの全ての製品は、均一な品質基準を確保する為に、公開前に事前の必須検査を受けます。この記事では、開発者が自分のテクニカルインディケータやトレードロボットで犯しがちなミスについてお話しします。また、マーケットへ提出する前の、製品の自己テストの方法もご紹介します。

プラットフォームに組み込まれたストラテジーテスターは、取引システムを履歴上でチェックするだけでなく、トレードロボット作成時に見過ごした論理/アルゴリズムエラーを検出することができます。テスト時の取引操作やエラー検出に関するメッセージは、全てテスターの操作ログに表示されます。これらのメッセージは、コンテキストメニューのコマンドで呼び出される、特別なログビューアで分析するのに便利です。

作者: MetaQuotes Software Corp.

 

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

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)
  {
//--- 始値を取得
   MqlTick mqltick;
   SymbolInfoTick(symb,mqltick);
   double price=mqltick.ask;
   if(type==ORDER_TYPE_SELL)
      price=mqltick.bid;
//--- 自己資本と必要証拠金
   double margin,equity=AccountInfoDouble(ACCOUNT_EQUITY);
   //--- テスト関数を呼び出す
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- 何か問題が発生した。
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- 運用資金が不足している場合
   if(margin>equity)
     {
      //--- エラーを報告し、falseを返す
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- テストは成功した
   return(true);
  }

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

 
Andrey Barinov:

これが疑問の残る部分である:

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

合理的です。
 

記事をありがとうございました。

bool CheckMoneyForTrade(string symb, double lots,int type)
  {
   double free_margin=AccountFreeMarginCheck(symb,lots,type);
   //-- 十分な資金がない場合
   if(free_margin<0)
     {
      string oper=(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ", oper," ",lots, " ", symb, " Error code=",GetLastError());
      return(false);
     }
   //-- テストは成功した
   return(true);
  }

AccountFreeMarginCheckの どの バリエーションもエラーを出し、マーケット用のExpert Advisorを設定することが全くできません

GetLastError()!=134の条件にGetLastError()!=134を追加したり、上記の関数を使ってもエラーで失敗するだけ。

上記の関数は、このようにエラーを投げることに成功している。

2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: invalid lots amount for FreeMarginCheck function
2016.07.25 15:15:54.200 2016.01.04 19:59  RSI_Grabber.1.1 XAUUSD,H1: Not enough money for Buy 0.1 XAUUSD Error code=4051

間違っているかもしれませんが、0.1は手で指定する通常のロットです。 通貨ペアのMODE_MINLOTは0.01です。

しかし正直なところ、掘り下げれば掘り下げるほど、何が問題なのかわからなくなってくる。

 

おそらく、この関数でロットを正規化し、無効がないようにすべきだろう。

そして、この関数は資金がないことを書き込みますが、ポジションをオープン するリクエストをサーバーに送信しません。

私は最近、このような命令を2年ほど前に使い始めました:

double margin=EMPTY_VALUE;
      margin=AccountFreeMarginCheck(sy,op,ll);
      if(margin>0)
        {

        ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,MarketInfo(sy,MODE_DIGITS)),Slippage,NormalizeDouble(sl,MarketInfo(sy,MODE_DIGITS)),NormalizeDouble(tp,MarketInfo(sy,MODE_DIGITS)),
coomment,mn,0,clOpen);
         
        }
      else Print("Not Enought Money Margin Required"+(string)margin);

実際にすべてが動作します。

取引を開始すると、Expert Advisor は単にPrint("Not Enought Money Margin Required "+( string)margin) string を返します;

このExpert Advisorは市場でテストされ、誰もが満足しています。

 

正確な計算にはこのオプションを使う。そうすれば、自由に比較することができます。

Laverage = AccountInfoInteger(ACCOUNT_LEVERAGE);  //肩 
RazmerKontrakta=LotSize*MarketInfo(Symbol(),MODE_LOTSIZE);  /TradeVol*1ロット 
MargaB=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits());
MargaS=(RazmerKontrakta/Laverage)*NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits());
FreeMargin  = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
 

半年前、マーケットから1つのExpert Advisorをテストしましたが、2日目か3日目にゼロ除算 エラーでテスターがクラッシュしました。数十のレビューを持つExpert Advisorは、つまり、それは購入されています。そして数百のコメント。

そして、多くの人がこの問題があると書いて、お互いに一日一回再起動するようにアドバイス!!!

それは、市場でのルールの厳しさは、その実装のオプション性によって補われていることが判明した?

SUS: Expert Advisorの名前は覚えていないが、それはトップであり、安くはない。ある種のスキャルパーだ。

 

著者の皆様、記事をありがとうございます。

MQL4のコードに小さな間違いがあります。CheckMoneyForTrade 関数について:

double free_margin=AccountFreeMarginCheck(symb,lots,type);

は必須です:

double free_margin=AccountFreeMarginCheck(symb,type,lots);
 

関数の 中で

bool CheckMoneyForTrade(string symb, double lots,int type)

に変更する必要があります、

double free_margin=AccountFreeMarginCheck(symb,lots,type);

に変更してください、

double free_margin=AccountFreeMarginCheck(symb,type,lots);

に変更する必要があります。

 
すべての言語で記事が修正されました。
 
ダーツのサーカス。ターミナル側で必要なチェックをすべて一度にプログラミングする代わりに、開発者は悩むことをやめ、各ユーザーに同じコードを書かせ、デバッグさせることにした。ターミナル開発者がユーザーに対して友好的なアプローチをしているのであれば、このような落とし穴は存在しないはずである。私自身は、このようなアプローチをとるターミナル開発者を軽蔑している。なぜなら彼らの怠惰のせいで、MQLで何千人もの開発者の時間が失われているのだから。