程序库: MT4Orders - 页 51

 
Igor Makanu:

4 的指令系统简洁明了--它可以让你 "即时 "编写策略,而不必分心去解决指令中的基本操作

如果您愿意,可以在 MT5 订单系统上练习使用订单执行简单操作:


我在 "MT5 初学者的问题 "主题中提出了这个问题,得到的答案是 "为什么需要它?",MT5 订单系统中的解决方案只能由一个人编写 - 这个主题的作者 ;)

如果您在纯粹的 mql5 上是一片空白,那么写什么并没有什么区别,只需在几行代码中为不同的 TS 替换信号即可。

另一个问题是它不是跨平台代码,整个编写过程毫无意义。

 
Vitaly Muzichenko:

另一个问题是,这不是跨平台代码,所有的文字都没有意义。

我看不出跨平台代码有什么意义--编写和支持需要大量时间,但在虚拟交易中执行 TS 并用复制器将其转移到 4 或 5 平台会更容易。

SZY: 离题了,但我还是要写在这里,在我看来,寻找一个在测试器和实际交易中都能以相同方式运行的 TS 是乌托邦,这无法评估 TS 的稳健性,所有在实际交易中为提取利润而进行的进一步升级都将导致无法评估 TS 本身,而如果不评估 TS "未来 "的效率(在对历史数据进行测试后),就不可能做出 TS 不再起作用的决定,因此有必要寻找另一个 TS。

 
Igor Makanu:

SZY: 离题了,但我要在这里写,在我看来,寻找能在测试器中和在真实环境中一样工作的 TS 是乌托邦,这无法评估 TS 的稳健性,在真实 TS 上为提取利润而进行的所有进一步升级都将导致无法评估 TS 本身,如果不评估 TS "未来 "的有效性(在对历史数据进行测试后),就不可能做出 TS 不工作的决定,您需要寻找另一种 TS。

这有什么意义呢......所有 TS 的有效/无效率几乎都是 1 比 1
 
Maxim Dmitrievsky:
这有什么意义......所有 TC 的工作/不工作几乎都是一比一。

不是这样的。

听着,你发明了翻转马丁,选择了加入,进行了前后测试,得到了 MO,夏普比率....- 测试统计

您可以真实运行它,但交易统计结果将与测试结果不同。

高级用户开始升级这只猴子,通常是通过转移到限制,然后特别高级的用户开始在价格后移动限制 - 在后一种情况下,它将是一个不同于测试的 TS(这是另一个 TS!) - 很明显,原则是相同的,得到了一个吸盘 - 从上一个订单的开盘价 加倍和回撤、

但在我看来,这是一个不同的 TS,用户没有在测试器中测试过 - 至少新的 TS 已经与 ticks 和执行延迟挂钩。


这就是我写这篇文章的原因,如果您在正向测试仪中获得了高质量的结果,您就需要在理想条件下监控 TS。

 
Igor Makanu:

错误的

让我看看,你发明了一个翻转马丁,选择加入,做了前后测试,得到 MO、夏普的 k-rate....- 测试统计

你进行了实际操作,但交易统计结果与测试结果会有所不同。

高级用户开始升级这个马汀,通常是将其转移到限价,然后特别高级的用户开始在价格之后移动限价 - 在后一种情况下,它将是一个与测试不同的 TS(这是另一个 TS!) - 很明显,原则是相同的,得到了一个吸盘 - 从上一个订单的开盘价 加倍和回撤、

但在我看来,这是一个不同的 TS,用户没有在测试器中测试过 - 至少新的 TS 已经与刻度线和执行延迟挂钩。


这就是我写这篇文章的原因,如果您在正向测试仪中获得了高质量的结果,您就需要在理想条件下监控 TS。

这只是小事一桩

 
Igor Makanu:

4 的指令系统简洁明了--它可以让你 "即时 "编写策略,而不必分心去解决指令中的基本操作

