オートバリデーション - 問題点

 

EAのバージョンを更新しようとすると、エラーが発生する。

同じEAがストラテジーテスターにあります。


MT4用のEAも同時に書いていますが、そちらは問題ありません。4と5のEAのコードは同じで、唯一の違いはインクルードファイルです(4と5で異なる)。

前回、このEAをアップデートしたのは1月で、すべてOKでした。

ソフトウェアバージョン - MetaTrader 5 x64 build 2025 開始 (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memory: 1866 / 3967 Mb, Disk: 5 / 35 Gb, GMT+3

 
Uladzimir Kirychenka:

EAのバージョンを更新しようとすると、エラーが発生する。

同じEAがストラテジーテスターにあります。


MT4用のEAも同時に書いていますが、そちらは問題ありません。4と5のEAのコードは同じで、唯一の違いはインクルードファイルです(4と5で異なる)。

前回、このEAをアップデートしたのは1月で、すべてOKでした。

ソフトウェアバージョン - MetaTrader 5 x64 build 2025 開始 (MetaQuotes Software Corp.)

- Terminal Windows 10 (build 14393) x64, IE 11, UAC, Intel Celeron N2815 @ 1.86GHz, Memory: 1866 / 3967 Mb, Disk: 5 / 35 Gb, GMT+3

バカのふりして1ドルの入金や100500ロットを入れて、取引が あるかどうか見てみましょう。そして、こんなパラメータを設定するのはバカだけだという注意喚起が行われるのでしょうか。

 
Alexey Viktorov:

バカの一つ覚えで1ドル、ロット100500を入金して、取引が あるかどうか確認する。そして、そんなパラメータを設定できるのはバカだけだというアラートが出るかどうか。

同じ問題です。試してみましたが、役に立ちません)。4月13日から更新ができない。私はすべてとすべてをチェックする場合 - 私はすべてのシンボルに1つだけ刻まれた "treheは取引業務を行っていない "を取得します。すべてをチェックしないと、「ポジションを開くのに十分な資本がありません」というエラーが出ます。MT4用も、TS作者用も、問題なく更新されています。

123

私は、最小ロットが2000で、残高が10000であり、明らかにポジションを開くのに十分な資金がないことを画像で見ることができます。とにかくチェックをパスしない。

そんなときはどうすればいいのか。

 

もちろん、取引はしない。また、アラートは何を想定しているのでしょうか?OnInitでロットサイズがSYMBOL_VOLUME_MINと SYMBOL_VOLUME_MAXの範囲にない場合、初期化エラーINIT_PARAMETERS_INCORRECTが発生します。

 
Uladzimir Kirychenka:

もちろん、取引はしない。また、アラートは何を想定しているのでしょうか?OnInitでロットサイズがSYMBOL_VOLUME_MINと SYMBOL_VOLUME_MAXの範囲にない場合、初期化エラーINIT_PARAMETERS_INCORRECTが発生します。

当時、自動チェックの後にモデレーターがチェックするというのが、ほぼ同じだったように記憶しています。不正確なパラメータを指定した場合、OnInitもコードINIT_PARAMETERS_INCORRECTで終了します。また、オートチェックでは、取引操作がなかったという同じエラーが発生しました。そこで、司会者から、このコードでOnInit()を終了させるのではなく、Alertを発行するようにとのアドバイスがありました。

 

おそらく月に一度、誰かがその話を持ち出すのでしょう。ずっと続いているんです。

取引(実戦)では残高の大きさだけでなく、ロットサイズも変わることがあるということです。

また、テスト中は入金サイズ(1~10000000)やロットサイズ(1000000~0.01)を変更することができます。

したがって、これらのチェックはOnInitで一度だけでなく、ループ内(例えばOnTick)で恒久的に行う必要があります。

ログのオーバーフローを防ぐため、警告の出力(Print MessageまたはAlert)は1回のみとする必要があります。

 
Uladzimir Kirychenka:

もちろん、取引はしない。また、アラートはどのようなものなのでしょうか?OnInitでロットサイズがSYMBOL_VOLUME_MINと SYMBOL_VOLUME_MAXの範囲にない場合、初期化エラーINIT_PARAMETERS_INCORRECTが発生します。

