記事"「マーケット」でプロダクトを宣伝する方法"についてのディスカッション - ページ 48

 

私のEAは新規登録時にエラーを返します:

test onEURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [注文またはポジションがマーケットに近いため修正に失敗しました。]

しかし、私のEAはFXではなくWIN$で動作するようになっています。なぜテスターは実行する資産を知らせないのでしょうか?

EAは完璧に動作しているのですが、製品を販売登録することができません。

 
Adriano De Mello Moura #:

新規商品登録時にEAがエラーを返します:

test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [modification failed due to order or position being close to market].

しかし、私のEAはFXではなくWIN$で動作するようになって います。なぜテスターは実行する資産を知らせないのですか?

EAは完璧に動作しているのですが、製品を販売登録することができません。

ロボットはどの資産でも動作するように準備されていなければなりません。


上記のエラーを修正するには、ポジションを修正する前に以下のチェックを行う必要があります:

//+--------------------------------------------------------------------------------------------------------------------+
//| TakeProfit/StopLossと終値の間の距離がSYMBOL_TRADE_STOPS_LEVELより大きいかどうかをチェックする。
//+--------------------------------------------------------------------------------------------------------------------+
bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
  {
//--- ローカル変数
   bool SL_check = false, TP_check = false;

//--- 現在のシンボルの最終価格を決定する
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- SYMBOL_TRADE_STOPS_LEVEL レベルを取得する。
   int stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
   if(stops_level != 0)
     {
      PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
     }

//--- 2つの注文タイプのみをチェックする
   switch(type)
     {
      //--- 買いオペレーション
      case  ORDER_TYPE_BUY:
        {
         //--- StopLossをチェックする
         SL_check = (BID - SL > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
           }
         //--- TakeProfitをチェックする
         TP_check = (TP - BID > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
           }
         //--- 検査結果を返す
         return(SL_check && TP_check);
        }
      //--- 売りオペレーション
      case  ORDER_TYPE_SELL:
        {
         //--- StopLossをチェックする
         SL_check = (SL - ASK > stops_level * _Point);
         if(!SL_check)
           {
            ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
           }
         //--- TakeProfitをチェックする
         TP_check = (ASK - TP > stops_level * _Point);
         if(!TP_check)
           {
            ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
           }
         //--- 検査結果を返す
         return(TP_check && SL_check);
        }
      break;
     }

//--- 検証成功
   return(false);
  }



以下の記事でロボットが実施すべきその他のチェックをご覧ください:

取引ロボットがマーケットで公開される前に通過すべきテストとは - MQL5 Articles

 

こんにちは、古い商品の商品説明を 編集することができません。

説明文を書き直したり、マーケットから非表示にしたりなど、様々なフォーラムの指示に従いましたが、説明文は元のバージョンに戻ってしまいます。

このままでは、商品をマーケットに戻すことも、編集することもできません。この問題に関して、フォーラムに支援を要請しましたが、今のところ支援はありません。

この "商品説明が編集できない "という問題を解決するにはどうしたらよいでしょうか?よろしくお願いします。

 

Expert Advisorをロードしてテストするとエラーが表示されます。

EURUSD,H1(ネット)のテスト

2020.04.14 00:24:42 0.01 EURUSD at 1.09044 [Invalid volume] インスタントバイに失敗しました。

2020.04.14 00:24:45 0.01 EURUSD at 1.09044 [無効な数量] のインスタント買いに失敗しました。

2020.04.14 00:24:48 0.01 EURUSD@1.09037[無効なボリューム]のインスタントバイに失敗しました。

2020.04.21 00:01:34 0.01 EURUSD@1.08626[無効なボリューム]のインスタント買いに失敗しました。

2020.04.21 00:01:37に1.08626で0.01 EURUSDのインスタントバイに失敗しました[無効なボリューム].

2020.04.21 00:01:40 0.01 EURUSD at 1.08626 [無効な数量]のインスタントバイに失敗しました。

2020.04.27 16:08:24に1.08546で0.01 EURUSDのインスタント売りに失敗しました[無効なボリューム].

2020.04.27 16:08:27 0.01 EURUSD@1.08548[無効な出来高]のインスタント売りに失敗しました。

2020.04.27 16:08:30 0.01EURUSD@1.08547[無効な出来高]のインスタント売りに失敗

2020.04.29 20:15:52 0.01 EURUSD@1.08565[無効なボリューム]のインスタント売りに失敗しました。

2020.04.29 20:15:55 0.01 EURUSD@1.08566[無効な出来高]のインスタント売りに失敗しました。

2020.04.29 20:15:58 0.01EURUSD@1.08566[無効な出来高]の即決売りに失敗

2020.05.18 00:12:09 0.01EURUSD@1.08134[無効なボリューム]のインスタント買いに失敗しました。

