程序库: MT4Orders - 页 81

 

如果启用 #define MT4ORDERS_FASTHISTORY_OFF 指令,则无法编译 - 会产生大量错误。

早些时候,我不得不启用该指令,因为如果不启用该指令,文章中使用的某些功能(在此 讨论)就无法使用。如果功能仍有缩减,最好进行修正。

Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
Библиотеки: MT4Orders - Попробуйте отключить этот медленный режим. Выделенная ссылка отвечает за игнорирование закрытых позиций по CloseBy, а поиск соответствующего выхода
  • 2019.09.27
  • www.mql5.com
что такой простой код не работал корректно в MT5 со старой версией библиотеки. Было бы очень желательно указать как минимум в шапке комменатриев исходника. а поиск соответствующего выхода как раз обложен условной компиляцией на MT4ORDERS
 
Stanislav Korotky #:

如果启用 #define MT4ORDERS_FASTHISTORY_OFF 指令,则无法编译 - 会产生大量错误。

这是我无法消除的历史遗留问题。

MQ 带来了太多令人头疼的问题,只有经过改装的变体才值得使用。

尽管错误报告少得奇怪,但还是应该对程序库进行重大更新。现在还没准备好。

 
OrderSelect(i, SELECT_BY_POS)

在此操作中,低指数上总是有未结头寸,而高指数上总是有挂单

借助这一事实,您可以在一定程度上加快搜索必要的 MT4 订单。

 

我想知道是否有可能在速度上击败测试者,而在速度上是不可能的?

我编写了一个 "没有机会 "的智能交易系统,最大限度地优化了速度。

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

input int inAmountMagics = 50; // 要模拟多少个 TC

// 为每个 TS 开立仓位和订单。MT4 代码简洁明了。
void OnInit()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))  
    for (int i = 0; i < inAmountMagics; i++)
    {
      OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
      
      OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
    }
}

// 从正确的仓位/订单中收集信息。最快速的 MT5 代码。
double CountOrders( const int Type, const int Magic )
{
  double Res = 0;
  
  if (Type <= OP_SELL)
  {
    for (int i = PositionsTotal() - 1; i >= 0; i--)
      if (PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && PositionGetInteger(POSITION_MAGIC) == Magic)
        Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
               PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
  }
  else
    for (int i = OrdersTotal(true) - 1; i >= 0; i--)
      if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) == Type) && OrderGetInteger(ORDER_MAGIC) == Magic)
        Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
               OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
        
  return(Res);
}

// 用于控制替代实现的正确性的编号。
double OnTesterValue = 0;
double OnTester() { return(OnTesterValue); }

void OnTick()
{
  // 模拟所有 TC 的运行。
  for (int i = 0; i < inAmountMagics; i++)
    OnTesterValue += CountOrders(POSITION_TYPE_BUY, i) + 
                     CountOrders(POSITION_TYPE_SELL, i) +
                     CountOrders(ORDER_TYPE_BUY_LIMIT, i) +
                     CountOrders(ORDER_TYPE_SELL_LIMIT, i);  
}

从代码上看,你可以说它写得很慢。但代码模拟了许多 "TS "的工作。许多 "TS "的工作方式完全相同--首先,它们要找到自己的仓位/订单。

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:01:21.775 (including ticks preprocessing 0:00:00.016).
执行时间为 81 秒。对于一天真正的滴答声来说,这是非常重要的。但是有什么呢?
 
fxsaber #:

81 秒完成。对于一天的实际时间来说,这已经是个不小的数字了。但什么是 "多 "呢?

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

图书馆:虚拟

fxsaber, 2023.03.01 20:36

OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:00:46.653 (including ticks preprocessing 0:00:00.016).

校验和匹配。我设法加速了近两倍。

虽然不容易,但还是成功了。

 
fxsaber #:

编写了一个 "没有机会 "的 EA - 最大限度地优化了速度。

加速的简单方法
 

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

库: MT4Orders

fxsaber, 2022.07.20 00:39

// 更改列表:
// 20.07.2022
// 添加:已添加 OrderLotsOpen() - 关闭/删除前的全部仓位/订单量。仅在 ByPass 模式下正常工作。

使用相同的示例(开仓 1 手,逐步平仓 0.1、0.2、0.3 和 0.4 手),但可视化效果不同。


图片顶部红色框中的OrderLotsOpen()
 

您好,

订单票据(OrderTicket)好像有一个错误。

MT5 历史记录中的订单不正确


这是我的代码:

bool isCopyHistory2(string u_symbol, int master_ticket)
  {

   int ticket_copy;

   bool is_exists = false;

// 从交易历史中检索信息

   for(int i = 0; i < OrdersHistoryTotal(); i++)
     {
      //---- 检查选择结果

      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
        {
         Print("Access to history failed with error (", GetLastError(), ")");
         continue;
        }

      // 在顺序方面做了一些工作

      ticket_copy = (int)extract_master_ticket(OrderComment());

      if(ticket_copy == master_ticket)
        {
	//print-for-debug
        Print("c ticket: ", OrderTicket());  // ==> 这不是 MT5 上的正确票据
         is_exists = true;
         break;
        }

     }

//---

   if(!is_exists)

      Print("New Signal #" + (string)master_ticket);

   return(is_exists);

  }

 
Cuong Le Van #:

订单票据() 看起来有一个错误

MT5 历史记录中的订单不正确

显然您想获得它。

// 更改列表:
// 13.03.2019
// 添加:已添加OrderTicketID() - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.

原因详见此处

 
fxsaber #:

显然你想得到它。


原因详见此处

非常感谢。

可以

订单票号()