文章 "轻松快捷开发 MetaTrader 程序的函数库(第八部分):订单和持仓修改事件" - 页 3

 
leonerd:

当收到一个 tick 时,挂单 被设置并同时激活(触发)(我用 Buy Stop 测试过),您的引擎不会记录所有事件...

收到 TRADE_EVENT_PENDING_ORDER_PLASED 事件,但没有收到 TRADE_EVENT_PENDING_ORDER_ACTIVATED。

我的代码如下

我首先在循环中找到旧(已处理)事件的索引,然后从该索引开始,循环处理所有新事件,直到结束。因此,如果在一个跳动点上设置了限价订单,而 striggeren 收到了一个关于设置的事件,那么......请发表评论。

我在 engine.OnTick(rates_data) 之后的 OnTick() 中调用了 ProcessTradeEvents()。

订单是由您的引擎下达的。也许我在没有激活时仍然调用了它.....。我现在用手动下单检查一下。

 
leonerd:

订单是你自己的引擎下的。也许在没有激活的情况下,我还是调用了它.....。我现在用手动订单来检查。

是的,我想是我的手歪了....。

 
leonerd:

是啊,我觉得我的手歪了...

不,是在图书馆更准确地说,不是库里的问题,而是终端记录订单历史的 特殊性。在后来的程序库版本中,这一特性被考虑在内,一切都能被正确跟踪。试试 30 号左右的版本--在关于指标的话题之前。我现在不记得在哪里解决了这个问题。不过,我在后来的文章中写到过 - 那里有更正。
 

您好。

我在测试 TestDoEasyPart08.mq5 时遇到了这个问题 - 止损和止盈不起作用。虽然它们被设置了,但相应的线出现在图表上,日志也有消息。如果打开 TrailStop,TakeProfit 会触发,但 StopLoss 仍然不会触发。原因何在?

附注:我在另一台电脑(笔记本电脑)上运行相同的代码,运行正常。尽管那里安装的是相同的 metatrader。

 
MQL_User #:

你好

我在测试 TestDoEasyPart08.mq5 时遇到了这个问题 - 止损和止盈不起作用。虽然它们被设置了,但相应的线出现在图表上,日志也有消息。如果打开 TrailStop,TakeProfit 会触发,但 StopLoss 仍然不会触发。原因何在?

附注:我在另一台电脑(笔记本电脑)上运行相同的代码,运行正常。尽管那里安装的是相同的 metatrader。

晚上好!首先,请至少显示日志中出现的信息。

敬上,弗拉基米尔。

 
MQL_User #:

你好

我在测试 TestDoEasyPart08.mq5 时遇到了这个问题 - 止损和止盈不起作用。虽然它们被设置了,但相应的线出现在图表上,日志也有消息。如果打开 TrailStop,TakeProfit 会触发,但 StopLoss 仍然不会触发。原因何在?

附注:我在另一台电脑(笔记本电脑)上运行相同的代码,运行正常。尽管那里安装的是相同的 metatrader。

如果下了止损(限价)单,其触发不是取决于程序,而是取决于经纪人。下止损(限价)订单的指令由程序发送到服务器,其触发取决于经纪商。由于这些指令已经下达(其线显示在图表上),因此程序不会出错。最有可能的情况是,价格没有达到止损(限价)指令。

 
MrBrooklin #:

晚上好,至少显示一下记录的信息。

弗拉基米尔

MrBrooklin, Artem.

我在策略测试器中做了(据我所知,经纪人与此无关)。

信息如下

2022.07.03 11:16:39.380 2022.01.03 07:00:00 Instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 交易 #2 在 81011 买入 0.1 @Si 已完成 (基于订单 #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 交易执行 [#2 buy 0.1 @Si at 81011]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 订单执行 buy 0.1 at 81011 [#2 buy 0.1 @Si at 81011]

但在另一台电脑(笔记本电脑)上,StopLoss 和 TakeProfit 正常工作,信息如下:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 Instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 Deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 交易执行 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Position open: 2022.01.03 07.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Opened 0.10 Buy #2 [0.10 Market order Buy #2] at 81047, sl 80996, tp 81096, magik 123

的确,多了两行...

为了简化一些,我用这段简单的代码编写了一个智能交易系统:

#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
#import "user32.dll"
  int GetAsyncKeyState(int a0);
#import
bool ZPressed, ZPress = false;
bool APressed, APress = false;
CTrade trade;

int OnInit()  {   return(INIT_SUCCEEDED);  }

void OnDeinit(const int reason)  {  }

