程序库: BestInterval - 页 14

 
gspencer:
我对 Meta 编辑器中的编码或 EA 一无所知,但我非常喜欢您提出的 BestInterval 概念。如果您能指导我如何将其添加到我想测试的 EA 中,会不会太麻烦了?

请试着理解本主题的讨论

Библиотеки: BestInterval
Библиотеки: BestInterval
  • 2018.10.12
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: BestInterval
 
// 在图表上显示 BestInterval 平衡图表

#property strict
#property script_show_inputs

input int inAmountIntervals = 3; // 要放弃多少个最坏情况下的交易区间

#include <Graphics\Graphic.mqh> //https://www.mql5.com/zh/articles/2866

void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

#include <MT4Orders.mqh> // 如果是 MT4,则不需要。
#include <fxsaber\BestInterval\BestInterval.mqh> // 计算最佳交易间隔

void OnStart()
{
  BESTINTERVAL BestInterval; // 创建一个计算最佳交易间隔的对象
  
  BestInterval.Set(); // 发布投标历史
          
  for (int i = 0; i < inAmountIntervals; i++)
    if (BestInterval.DeleteWorseInterval()) // 如果有东西被扔掉了
      Print(BestInterval.ToString());       // 让我们打印出获得的交易数据
    else
      break;                                // 否则,我们就出局了
      
  double Profits[];
  double Balance[];
  
  const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // 获得了 BestInterval-transaction 利润
  Balance[0] = 0;  
  
  // 计算平衡曲线
  for (int i = 1; i < Size; i++)
    Balance[i] = Balance[i - 1] + Profits[i - 1];
    
  ToChart(Balance); // Visualised.
}
 
如果您在标准交货中的任何 EA 末尾插入此内容
// 向终端传送优化器每一轮的报价。应用 BestInterval 并将其可视化。

#include <MT4Orders.mqh>                         //https://www.mql5.com/zh/code/16006
#include <fxsaber\BestInterval\BestInterval.mqh> //https://www.mql5.com/zh/code/22710
#include <TypeToBytes.mqh>                       //https://www.mql5.com/zh/code/16280
#include <Graphics\Graphic.mqh>                  //https://www.mql5.com/zh/articles/2866

input int inAmountIntervals = 1; // 要放弃多少个最坏情况下的交易区间

// 输出图形
void ToChart( const double &Y[] )
{
   CGraphic graphic;
   graphic.Create(0, __FUNCTION__, 0, 30, 30, 780, 380);
   graphic.CurveAdd(Y, CURVE_LINES);
   graphic.CurvePlotAll();
   graphic.Update();   
}

// 收集贸易历史
int GetDeals( DEAL_BASE &Deals[] )
{  
  const int Total = ArrayResize(Deals, OrdersHistoryTotal());
  int Amount = 0; 
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      Deals[Amount].OpenTime = OrderOpenTime();
      Deals[Amount++].Profit = OrderProfit() + OrderCommission() + OrderSwap();
    }
      
  return(ArrayResize(Deals, Amount));    
}

// 从这里(代理),我们将向终端发送数据
double OnTester()
{
  DEAL_BASE Deals[];
  
  if (MQLInfoInteger(MQL_OPTIMIZATION) && GetDeals(Deals)) // 如果优化,则收集交易历史记录
  {    
    CONTAINER<uchar> Container; //https://www.mql5.com/ru/forum/95447/page4#comment_5464205
    
    Container[0] = Deals; // 将投标历史记录放入一个容器中
  
    FrameAdd(NULL, 0, 0, Container.Data); // 从代理向终端发送数据
  }
  
  return(0);
}

// 这里(终端)接收来自代理的数据
void OnTesterPass()
{    
  ulong Pass;
  string Name;
  long ID;
  double Value;

  CONTAINER<uchar> Container; //https://www.mql5.com/ru/forum/95447/page4#comment_5464205

  while (FrameNext(Pass, Name, ID, Value, Container.Data))
  {
    Print("Pass = " + (string)Pass); // 密码
    
    DEAL_BASE Deals[];
   
    // 接收到来自代理的数据
    Container[0].Get(Deals);
          
    BESTINTERVAL BestInterval; // 创建一个计算最佳交易间隔的对象
    
    BestInterval.Set(Deals);   // 发布已传送的投标历史记录

    Print(BestInterval.ToString() + "\n");           // 让我们打印出获得的交易数据
            
    for (int i = 0; i < inAmountIntervals; i++)
      if (BestInterval.DeleteWorseInterval())        // 如果有东西被扔掉了
        Print(BestInterval.ToString() + "\n");       // 让我们打印出获得的交易数据
      else
        break;                                       // 否则,我们就出局了
        
    double Profits[];
    double Balance[];
    
    const int Size = ArrayResize(Balance, BestInterval.GetProfits(Profits) + 1); // 我们获得了 BestInterval 交易利润
    Balance[0] = 0;  
    
    // 计算平衡曲线
    for (int i = 1; i < Size; i++)
      Balance[i] = Balance[i - 1] + Profits[i - 1];
      
    ToChart(Balance); // Visualised.    
  }
}


你会在终端日志中看到如下内容(以标准移动平均线为例)

