mql5语言的特点、微妙之处以及技巧 - 页 173

 
fxsaber:

以上更新。

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

mql5的特殊性,技巧和窍门

fxsaber, 2020.04.09 13:13

看起来你根本就没有遇到过这种情况。请看一下文件。每个订单有两卷。

这些是活的限制器。第一个数字是原始体积,第二个数字是倒出的体积。一旦他们变得平等或被删除,它就会进入历史。


这不是一个命令分两部分执行吗?看起来很奇怪,未执行的卷是一样的。

 
Alexey Viktorov:

这不是一个命令分两部分执行吗?似乎很奇怪,未执行的卷是一样的。

一个巧合。他们甚至有不同的弹夹。

 
fxsaber:

在秩序模式中,当它是活的时,不可能有秩序。死了之后--会有一个第一次执行的时间,正如最初所说的那样。


在历史上发现。

 
fxsaber:

当你通过CloseBy倒闭时,似乎失去了主要的东西。需要去看看。

这似乎是下面第一个代码不能工作的原因。

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

MQL5中的历史利润?

fxsaber, 2017.08.26 19:16

  1. MQL5
    double Profit( void )
    {
     double Res = 0;
    
     if (HistorySelect(0, INT_MAX))
       for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
       {
         const ulong Ticket = HistoryDealGetTicket(i);
         
         if((HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) && (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symbol()))
           Res += HistoryDealGetDouble(Ticket, DEAL_PROFIT);
       }
         
      return(Res);
    }


  2. MQL5 + MQL4
    #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
    
    double Profit( void )
    {
     double Res = 0;
    
     for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
       if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderMagicNumber() == MagicNumber) && (OrderSymbol() == Symbol()))
         Res += OrderProfit();
         
      return(Res);
    }

计算魔术中的利润似乎是一个问题。

 
订单价格是正常化的,交易则不是。脚本找到了这样的交易。
void OnStart()
{
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--) // Перебираем все сделки
    {
      const ulong Ticket = HistoryDealGetTicket(i); // Тикет сделки
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE); // Цена сделки
      
      if (NormalizeDouble(Price, 5) != Price) // Если цена сделки не нормализована,      
        Print(Ticket);                        // печатаем тикет сделки.
    }
}
 

MT5实时自动放置的开仓/平仓的箭头是基于TradeTransaction-events的。


刚才我看到,这些事件(开仓和平仓约十几个)没有到达终端,因为一时的连接失败--这太巧了,我坐在电脑前,用眼睛看着它们。因此,没有相应的箭头。


而且,正如有时在这里所说的,你不能在战斗的EA中依赖OnTradeTransaction。很遗憾,没有可靠的公共机制来处理OrderSendAsync。

 
fxsaber:

太糟糕了,没有可靠的公共机制来处理OrderSendAsync。

服务部门能否进入这些行业?- 如果是这样,那么就可以每10毫秒监测一次,并将事件发送到图表中。

我看了一下帮助,我想也许我得到了服务的补充,但我认为去年是这样的。

-它是一个程序,与指标、专家顾问和脚本相比,不需要与图表绑定。与脚本类似,服务不处理任何事件,除了启动事件。为了启动一个服务,其代码必须包含OnStart处理函数。服务不接受除 "开始 "之外的任何其他事件,但它们可以使用EventChartCustom向图表本身发送自定义事件。

UPD: 我写了一个服务脚本。

struct SOrderInfo
{
   int positionstotal;
   int orderstotal;
   int historyorderstotal;
   bool operator==(const SOrderInfo &v){return(positionstotal==v.positionstotal && orderstotal==v.orderstotal && historyorderstotal==v.historyorderstotal);}
};
//+------------------------------------------------------------------+
int OnStart()
{
   SOrderInfo CurrState = UpdateOrdersInfo();
   SOrderInfo LastState = CurrState;
   while(!IsStopped())
   {
      Sleep(10);
      CurrState = UpdateOrdersInfo();
      if(CurrState == LastState) continue;
      LastState = CurrState;
      Print("Orders changed!");
   }
   return(0);
}
//+------------------------------------------------------------------+
SOrderInfo UpdateOrdersInfo()
{
   SOrderInfo result;
   result.positionstotal     = PositionsTotal();
   result.orderstotal        = OrdersTotal();
   result.historyorderstotal = HistoryOrdersTotal();
   return(result);
}
//+------------------------------------------------------------------+

我开了几个订单,并手动关闭它们。

 
Igor Makanu:

服务部门能否进入这些行业?- 如果是这样,可以每10ms监测一次,并向图表发送一个事件。

这与索夫特尼克的同样超限没有区别。只不过,仅仅比较数量是不够的,内部可能会发生变化。

 
Andrey Khatimlianskii:

这与《Owletnik》中同样的矫枉过正没有区别。只不过,仅仅比较数量是不够的,内部结构也会发生变化。

像Alerters这样的服务是非常好的。你不需要图表,它们会随终端自动启动。你只需要解决在不同账户之间转换的情况。

该服务也可以是一个战斗顾问。如果没有GUI,它就不是很方便。
 
Andrey Khatimlianskii:

这与《Owletnik》中同样的矫枉过正没有区别。只不过,仅仅比较数量是不够的,内部结构也会发生变化。

是不同的。

有所谓的控制和管理任务

EA - 管理,服务 - 控制

控制不能是多余的--你会占用系统的所有资源,得到一个不稳定的系统而不是控制。

你必须定义事件的关键性,我认为,关闭和打开订单 - 这些都是需要控制的关键事件,而TP和SL的变化可以像以前一样进行(几次失败的尝试 - 让它去,在下一个tick我们将再次尝试)。

和你建议的方式--控制一切是可能的--你可以在SQLite中重复订单的状态,然后会有一个数据库与服务和EA....的同步问题。这一切都没有必要


我认为方案应该更简单--它应该如下:从EA的终端获取OnTradeTransaction 事件,并从服务中生成OnChartEvent事件,以便在EA中进行额外控制。