如果您愿意,可以在 MT5 订单系统上练习使用订单执行简单操作:


我在 "来自 MT5 初学者的问题 "主题中提出了这个问题,得到的答案是 "为什么需要它?",MT5 订单系统中的解决方案只能由一个人编写 - 这个主题的作者 ;)

让终端更接近真实证券交易所的愿望导致了真正的复杂化。订单、交易、头寸都有自己的票据,这导致系统复杂化,不知道哪种方式更好,是简单还是贴近真实市场。
 
Valeriy Yastremskiy:
让终端更接近真实证券交易所的愿望导致了真正的复杂化。订单、交易、仓位都有各自的票据,这使系统变得更加复杂,不知道哪种方式更好,是简单还是更贴近真实市场。

坦率地说,我们不清楚为什么在 4k 中,订单、交易、头寸被一个订单所取代,并且所有订单都有一张票,而在 5k 中,订单、交易、头寸的票是不同的,因为在终端中,它们可以是相同的,如果有必要从交易所获得真正的票,可以额外完成,但在顾问的任务中,一切都会变得更容易。

 
Valeriy Yastremskiy:

老实说,我们并不清楚为什么在 4k 版中,订单、交易、仓位被一个订单所取代,并且所有订单都有一张票,而在 5k 版中,订单、交易、仓位的票是不同的,因为在终端内它们可以是一样的,如果有必要从证券交易所获得真正的票,也可以额外完成,但在顾问的任务中,一切都会变得更容易。

要充分比较 MT4 和 MT5 订单系统,您需要对两者都有深入了解。不仅要从理论/实践上,还要从架构上

在我看来,MT5 订单系统在功能方面远远优于 MT4。而便捷性则是通过高级库实现的。

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.08.27
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
fxsaber:

为了充分比较 MT4 和 MT5 订单系统,您需要对两者都有充分的了解。不仅要从理论/实践上,还要从架构上

在我看来,MT5 订单系统在功能方面远远优于 MT4。而便捷性则是通过高级库实现的。

交易、头寸和订单的属性无疑为获取真实交易数据和管理交易操作提供了更多可能性。但是,交易订单和头寸的票据之间联系的复杂性导致了对当前情况的复杂跟踪、更复杂的订单以及在没有库的情况下正面编码的足够复杂性。总的来说,这并不致命)

 

看看纯粹的 MQL5 如何在简单任务中击败 MT4Orders 广受赞誉的快速交易历史实施性能。

// 脚本计算交易历史中最后一个仓位的开仓/平仓时间。

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

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderType() <= OP_SELL))
    {
      OpenTime = OrderOpenTime();
      CloseTime = OrderCloseTime();
      
      break;
    }
}

//https://www.mql5.com/ru/forum/342090/page18#comment_18040164
void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static ulong PrevTicketIn = 0;  // 存储上次调用的位置输入票。
  static ulong PrevTicketOut = 0; // 存储上次调用的位置退出票。
  
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
      
      if (Ticket == PrevTicketOut)            
      {
        OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        CloseTime = (datetime)HistoryDealGetInteger(PrevTicketOut, DEAL_TIME);        
        
        break;
      }
      else if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        PrevTicketOut = Ticket;
        
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
        {
          PrevTicketIn = HistoryDealGetTicket(0);
          OpenTime = (datetime)HistoryDealGetInteger(PrevTicketIn, DEAL_TIME);
        }
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


结果。

2020.08.29 00:57:38.561 HistoryDealsTotal() = 9435
2020.08.29 00:57:38.813 2046.04.30 00:13:20
2020.08.29 00:57:38.813 Time[Bench(LastTimeMQL4)] = 252274
2020.08.29 00:57:38.820 2046.04.30 00:13:20
2020.08.29 00:57:38.820 Time[Bench(LastTimeMQL5)] = 7162

在这项任务中,纯 MQL5 快了 40 倍。学习 MQL5!