バカのふりをするのはとても大変なことだと思いますが、このスキルが役に立つこともあるのです。もう一度試してみてください。Expert Advisorを設定し、口座には1ドル、ロットを100500に設定し、待つだけです。1日、2日、3日...と待つのです。となると、「何のためにお金を払ったのか」と恨むようになる。なんでこんなの効かないんだ!」と言っても誰も何も言わないし、「バカじゃないの...」と言いたくもない。そのような預金では、外国為替市場で働くことはできません。ロット100500なんてつけるのはバカだけだ」...。そういうことなんです。

 
Petros Shatakhtsyan:

おそらく月に一度、誰かがその話を持ち出すのでしょう。ずっと続いているんです。

取引(実戦)では残高の大きさだけでなく、ロットサイズも変わることがあるということです。

また、テスト中は入金サイズ(1~10000000)やロットサイズ(1000000~0.01)を変更することができます。

したがって、これらのチェックはOnInitで一度だけでなく、ループ内(例えばOnTick)で恒久的に行う必要があります。

警告(メッセージまたはアラートの印刷)は、ログのオーバーフローを避けるため、一度だけ印刷する必要があります。

非常にシンプルなコードでも検証をパスすることはできません。おっしゃるような条件を満たしているようです。

void OnTick()
  {
   ENUM_POSITION_TYPE PosType=POSITION_TYPE_SELL;
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);
   long digit;
   double point,Bid;
   SymbolInfoDouble(_Symbol,SYMBOL_BID,Bid);
   request.type   = ORDER_TYPE_SELL;
   request.price  = Bid;
   request.action = TRADE_ACTION_DEAL;
   request.symbol = _Symbol;
   request.volume = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   request.sl=0;
   request.tp=0;
   request.deviation=10;
   request.magic=55555;
   request.comment=NULL;
   request.type_filling=0;
   if(PositionsTotal()==0
   &&CheckMoneyForTrade(_Symbol,SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN),ORDER_TYPE_SELL)==true
   ){
   OrderSend(request,result);
   }else{
      ExtExpert.Deinit();
      return;
   }
  }
  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,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);
   //--- вызовем функцию проверки
   if(!OrderCalcMargin(type,symb,lots,price,margin))
     {
      //--- что-то пошло не так, сообщим и вернем false
      Print("Error in ",__FUNCTION__," code=",GetLastError());
      return(false);
     }
   //--- если не хватает средств на проведение операции
   if(margin>free_margin)
     {
      //--- сообщим об ошибке и вернем false
      Print("Not enough money for ",EnumToString(type)," ",lots," ",symb," Error code=",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }
マネーチェックあり-取引業務がない、チェックなし-資金が ない
 
Petros Shatakhtsyan:

おそらく月に一度、誰かがその話を持ち出すのでしょう。ずっと続いているんです。

取引(実戦)では残高の大きさだけでなく、ロットサイズも変わることがあるということです。

また、テスト中は入金サイズ(1~10000000)やロットサイズ(1000000~0.01)を変更することができます。

したがって、これらのチェックはOnInitで一度だけでなく、ループ内(例えばOnTick)で恒久的に行う必要があります。

警告(印刷メッセージまたはアラート)は、ログのオーバーフローを避けるため、一度だけ出力する必要があります。

これらのチェック(LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck)は、ポジションがオープン されるたびに実行されます。また、OnInit時のみロットのチェックを行う。OnInitで残高を確認するロジックがわからない。

追記: Alertではバリデータエラーから逃れられない(((((( ;゚Д゚)))))

 
Uladzimir Kirychenka:

これらのチェック(LotMin, LotMax, LotNormalizeStep, check balance, OrderCheck)は、ポジションがオープン される度に実行されます。また、onInitはロットをチェックするだけです。OnInitで残高を確認するロジックがわからない。

追記:バリデータエラーからAlertが保存されない(((((( ;゚Д゚)))))

Validatorにエラーはありません :)

バリデータは、提供されたコードで次のように表示するだけです。

  • あたまごなし
  • エラーハンドリングがない
バリデーターは、いわゆるコードライターがユーザーの立場に立ったことがないことを示しています。

 
Vladimir Karputov:

バリデーターにエラーはありません :)

バリデータは、提供されたコードを表示するだけです。

  • あたまごなし
  • エラーハンドリングがない
バリデータは、いわゆるコードライターがユーザーの立場に立ったことがないことを示すものです。

))