程序库: Report - 页 6

 
 

你好!

我从交易中生成了一些信息。我还在编写缩减代码,目前处于测试阶段:)

附加的文件:
 
Arthur Albano:

你好!

我从交易中生成了一些信息。我还在编写缩水代码,目前处于测试阶段:)

交易结果。这些结果在模拟账户 上好吗?

交易结果
 
增加了按关闭时间排序的 功能。
 
跨平台替代平衡图

关于交易、自动交易系统和测试交易策略的论坛

脚本:HTML 平衡图

fxsaber, 2019.04.08 09:16

适用于 MT4/5。
// MQL4&5 代码

#property strict

// 将 "Graph.txt "复制到 "Files\Graph.txt"。
//https://www.mql5.com/en/code/25199
// #resource "\Scripts\Graph_HTML\Resource\Graph.txt" as string htm_file

#import "shell32.dll"
  int ShellExecuteW( int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd );
#import

#ifdef __MQL5__
  #include <MT4Orders.mqh> //https://www.mql5.com/en/code/16006

  #define  BASEPATH (TerminalInfoString(TERMINAL_PATH) + "\\MQL5\\Files\\")
#else // __MQL5__
  #define  BASEPATH (TerminalInfoString(TERMINAL_PATH) + "\\MQL4\\Files\\")
#endif // __MQL5__

bool CreateBalanceData( const string FileName = "exdat.txt" )
{
  const int handle = FileOpen(FileName, FILE_WRITE | FILE_TXT | FILE_ANSI);
  const bool Res = (handle != INVALID_HANDLE);

  if (Res)
  {
  // https://www.mql5.com/ru/forum/170953/page14#comment_10550116
  #define  CLOSETIME_INDEX 0
  #define  TICKET_INDEX 1
    long Tickets[][2];
    int Total = OrdersHistoryTotal();    

  #ifdef __MQL5__
    static const bool Sort = false;
  #else // __MQL5__
    #ifdef __VIRTUAL__
      static const bool IsTester = ::MQLInfoInteger(MQL_TESTER);

      const bool Sort = !IsTester && !VIRTUAL::GetHandle();
    #else // __VIRTUAL__
      static const bool Sort = !::MQLInfoInteger(MQL_TESTER);
    #endif // __VIRTUAL__

    if (Sort)
    {
      int Amount = 0;

      for (int i = (::ArrayResize(Tickets, Total) >> 1) - 1; i >= 0; i--) // https://www.mql5.com/ru/forum/170953/page16#comment_10604064
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
        {
          Tickets[Amount][CLOSETIME_INDEX] = OrderCloseTime();
          Tickets[Amount++][TICKET_INDEX] = OrderTicket();
        }

      if ((bool)(Total = ::ArrayResize(Tickets, Amount) >> 1)) // https://www.mql5.com/ru/forum/170953/page16#comment_10604064
        ::ArraySort(Tickets);
    }
  #endif // __MQL5__
    
    double Balance = 0;

    FileWriteString(handle, "var dat1=[\n");

    for (int i = 0; i < Total; i++)
      if ((Sort ? OrderSelect((int)Tickets[i][TICKET_INDEX], SELECT_BY_TICKET) : (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))) && // int - (Sort == true) 仅适用于 MQL4。
          ((OrderType() <= OP_SELL) || (OrderType() > OP_SELLSTOP)))
    #undef  TICKET_INDEX
    #undef  CLOSETIME_INDEX
      {
        Balance += OrderProfit() + OrderCommission() + OrderSwap();

        FileWriteString(handle, "[" + (string)((long)OrderCloseTime() * 1000) + "," + DoubleToString(Balance, 2) + "],\n");
      }

    FileWriteString(handle, "];\n");
    FileWriteString(handle, "var T1=dat1[0][0];\n");
    FileWriteString(handle, "var T2=dat1[dat1.length-1][0];\n");
    FileWriteString(handle, "var nTrades=dat1.length;\n");
    FileWriteString(handle, "var Balance=" + DoubleToString(Balance, 2) + ";\n");
    FileWriteString(handle, "var Currency=\"" + AccountInfoString(ACCOUNT_CURRENCY) + "\";\n");

    FileClose(handle);
  }

  return(Res);
}

string GetHTM( const string FileName = "Graph.txt" )
{
  uchar Data[];

  const int handle = FileOpen(FileName, FILE_READ | FILE_BIN);
  const bool Res = (handle != INVALID_HANDLE);

  if (Res)
  {
    FileReadArray(handle, Data);

    FileClose(handle);
  }

  return(Res ? CharArrayToString(Data) : NULL);
}

//+------------------------------------------------------------------+
//| 创建 .html 格式的 "HighCharts "交易余额报告。
//+------------------------------------------------------------------+
void CreateHighChartsBalanceReport( const string FileName = "Graph.htm" )
{
  const int handle = FileOpen(FileName, FILE_WRITE | FILE_TXT | FILE_ANSI);

  if (handle != INVALID_HANDLE)
  {
// FileWriteString(handle, htm_file);
    FileWriteString(handle, GetHTM());
    FileClose(handle);

    if (CreateBalanceData())
      ShellExecuteW(0, "Open", BASEPATH + FileName, NULL, NULL, 3);
  }
}

void OnStart()
{
  CreateHighChartsBalanceReport();
}



不同于报告--交互式图表,包含各种构思

Balance Graph HTML
Balance Graph HTML
  • www.mql5.com
Pan PrizMA Sin leverage 72 Builds a sliding line with a polynomial of 4 degrees. Extrapolates as a section of a given function with a sinusoid and its axial one. One value is taken from the constructed lines on each bar and a line of extrapolated values is plotted...
 

出色的工具。但是,在运行正向测试时,它只能保存反向测试报告 和余额。

有什么建议能让它也保存正向测试吗?


F

 
新增功能。应用于标准智能交易系统的示例。
#define  REPORT_TESTER             // 测试仪将自动记录报告
#define  REPORT_TESTER_INPUTS      // 一次通过报告将显示 EA 输入参数 - 需要 DLL 解析。
#define  REPORT_INTERACTIVE_CHARTS // 在报告中添加交互式图表。
#define  REPORT_BROWSER            // 在浏览器启动时创建报告 - 需要 DLL 许可。
#include <Report.mqh> //https://www.mql5.com/zh/code/18801

#include <..\Experts\Examples\Moving Average\Moving Average.mq5>


预告片中是单次启动的结果。现在,您可以看到 Expert Advisor 的输入参数和交互式平衡图。


ZYCustomReport 脚本 已更新。在您的账户上尝试非静态交易报告。工作示例

附加的文件:
Reports.zip  138 kb
 

最后,单通道变得成熟 - 所有图表都出现在报告中。

在 MT4 中,报告还为所有经纪商添加了执行 TP/SL 时的滑点数据。为此,您需要更新库。

 

单程报告中增加了测试仪设置。


 

意想不到的是,尽管一直在使用 MT5-Tester,我却完全不再看 Backtest 和 Chart 标签。

当我需要更快地计算或设置订单执行 条件、佣金大小时,我都是通过虚拟来完成的。

最方便的是,你根本不需要了解虚拟或报告。我只需在开头写上同样的几行,MT5-Tester 就会发生变化。