Pass = 0
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98
SUMMARY: 00:00:00 - 23:59:59 : Profit = -8498.94 (100.00%), Total = 6394 (26.07%), PF = 0.52, Mean = -1.33, DD = 8660.23, RF = -0.98

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 18:00 - 18:00, CountHours = -1
17:40:01 - 17:42:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67
SUMMARY: 00:00:00 - 23:59:59 : Profit = 364.25 (100.00%), Total = 9 (100.00%), PF = Max, Mean = 40.47, DD = 4.63, RF = 78.67

Pass = 1
Amount of Delete Intervals = 0 (2018.10.01 - 2019.02.05)
00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97
SUMMARY: 00:00:00 - 23:59:59 : Profit = -9757.53 (100.00%), Total = 6394 (24.70%), PF = 0.55, Mean = -1.53, DD = 10076.19, RF = -0.97

Amount of Delete Intervals = 1 (2018.10.01 - 2019.02.05), 09:00 - 10:00, CountHours = 0
08:27:01 - 10:14:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14
SUMMARY: 00:00:00 - 23:59:59 : Profit = 628.59 (100.00%), Total = 472 (39.41%), PF = 1.39, Mean = 1.33, DD = 550.93, RF = 1.14


图表上是相应通道的 BestInterval-profit 图


 

我正好路过。我读了它。

说明中写道:"

  • 构思来自作者。可能有相似之处。

"

我在一篇英文博客(第一部分第二部分)中描述了一些更为普遍的方法。只在时间间隔上做横截面是一种高度专业化的方法。在我的想法中,其他参数的横截面也同样有趣。

 
Stanislav Korotky:

我正好路过。我读了它。

说明中写道:"

  • 构思来自作者。可能有相似之处。

"

我在英文博客开仓时,МАшка 等于多少(我们将其写入订单注释)。因此,交易历史中的所有头寸都可以与这些 MA 值进行比较。

然后将 BestInterval 应用于这些 MA。在输出结果中,我们会得到МАшки的范围,哪些仓位应该开仓,哪些仓位不应该开仓。


当然,您也可以使用任何数值函数来代替 MA。因此,您可以找到优于时间的超酷过滤器。

 
fxsaber:

遗憾的是,由于语言障碍,我无法深入了解您的作品。关于对其他过滤器的兴趣,我当然同意

什么时候出现了这种障碍?;-)之前就很清楚了。还是我的英语说错了?

 
Stanislav Korotky:

什么时候出现了这种障碍?;-)以前很清楚的。还是我的英语说得不好?

总是有障碍。有时我直接读源代码。

 
fxsaber:

遗憾的是,由于语言障碍,我无法深入了解您的作品。关于对其他过滤器的兴趣,我当然同意

上帝是你的法官。

 
备忘录
#include <fxsaber\BestInterval\BestInterval.mqh>

void OnStart()
{
  BESTINTERVAL BestInterval;

  // 整个 BestInterval 的对应值
  Print(BestInterval.GetTotal());          // 关闭位置的数量。
  Print(BestInterval.GetTotalPlus());      // 盈利平仓头寸的数量。
  Print(BestInterval.GetTotalMinus());     // 无利可图的平仓数量。
  Print(BestInterval.GetMean());           // 数学期望
  Print(BestInterval.GetProfit());         // 利润
  Print(BestInterval.GetProfitFactor());   // 利润因素
  Print(BestInterval.GetProfitPlus());     // 正交易的利润
  Print(BestInterval.GetProfitMinus());    // 消极交易的损失
  Print(BestInterval.GetRecoveryFactor()); // 恢复系数
  Print(BestInterval.GetMaxDrawDown());    // 最大绝对余额缩减

  Print(BestInterval.GetAmountDeleteIntervals()); // 删除的坏区间数

  INTERVAL Intervals[];

  const int Size = BestInterval.GetIntervals(Intervals); // 获取构成 BestInterval 的时间间隔

  // 对于每个区间,我们都打印了其指数
  for (int i = 0; i < Size; i++)
  {
    Print(Intervals[i].Total);          // 关闭位置的数量。
    Print(Intervals[i].TotalPlus);      // 盈利平仓头寸的数量。
    Print(Intervals[i].TotalMinus);     // 无利可图的平仓数量。
    Print(Intervals[i].Mean);           // 数学期望
    Print(Intervals[i].Profit);         // 利润
    Print(Intervals[i].ProfitFactor);   // 利润因素
    Print(Intervals[i].ProfitPlus);     // 正交易的利润
    Print(Intervals[i].ProfitMinus);    // 消极交易的损失
    Print(Intervals[i].RecoveryFactor); // 恢复系数
    Print(Intervals[i].MaxDrawDown);    // 最大绝对余额缩减

    Print(Intervals[i].OpenTime);       // 打开时间间隔。
    Print(Intervals[i].CloseTime);      // 间隔关闭时间。
  }
}
 
Stanislav Korotky:

仅按时间间隔制作横截面是一种高度专业化的方法。事实上,按其他参数制作横截面也同样有趣。

我想了又想,还是没有想出一种能像时间一样有效过滤的东西。

这种东西不应该是策略的一部分,而应该直接影响市场行为。

堆栈?

还有一个问题 - 制作超立方体是否有意义?