ライブラリ: MT4Orders QuickReport - ページ 4

 
Forester #:

MQテスターは、削除された指値注文を遅延を伴ってアーカイブに転送することが判明した:

再現のためのデータを提供してください。
 
Forester #:

ハイチャートに変えた。google.chartsは70万件の取引でフリーズしたが、highchartは特別なブレーキなしに表示され、個々の取引にズームインできた。

現在の実装では、highchartsは オンラインである必要があるということでよろしいでしょうか?
 
fxsaber #:
再現のためのデータをご提供ください。
 // defineVIRTUAL_TESTERの代わりにSelectByIndex()で仮想テスターを接続する。
 
 #include <MT4Orders.mqh>

#define  REPORT_TESTER             // テスターは自動的にレポートを記録します。
//#define  REPORT_BROWSER            // ブラウザ起動時にレポートを作成 - DLL許可が必要です。
#include <MT4Orders_QuickReport.mqh>//

input int inAmount = 10;
input int inOffset = 5;
input int inRange = 0;

bool OrdersBuy[];
bool OrdersSell[];
bool OrdersBuyStop[];
bool OrdersSellStop[];

void OnInit()
{
  ArrayResize(OrdersBuy, inAmount + 1);
  ArrayResize(OrdersSell, inAmount + 1);
  ArrayResize(OrdersBuyStop, inAmount + 1);
  ArrayResize(OrdersSellStop, inAmount + 1);
}

void OnTick()
{

   strategy ();

}

double OnTester() { 
QuickReport("report_0", true, 0);
   return(AccountInfoDouble(ACCOUNT_BALANCE)); 
}

void OnDeinit(const int  reason ){
   Print("OnDeinit main");

}


int TimeHour     ( datetime time ){return((int)((time / 3600) % 24));}//日中の現在時刻。毎時3600秒