2020.05.18 00:12:12に1.08134で0.01 EURUSDのインスタントバイに失敗しました[無効なボリューム].

2020.05.18 00:12:15に0.01 EURUSD at 1.08143[無効な数量]のインスタントバイに失敗しました。

2020.05.21 15:50:25に1.10031で0.01 EURUSDの売り瞬時失敗[無効な数量]

2020.05.21 15:50:28 0.01 EURUSD@1.10034[無効な出来高]の即決売りに失敗

2020.05.21 15:50:31 0.01 EURUSD@1.10036[無効な出来高]のインスタント売りに失敗

2020.05.25 19:00:05に1.08950で0.01 EURUSDのインスタント買いに失敗しました[無効なボリューム].

2020.05.25 19:00:08に失敗したインスタント買い0.01 EURUSD at 1.08951 [無効な数量]

2020.05.25 19:00:11に失敗しました 0.01 EURUSD at 1.08952 [無効なボリューム] インスタント買い

取引操作はありません

 
Kirill Voytseshchuk #:

Expert Advisorをロードしてテストするとエラーが表示され、修正方法がわかりません。

EURUSD,H1(ネット)でのテスト

2020.04.14 00:24:42 1.09044で0.01 EURUSDのインスタント買いに失敗しました。

***

エラーメッセージの全文をお読みください。「どのようなチェックがパスされるべきか...」という記事へのリンクがあります。
 

読んで、コードに書き込む

取引数量が正しくない場合

取引注文を送信する前に、注文で指定された数量が正しいかどうかを確認することも必要です。Expert Advisor が注文で指定するロット数は、OrderSend() 関数を呼び出す前に確認する必要があります。金融商品では、取引可能な最小数量と最大数量、および数量の階調が仕様で 指定されて います。MQL5では、SymbolInfoDouble() 関数を 使用して ENUM_SYMBOL_INFO_DOUBLE列挙から これらの値を取得できます。

//+------------------------------------------------------------------+
//| 注文数量が正しいかチェックする。
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- 取引業務の最低許容量
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("容積が許容最小値未満 SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- 取引操作の最大許容量
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("容積が許容最大値より大きい SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- 最小体積のグラデーションを得る
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("体積が最小評点の倍数でない SYMBOL_VOLUME_STEP=%.2f, 最も近い正しい体積は%.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description=「正しい体積値;
   return(true);
  }

他のコードを修正することはできますか?

スクリプトの改良方法を教えてください。

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

それを読んで、コードに入れる

貿易業務における数量の誤り

取引注文を送信する前に、注文で指定された数量が正しいかどうかを確認することも必要です。Expert Advisor が注文で指定するロット数は、OrderSend() 関数を呼び出す前に確認する必要があります。金融商品では、取引可能な最小数量と最大数量、および数量の階調が仕様で 指定されて います。これらの値は、MQL5ではSymbolInfoDouble() 関数を 使用して ENUM_SYMBOL_INFO_DOUBLE列挙から 取得できます。

他のコードを修正できますか?

スクリプトの改良方法を教えてください。

CheckVolumeValue'は入力パラメータが正しいかどうかのチェックです。

また、ロットの丸めが正しいかどうかのチェックもあります。

 

未決済ポジションの数量と未決済注文の 数量を考慮すると、最終的なチェックは次のようになる:

//+------------------------------------------------------------------+
//| 注文の最大許容数量をシンボルで返します。
//+------------------------------------------------------------------+
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);
  }

追加しますか?

checkvolumevalue.mq5と なります。


//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
   double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
   double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;

//--- 体積階調に含まれる小数点以下の桁数を調べる。
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- ループの中で多くの異なるボリューム値をチェックする。
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print(「検査結果,volume,": ",descr);
        }
        else PrintFormat(「G量は正しい。,volume);
      volume+=3*step;
      volume=NormalizeDouble(volume,digits+1);
     }
//---
  }
//+------------------------------------------------------------------+
//| 注文数量が正しいかチェックする。
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- 取引業務の最低許容量
   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   if(volume<min_volume)
     {
      description=StringFormat("容積が許容最小値未満 SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- 取引操作の最大許容量
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   if(volume>max_volume)
     {
      description=StringFormat("容積が許容最大値より大きい SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- 最小体積のグラデーションを得る
   double volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      description=StringFormat("体積が最小評点の倍数でない SYMBOL_VOLUME_STEP=%.2f, 最も近い正しい体積は%.2f",
                               volume_step,ratio*volume_step);
      return(false);
     }
   description=「正しい体積値;
   return(true);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk 未決済注文の 数量を考慮すると、最終的なチェックは次のようになる:

追加しますか?

checkvolumevalue.mq5と なります。


必要なチェックはすべてこの記事の中にあるEAを作成するコンストラクタはほとんど ここにある

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

以前質問されたコードは適切ですか?

その記事から必要な行を書くことができます。