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

 
阿尔乔姆-特里什金

如何确定最后一次开仓的时间 和最后一次平仓的时间?

一般来说,我想知道在mql5中获取开仓/平仓信息的一般原则和算法。

应该考虑什么,目前有什么特殊性?

问题是,我使用的是MQL4语法,它比MQL5语法在交易部分的工作要简单和容易理解1000倍。

你很清楚,在MQL4中,你的任务可以在三行中得到解决,是多么容易和清晰。这就是为什么它正是我的方式。

关于MQL5的所有问题的答案,我参考了该库的源代码。我所知道的所有细微差别都在那里得到了考虑。

目前我们可以说,对冲和净值化头寸是非常不同的。例如,在净值交易中,你总是可以在几个月内只有一个头寸,而你却在不断地交易。因此,在正常的MT5的理解中,净值化的位置是一些考虑不周的东西,相应地也是不方便的。因此,对于这个网状结构,我们可以创造我们自己的位置本质。在MT4中,你也可以有净值头寸,但有更清晰的互动。

为1手建仓。然后以0.99的价格平仓,并存入相同的金额。如此反复数次。

对冲是方便的,不是因为你可以有多方向的位置,而是因为你可以在一个方向的一个符号上有几个位置。这正是我看到的舒适的工作方式,在Netting-系统中的职位。不像在MT5中。

理想情况下,当你使用Netting账户时,你应该总是有一个与MT4账户完全对应的表格。因为只有这些表格才能让你即时了解交易账户中发生了什么以及如何发生的。而不是MT5-统计。

至于MT5-Hedge,一切都很简单。不过,我还没有钻研过。因此我不知道。

 
fxsaber:
不一定能知道平仓的 SL/TP水平。

从报价中也可以看出,MT5中的TP头寸总是一个市场订单。不要给极限对应的书签--见上文。

现在这很有趣...我需要确定的是,最后一次平仓是在获利时关闭的。

有什么办法可以确定吗?

 
阿尔乔姆-特里什金

现在这很有趣...我需要确定的是,最后一次平仓是在获利时关闭的。

有什么办法可以确定这一点吗?

我正在按建议行事。

//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Take Profit               |
//+------------------------------------------------------------------+
bool IsClosedByTP (const string symbol)
{
  //--- Получим комментарий последней сделки на указанном символе
  string last_comment = LastDealComment (symbol);
  //--- Если в комментарии есть строка "tp"
  if(StringFind (last_comment, "tp", 0) > -1)
    return (true);
  //--- Если нет строки "tp"
  return (false);
}
//+------------------------------------------------------------------+
//| Возвращает причину закрытия позиции по Stop Loss                 |
//+------------------------------------------------------------------+
bool IsClosedBySL (const string symbol)
{
  //--- Получим комментарий последней сделки на указанном символе
  string last_comment = LastDealComment (symbol);
  //--- Если в комментарии есть строка "sl"
  if(StringFind (last_comment, "sl", 0) > -1)
    return (true);
  //--- Если нет строки "sl"
  return (false);
}
//+------------------------------------------------------------------+
//| Возвращает комментарий последней сделки на указанном символе     |
//+------------------------------------------------------------------+
string LastDealComment (const string symbol)
{
  int    total_deals  = 0;  // Всего сделок в списке выбранной истории
  string deal_symbol  = ""; // Символ сделки
  string deal_comment = ""; // Комментарий сделки
                            //--- Если история сделок получена
  if(HistorySelect (0, TimeCurrent ()))
  {
    //--- Получим количество сделок в полученном списке
    total_deals = HistoryDealsTotal ();
    //--- Пройдемся по всем сделкам в полученном списке от последней сделки к первой
    for(int i = total_deals - 1; i >= 0; i--)
    {
      //--- Получим комментарий сделки
      deal_comment = HistoryDealGetString (HistoryDealGetTicket (i), DEAL_COMMENT);
      //--- Получим символ сделки
      deal_symbol = HistoryDealGetString (HistoryDealGetTicket (i), DEAL_SYMBOL);
      //--- Если символ сделки и текущий символ равны, остановим цикл
      if(deal_symbol == symbol)
        break;
    }
  }
  //---
  return (deal_comment);
}
 
Andrey Dik:

我正在按建议行事。

好吧,我怎么知道最后一笔交易是否导致仓位关闭或逆转?

如果仓位被关闭或逆转,那么检查它的数据是有意义的,这对顾问的逻辑是必要的:成交量,在采取或停止时关闭的事实,等等。