void strategy (){
  string Symb = _Symbol;
  MqlTick Tick;
  
  if (SymbolInfoTick(Symb, Tick))
  {    
    double sl, tp, point = SymbolInfoDouble(Symb, SYMBOL_POINT);
    const double Offset = inOffset * point;

    ArrayInitialize(OrdersBuy, false);
    ArrayInitialize(OrdersSell, false);
    ArrayInitialize(OrdersBuyStop, false);
    ArrayInitialize(OrdersSellStop, false);

    for (uint i = OrdersTotal(); (bool)i--;)
      if (OrderSelect(i, SELECT_BY_POS))         
      {
        ulong Magic = OrderMagicNumber();
        if(Magic > 0 && Magic < 100 ){
           switch (OrderType())
           {
             case OP_BUY:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.bid + Magic * Offset, 0);
               OrdersBuy[Magic] = true;
               
               break;
             case OP_SELL:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.ask - Magic * Offset, 0);
               OrdersSell[Magic] = true;
               
               break;
             case OP_BUYLIMIT:
               OrderModify(OrderTicket(), Tick.ask - Magic * Offset, 0, 0, 0);
               OrdersBuy[Magic] = true;
               
               break;
             case OP_SELLLIMIT:          
               OrderModify(OrderTicket(), Tick.bid + Magic * Offset, 0, 0, 0);
               OrdersSell[Magic] = true;
               
               break;
           }
         }
         
        if(Magic > 100 && Magic < 200 ){
           Magic = Magic - 100;
           switch (OrderType())
           { 
             case OP_BUY:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.bid + Magic * Offset, 0);
               OrdersBuyStop[Magic] = true;
               
               break;
             case OP_SELL:
               OrderModify(OrderTicket(), OrderOpenPrice(), 0, Tick.ask - Magic * Offset, 0);
               OrdersSellStop[Magic] = true;
               
               break;
             case OP_BUYSTOP:
               OrderModify(OrderTicket(), Tick.ask + Magic * Offset, 0, 0, 0);
               OrdersBuyStop[Magic] = true;
               
               break;
             case OP_SELLSTOP:          
               OrderModify(OrderTicket(), Tick.bid - Magic * Offset, 0, 0, 0);
               OrdersSellStop[Magic] = true;
               
               break;
           }
           
         }
         if(Magic == 1001 ){//完全閉鎖のチェック
           OrderClose(OrderTicket(), OrderLots(), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//完全閉鎖を確認 - うまくいった
         }
         
         //異なるティックで部分的なクローズをチェックする
         if(Magic == 1002 ){
           double Lots = OrderLots();
           if(Lots==10){//プライマリー・ロット-クローズ25
               double LotsDel1=NormalizeDouble(Lots/4, 2);// 元のロットの25%を閉じる
               OrderClose(OrderTicket(), LotsDel1, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;// 部分閉鎖をチェックする
           }else{ // 次のティックで残高を閉じる
              OrderClose(OrderTicket(), Lots, (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//完全閉鎖のチェック
           }
         }
            
         // 同じティックで OrderClose() の部分決済をチェックする。仮想テスターでは動作しません - 1/2ロットで多くの注文を保存します。 
         //最初の OrderSend の後、新しいチケットが作成され、古いチケットは 2 番目の OrderSend では見つからないため、結果として 3 番目のチケットが作成されます。
         if(Magic == 1003 ){
           double Lots = OrderLots();
           double LotsDel1=NormalizeDouble(Lots/3, 2);// 元のロットの33%をクローズ
           OrderClose(OrderTicket(), LotsDel1,                         (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;// 部分閉鎖をチェックする
           OrderClose(OrderTicket(), NormalizeDouble(Lots-LotsDel1,2), (OrderType()==OP_BUY ? Tick.bid : Tick.ask), 0 ) ;//同じティックで残高の全閉をチェックする。
         }
         
         if(Magic == 1004 ){
           //OrderCloseBy(); //チェックする
         }
         if(Magic == 1005 ){
            OrderDelete(OrderTicket());
         }

      }
     
    if(TimeHour(TimeCurrent())<23 && TimeHour(TimeCurrent())>0 ){return;} // 0から1、23から0への演算を行う
 
    for (int i = 1; i <= inAmount; i++)
    {
      if (!OrdersBuy[i])
        OrderSend(Symb, OP_BUYLIMIT, 10, Tick.ask - i * Offset, 0, 0, 0, NULL, i);

      if (!OrdersSell[i])
        OrderSend(Symb, OP_SELLLIMIT, 10, Tick.bid + i * Offset, 0, 0, 0, NULL, i);
      // 
      if (!OrdersBuyStop[i])
        OrderSend(Symb, OP_BUYSTOP, 10, Tick.ask + i * Offset, 0, 0, 0, NULL, i+100);

      if (!OrdersSellStop[i])
        OrderSend(Symb, OP_SELLSTOP, 10, Tick.bid - i * Offset, 0, 0, 0, NULL, i+100);
      
    }  
//TP=SL=建値の指値注文をチェックする。
    OrderSend(Symb, OP_BUYLIMIT, 11,  Tick.ask -  Offset, 0,Tick.ask -  Offset, Tick.ask -  Offset, NULL, 1100);
    OrderSend(Symb, OP_SELLLIMIT, 11, Tick.bid +  Offset, 0,Tick.bid +  Offset, Tick.bid +  Offset, NULL, 1100);

// 指値注文の終了をチェック OrderDelete()
    OrderSend(Symb, OP_BUYLIMIT, 12,  Tick.ask -  Offset, 0,Tick.ask -  Offset, Tick.ask -  Offset, NULL, 1005);
    OrderSend(Symb, OP_SELLLIMIT, 12, Tick.bid +  Offset, 0,Tick.bid +  Offset, Tick.bid +  Offset, NULL, 1005);
      

//TP/SL=オフセットの一般的な注文は変更されず、TP/SLによってトリガーされる。
    sl=Tick.bid-Offset; tp=Tick.ask+Offset;
    OrderSend(Symb, OP_BUY,  0.01, Tick.ask, 0, sl, tp,  NULL, 1000);//
    sl=Tick.ask+Offset; tp=Tick.bid-Offset;
    OrderSend(Symb, OP_SELL, 0.1, Tick.bid, 0, sl, tp,  NULL, 1000);//

//проверка ТП/СЛ на границе спреда. В виртуальном тестере - ок. У тестера MQ бывают сбои на 1-х сделках теста https://www.mql5.com/ru/forum/455977/page36#comment_51246904&nbsp;&nbsp; и   https://www.mql5.com/ru/forum/455977/page36#comment_51248196
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, Tick.bid, Tick.bid,  NULL, 1000);スプレッド境界での//TP/SL 
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, Tick.ask, Tick.ask,  NULL, 1000);スプレッド境界での//TP/SL 
  
//OrderClose() が完全に終了したかどうかをチェックする。
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, 0, 0,  NULL, 1001);
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, 0, 0,  NULL, 1001);


    // 部分クロージャをチェック OrderClose() 
    sl=Tick.bid-Offset; tp=Tick.ask+Offset;
    OrderSend(Symb, OP_BUY,  10, Tick.ask, 0, 0, 0,  NULL, 1002);
    sl=Tick.ask+Offset; tp=Tick.bid-Offset;
    OrderSend(Symb, OP_SELL, 10, Tick.bid, 0, 0, 0,  NULL, 1002);// 

  }
}

