エラー、バグ、質問 - ページ 1989

 

テスターの性能は、トレードサーバーに大きく依存します。


テスターの設定。

Netting USD、Core1のみ有効


エキスパートアドバイザー

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int Interval = 60;
input int AmountLastDeals = 5;
input double Lots = 1;

double CorrectLot( const double Lot )
{
  static const double StepVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
  static const double MaxVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
  static const double MinVol = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);

  const double Vol = StepVol * (int)(Lot / StepVol + 0.5);

  return((Vol < MinVol) ? MinVol : ((Vol > MaxVol) ? MaxVol : Vol));
}
  
void OnTick()
{  
  if (!PositionGetTicket(0))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      double SumProfit = 0;
      double SumLots = 0;

      for (int i = Total, Count = 0; (i >= 0) && (Count < AmountLastDeals); i--)
      {
        const ulong Ticket = HistoryDealGetTicket(i);

        if ((ENUM_DEAL_ENTRY)HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
        {
          SumProfit += HistoryDealGetDouble(Ticket, DEAL_PROFIT) * (AmountLastDeals - Count);
          SumLots += HistoryDealGetDouble(Ticket, DEAL_VOLUME) * (AmountLastDeals - Count);

          Count++;
        }
      }

      SumLots /= (AmountLastDeals * (1 + AmountLastDeals)) >> 1;

      MqlTradeRequest Request = {0};

      Request.action = TRADE_ACTION_DEAL;

      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;

      Request.volume = (SumProfit >= 0) ? Lots : CorrectLot(SumLots);
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

//      MqlTradeCheckResult CheckResult;
//      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);
      }
    }
  }
  else if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)
  {
    MqlTradeRequest Request = {0};
    MqlTradeResult Result;

    Request.action = TRADE_ACTION_DEAL;
    Request.position = PositionGetInteger(POSITION_TICKET);

    Request.symbol = PositionGetString(POSITION_SYMBOL);
    Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));

    Request.volume = PositionGetDouble(POSITION_VOLUME);
    Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);

    const bool AntiWarning = OrderSend(Request, Result);
  }
}


FIBOGroup-MT5 サーバーでの 実行結果

------
OnTesterInit
i = 0 Pass = 0 OnTester = 7.994 s.: Count = 15925124, 1992134.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 1 Pass = 1 OnTester = 7.831 s.: Count = 15925124, 2033600.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 2 Pass = 2 OnTester = 7.811 s.: Count = 15925124, 2038807.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 3 Pass = 3 OnTester = 7.825 s.: Count = 15925124, 2035159.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 4 Pass = 4 OnTester = 7.831 s.: Count = 15925124, 2033600.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 5 Pass = 5 OnTester = 7.832 s.: Count = 15925124, 2033340.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
iMin = 2 Results[iMin] = 7.811 s.
iMax = 0 Results[iMax] = 7.994 s.
Amount = 6 Mean = 7.854 s. - 90.11%
OnTesterDeinit
------
Interval = 52.296 s., Count = 0, 0.0 unit/sec


MetaQuotes-Demoでの 結果

OnTesterInit
i = 0 Pass = 0 OnTester = 1.497 s.: Count = 2456073, 1640663.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 1 Pass = 1 OnTester = 1.494 s.: Count = 2456073, 1643957.8 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 2 Pass = 2 OnTester = 1.496 s.: Count = 2456073, 1641760.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 3 Pass = 3 OnTester = 1.493 s.: Count = 2456073, 1645058.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 4 Pass = 4 OnTester = 1.499 s.: Count = 2456073, 1638474.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
i = 5 Pass = 5 OnTester = 1.498 s.: Count = 2456073, 1639568.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1653
iMin = 3 Results[iMin] = 1.493 s.
iMax = 4 Results[iMax] = 1.499 s.
Amount = 6 Mean = 1.496 s. - 49.11%
OnTesterDeinit
------
Interval = 18.279 s., Count = 0, 0.0 unit/sec