否则,如果在最后一笔交易中检测到平仓的事实,但头寸仍然存在,那么检查最后一笔平仓 的数据就没有意义(它仍然存在)。

在一般情况下,当然,在四种情况之后,很难迅速切换到MT5订单系统的逻辑 - 在思考EA的行为逻辑时,出现了许多问题,这取决于最后关闭头寸的数据 - 在四种情况下,一切都很透明 - 头寸有自己的类型,而且是最后的 - 适合 - 采取数据并使用它。但在这里......。套期保值、净值化...而我们需要同样的结果...然后我们开始以不同的方式思考......

 
Artyom Trishkin:

好吧,那么你怎么知道最后一笔交易是否导致了平仓或反转?

1.如果仓位被关闭或逆转,那么检查它的数据是有意义的,这对专家顾问的逻辑是必要的:交易量,在采取或停止时关闭的事实,等等。

否则,如果在最后一个头寸中检测到获利平仓的事实,但该头寸仍然存在,那么检查最后一个平仓 的数据就没有意义了(它仍然存在)。

在一般情况下,当然,很难在四点之后迅速切换到MT5订单系统的逻辑 - 在思考顾问的行为逻辑时,会出现很多问题,它与最后一个平仓的数据相联系 - 在四点中,这一切都很透明 - 位置有自己的类型,而且是最后一个 - 它适合,我们采取数据并使用它。但在这里......。套期保值、净值化...而我们需要同样的结果...然后我们开始思考所有的地方... ...

1.检查交易类型,IN、OUT或IN/OUT

2.如果一个头寸已经被SL或TP平仓,它就已经被平仓了,我们不需要检查交易类型。

 
安德烈-迪克

1.检查交易类型,IN、OUT或IN/OUT

2.如果仓位被SL或TP关闭,它就不再存在,它被关闭,你不需要检查交易类型。

它对网状结构有效吗?还是为了保值?在一个对冲账户中,是否不可能在一个方向上有几个头寸?或者是一个位置,和....?什么是 "和"? ...糟糕......。我不知道什么是 "和"...有很多问题,答案还不在我脑子里。
 
阿尔乔姆-特里什金
对于网状物来说,这是真的吗?还是说对冲也是如此?在一个对冲账户中不能有一个方向的几个头寸吗?或者是一个位置,和....?什么是 "和"? ...糟糕......。我不知道什么是 "和"...有很多问题,还没有答案。

也是为了树篱。

多年来,我的大脑已经被磨练成了网状。 订单->交易->位置。一个头寸中可能有很多交易(在对冲中只有一个交易,如果我错了请纠正我),你可以通过交易的类型 来判断这个头寸发生了什么。

在套期保值中,当然更容易理解,但更难跟进。当然,这是我的个人意见。

 
安德烈-迪克

也是为了套期保值。

多年来,我的大脑已经被磨练成了网状。 订单->交易->位置。一个头寸中可能有很多交易(在对冲中只有一个交易,如果我错了请纠正我),你可以通过交易的类型 来判断这个头寸发生了什么。

在套期保值中,当然更容易理解,但更难跟进。当然是IMHO。

我明白,谢谢你。我会想办法的。
 
阿尔乔姆-特里什金

现在这很有趣...我需要确定的是,最后一次平仓是在获利时关闭的。

有什么办法可以确定这一点吗?

当你找到最后一笔交易DEAL_ENTRY_OUT并在这个列表中选择整个历史头寸HistorySelectByPosition时,有2笔交易和2个订单,分别是开仓和平仓。发生平仓的基础订单包含ORDER_PRICE_OPEN。然后你要检查仓位类型和用于平仓的订单类型。如果订单类型是相反的,意味着是平仓。相应地,订单价格是我们应该寻找的价格,但有一个小的修正:如果订单利润>0,那么这就是TP的价格,如果它< 0,那么该位置已经在SL上关闭

如果我们考虑到对该命令的评论,我们就不应该依赖它。

 
阿列克谢-维克多罗夫

当你找到最后一笔交易DEAL_ENTRY_OUT并选择整个历史仓位HistorySelectByPosition时,对于Hedge账户有2笔交易和2个订单,开仓和平仓。发生平仓的基础订单包含ORDER_PRICE_OPEN。然后你要检查仓位类型和用于平仓的订单类型。如果订单类型是相反的,意味着是平仓。相应地,订单价格是我们应该寻找的价格,但有一个小的修正:如果订单利润>0,那么这就是TP的价格,如果它< 0,那么该位置已经在SL上关闭

如果我们应该依靠命令的评论,我不会这样做。

那SL呢?你如何确定SL拖网关闭的利润是多少?