Server: MetaQuotes-Demo Hedge

2ページ目のチケット99を扱う。

 

Этот отчет показал Firefox. Chrome зависает, ему нужны файлы поменьше.

540万行以上をファイルにアップロードできますが、Firefoxブラウザはそれ以上処理できません。

このレポートを読み込む際、ブラウザは約6GBのメモリを使用した(処理時間は約1分)。

他のブラウザではどうなのだろう。

取引、自動取引システム、取引戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber, 2023.10.18 15:00

大きなhtmlテーブルを開いたときの最速ブラウザの評価 - steutments.35K行のテーブルの要約結果。

ブラウザ 長さ時間 (秒)
マイパル 24
バジリスク 35
ペイルムーン 50
Kメレオン 52
トリウム 55

私が選ぶのはマイパル

 
fxsaber #:
現在の実装では、ハイチャートを 動作させるためにはオンラインである必要があるという理解でよろしいでしょうか?

JSファイルが先にダウンロードされた場合、キャッシュから取得されます。
1ヶ月間保存:1月8日ダウンロード、2月8日削除


私はすぐに彼らのコードをファイルに追加したかったのですが、何千もの引用符があり、自動的に""に変更されました。しかし、エラーがポップアップ表示されます。それはすぐに動作しませんでした。
 
Forester #:

私は彼らのコードを素早くファイルに追加したかったのですが、何千もの引用符があるので、私は自動的にそれを""に変更しました。でもエラーが出てしまう。私はすぐにそれを行うことができませんでした。

クイックバージョン。

Scripts: Balance Graph HTML - How to generate various variants of the Balance Graph.
Scripts: Balance Graph HTML - How to generate various variants of the Balance Graph.
  • 2019.04.09
  • www.mql5.com
But has no possibility of further modification. For example, if you need to get graphs of profits, commissions, turnover, etc. Where can i generate various variants of the graph. I pasted your html code into my library
 

QuickReportが一番上、Reportが一番下。2つ目のレポートは、トリガーされたレベルのみをカラーハイライトします。これにより、SLまたはTPがトリガーされたことが理解できます。私はこれをQuickReportに追加します。

 
fxsaber #:

QuickReportが一番上、Reportが一番下。2つ目のレポートは、トリガーされたレベルのみをカラーハイライトします。これにより、SLまたはTPがトリガーされたことが理解できます。私はこれをQuickReportに追加します。

TPもSLも同じ価格に設定されているので、両方ともハイライトされます。このようなケースはまれですが(極端な状態でのテストのみ)、正確さを期すために、このような場合でも検出してハイライトするコードを追加しました。

Forester#:
私は彼らのコードを素早くファイルに追加したかったのですが、何千もの引用符があるので、私はそれを自動的に""に変更しました。しかし、エラーがポップアップ表示されます。それはすぐに動作しませんでした。

ライセンスが必要なので、コードをファイルに追加することに変更しました。Read more herehttps://shop.highcharts.com/
デフォルトでgoogle.chartsを 設定した。もし誰かがHighchartsを 必要とし、それを使う権利を持っているなら、彼らはそれを通して含めることができる:

// デフォルトでは、MT4Orders_QuickReportは無料のgoogle.chartsを使用しますが、権限があればhighchartsを使用することもできます。
// #define USE_highcharts // すべてのHighcharts製品を無料でダウンロードして試すことができます。あなたのプロジェクトや製品が準備できたら、商用ライセンスを購入してください。https://shop.highcharts.com/
 
Forester #:

TPもSLも同じ価格に設定されているため、ハイライトされた。このようなケースは稀(極端な状態のテストのみ)ですが、精度を上げるために、検出とハイライトのコードを追加しました。

MQ Testerとのもう一つの違いを明らかにした興味深いケース。


これがバーチャル。


そしてこれがMQ-Testerだ。

バーチャルはSLで両方のポジションをクローズし、MQはSLで両方のポジションをクローズしました。バーチャルは特別にSLクローズを優先しました。MQは不明。

 
fxsaber #:

MQテスターとのもうひとつの違いが浮き彫りになった興味深いケースだ。

これはバーチャルである。

そしてこちらがMQテスター。

バーチャルは両方のポジションをSLでクローズし、MQは違う方法でクローズした。SLクローズの優先順位はバーチャルに特別に規定されていた。MQは不明。

ええ、私もそれに気づきました。たぶん、MQは売りと買いの方向によって、どちらが先に動くかが決まるのだろう。