FIBOGroup-MT5 Serverの総ティック数は15925124、テスターの性能は2038807.3 units/secです。MetaQuotes-Demoは 2456073ティック、テスター性能1645058.9 unit/secです。つまり、2台目のサーバーでは、テスターの性能が20%低下しているのです。しかし、テスターはトレードサーバーに依存してはいけないのです!

問題なく再現可能です。

 
Alexey Kozitsyn:
役に立たなかった:)よし、推測する必要はない、SDからの回答が必要だ。そんな松葉杖は、とにかく許されてはならないのです

不思議ですね。投稿前に10分ほど突いているので、チャート期間を 切り替えたり、インジケーターのパラメーターをtrueからfalseに変えたりして、定期的にキープポキングしています。問題ないと思います。もちろん松葉杖です、だから一時的な解決策と言ったのです。

 
Alexey Kozitsyn:
うまくいかなかった:)OK、なぜ推測するのか、SDから回答を得る必要がある。そんな松葉杖は、どうせ通用しないはずだ!

特に問題なく動作しています。もちろん、出力バッファを先に定義し、次にカラーバッファを 定義することは理にかなっています。

削除済み  
Vitaly Muzichenko:

特に問題なく動作しています。もちろん、出力バッファを先に定義し、次にカラーバッファを定義することは理にかなっています。


Vitaly まずは問題の真相究明をお願いします。設定がオンになっているときは、すべて正常に動作します。設定を無効にすると問題が発生します。
削除済み  
Alexey Viktorov:
あなたのバージョンの方が安定しているし、(TFを切り替えなければ)ほとんど正常に動作するくらいです。でも、切り替えても切り替えても......。また散々な目に遭いました。
 
fxsaber:
(string)NormalizeDouble(0.99872, 5) - 非常に長い結果です。

エラーなし、10進数表記では正確にdoubleで表現できない数値もある

以下のコードでは正常な結果が得られる
DoubleToString(0.99872, 5)

 
Evgeny Chernyshev:

エラーなし、10進数表記では正確に2進数で表せない数値もある

次のコードでは、正常な結果が得られます。
DoubleToString(0.99872, 5)

了解です、ありがとうございます

 
Alexey Kozitsyn:
Vitaly まず問題の真相究明をお願いします。設定がオンになっているときは、すべて正常に動作します。設定をOFFにすると不具合が発生します。

アレクセイ、申し訳ありません、もう一つ訂正を忘れていました。

   //if(inpUseArrows) // Если отображать нужно
   //  {
      SetPlotParametersArrow(0,0,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
      SetPlotParametersArrow(1,1,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
   //  }

その記事でも赤でマークして修正しました。

削除済み  
Alexey Viktorov:

Alexeiさん、すみません、また訂正を見逃していました。

その記事でも、赤でマーキングしたものを修正。

そこが肝心なんです!オフにしただけで、すべてのグラフシリーズの下のすべての配列が使われていることがわかります。しかし、ポイントはまさに、必要に応じてグラフの系列の一部を無効にする機能をユーザーに提供することです。そして、必要であれば、スイッチを入れてください。

 
Alexey Kozitsyn:

そういうことなんです!だから、それをオフにするだけで、すべてのグラフシリーズのすべての配列が使用されます。しかし、ポイントはまさに、必要に応じてグラフシリーズの一部を無効化するオプションをユーザーに提供することです。そして、必要に応じて、スイッチを入れてください。

まあ、グラフの系列数はコードの最初に定義されているので、TFを切り替えても変わらないんですけどね。

mql5で無敵とは恐れ入りました。

しかし、もう一つ、データウィンドウ のグラフ系列の表示を除外するためのトリックがあります

PlotIndexSetString(plotIndex, PLOT_LABEL, NULL);

mql4で動作します。mql5ではどうなのか、まだテストしていないので確認しなければなりません。

いや...mql5では動作しません。mql5で動作します。

      PlotIndexSetInteger(0, PLOT_SHOW_DATA, true);
      PlotIndexSetInteger(1, PLOT_SHOW_DATA, true);
   if(!inpUseArrows) // Если отображать не нужно
     {
      PlotIndexSetInteger(0, PLOT_SHOW_DATA, false);
      PlotIndexSetInteger(1, PLOT_SHOW_DATA, false);
     }