void OnTick()
  {
  // 按下 "Z "按钮
  if(MathAbs(GetAsyncKeyState(90))>1) ZPressed = ZPress = true;
  else ZPress = false;
  if(ZPressed && !ZPress)
    {
    ZPressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price - 30, tp = Price + 50;
    trade.Buy(1,Symbol(),0,sl,tp);
    printf("Buy"); 
    }
  // 按下 "A "按钮
  if(MathAbs(GetAsyncKeyState(65))>1) APressed = APress = true;
  else APress = false;
  if(APressed && !APress)
    {
    APressed = false;
    double Price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
    double sl = Price + 30, tp = Price - 50;
    trade.Sell(1,Symbol(),0,sl,tp);
    printf("Sell");    
    }
  }

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {  }
//+------------------------------------------------------------------+

重点是,当您按下(或者说,当您松开)"Z "键时,它会打开 "买入",而当您按下 "A "键时,它会打开 "卖出"。

我在测试器中运行了它。结果是一样的--在台式电脑上,StopLoss 和 TakeProfit 工作,但在笔记本电脑上,它们工作,也就是说,一切工作正常。

我还尝试在个人电脑和笔记本电脑上运行测试器中本文末尾链接的代码,结果也一样--在个人电脑上不起作用,但在笔记本电脑上却能正常运行。

所以结论是,要么是测试仪中的某些设置允许触发 sl 和 tp(我不知道),要么是测试仪本身工作不正常....。

 
MQL_User #:

MrBrooklin, Artem.

我是在策略测试器中完成的(据我所知,经纪人与此无关)。

信息如下

2022.07.03 11:16:39.380 2022.01.03 07:00:00 Instant buy 0.1 @Si at 81011 sl: 80960 tp: 81060 (81010 / 81011 / 81010)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 交易 #2 在 81011 买入 0.1 @Si 已完成 (基于订单 #2)
2022.07.03 11:16:39.380 2022.01.03 07:00:00 交易执行 [#2 在 81011 买入 0.1 @Si]
2022.07.03 11:16:39.380 2022.01.03 07:00:00 订单执行 在 81011 买入 0.1 [#2 在 81011 买入 0.1 @Si] 2022.07.03 11:16:39.380 2022.01.03 07:00:00 订单执行 在 81011 买入 0.1 @Si

但在另一台计算机(笔记本电脑)上,StopLoss 和 TakeProfit 正常工作,信息如下:

2022.07.03 11:23:18.383 2022.01.03 07:00:12 Instant buy 0.1 @Si at 81047 sl: 80996 tp: 81096 (81046 / 81047 / 81046)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 Deal #2 buy 0.1 @Si at 81047 done (based on order #2)
2022.07.03 11:23:18.383 2022.01.03 07:00:12 deal performed [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.383 2022.01.03 07:00:12 交易执行 [#2 buy 0.1 @Si at 81047]
2022.07.03 11:23:18.514 2022.01.03 07:00:12 - Position open: 2022.01.03 07:00:12.490 -
2022.07.03 11:23:18.514 2022.01.03 07:00:12 @Si Open 0.10 Buy #2 [0.10 Market order Buy #2] at 81047, sl 80996, tp 81096, magik 123

确实,多了两行...

为了简化一些,我用这段简单的代码编写了一个智能交易系统:

重点是,当您按下(或者说,当您松开)"Z "键时,它将打开 "买入",而当您按下 "A "键时,它将打开 "卖出"。

我在测试器中运行了它。结果是一样的--在台式电脑上,StopLoss 和 TakeProfit 工作,但在笔记本电脑上,它们工作,也就是说,一切工作正常。

我还尝试在测试器中同时在个人电脑和笔记本电脑上运行本文末尾链接的代码,结果也一样--在个人电脑上不起作用,但在笔记本电脑上却能正常工作。

所以结论是,要么是测试仪中的某些设置允许触发 sl 和 tp(我不知道),要么是测试仪本身工作不正确....。

测试仪中的差分是多少?
 

测试仪中的差值为 1。在个人电脑和笔记本电脑上都是如此。符号 @Si。

有什么方法可以影响它吗?

我想可能是滑动(slippage)产生了某种影响,于是尝试更改。但没有用。

 
MQL_User #:

测试仪中的差值为 1。在个人电脑和笔记本电脑上都是如此。符号 @Si.

这会有什么影响吗?

我想可能是滑动(slippage)有什么影响,于是试着改了一下。但没有用。

在其中一种情况下,价格没有达到止损位。