顺序_position_id - 页 21

 
Mikalas:

...

但我想通过订单实现它(一个部分执行的订单会 "站立 "一两天或三天的情况)

...

迈克尔,你是对的!你为什么不这样做?你必须明白,在处理净头寸时,你迟早会面临这样的事实:你不能不分析其中包含的订单。这是我作为一个花了几个月时间研究这个问题,并多次犯过这个错误的人告诉你的:)此外,如果你有一个以上的交易机器人,你必须考虑每个机器人在总仓位中的利润,这里也不能没有订单。所有必要的信息都包含在订单和基于订单的交易中,通过将交易映射到一个单一的净头寸,信息被不可逆转地删除。

但如果你的系统建立在对订单和交易的分析上,你应该考虑订单的 部分执行。要做到这一点,你应该创建一个虚拟版本的订单并控制新交易的到来。我的算法如下。

1.收到了一个新的交易(HistoryDealsTotal()的计数器已经改变)。

2.如果这个交易是由某个订单发起的,我们创建一个新的订单,包括一个单一的交易(COrder* order = new Order(deal))。

3.接下来,我们在已经存在的虚拟订单列表中,搜索具有相同标识符的订单。如果找到了这样的订单,那么我们就将创建的订单的交易与找到的订单的交易合并,并更新其属性,然后删除创建的订单。如果同一个订单还没有出现在列表中,我们只需将其添加到列表中。

这样一来,系统就变得完全确定了。随着每一笔新的交易,我们的虚拟订单将改变其状态,如果实际的订单正在等待执行或已经被移入历史,这并不重要,我们将始终在系统中看到它的实际执行量。

 
Contender:
如果我们平仓,而订单中未执行的部分没有被删除,它就会打开(或改变)另一个仓位?

好问题!

如果该订单是有效的,它就不在历史记录中(这已经被检查过了,是肯定的)。

当然,一个活跃的订单可能会打开另一个位置,但如果

它将再次被部分执行,我们将不给它分配ORDER_POSITION_ID。

换句话说,ORDER_POSITION_ID只能在历史中看到

 
C-4:

是的,这发生在股市中,这些情况必须考虑到。这是限价订单的基本缺点之一。

在你的例子中,我认为我们可以替换它。

敬请关注。

因为所有买入和卖出类型的交易都是由某种订单发起的。

不,你不能,因为交易发生在清算中,但它们没有票(或者说票=0)。

但它们有一个价格和一个类型(买入和卖出),当然还有输入和输出 :(

 
C-4:

米哈伊尔,这是很正确的!你为什么没有实施呢?你必须明白,在处理净头寸时,你迟早会面临这样一个事实:你不能不对其中包含的订单进行分析。这是我作为一个花了几个月时间研究这个问题,并多次犯过这个错误的人告诉你的:)此外,如果你有一个以上的交易机器人,你必须考虑每个机器人在联合头寸中的贡献,这里也不能没有订单。所有必要的信息都存在于订单和基于订单的交易中,相反,将交易垫入一个单一的净头寸中会不可逆转地删除这些信息。

但如果你的系统建立在对订单和交易的分析上,你应该考虑订单的 部分执行。要做到这一点,你应该创建一个虚拟版本的订单并控制新交易的到来。我的算法如下。

1.收到了一个新的交易(HistoryDealsTotal()的计数器已经改变)。

2.如果这个交易是由一个订单发起的,我们创建一个新的订单,其中包括一个交易(COrder* order = new Order(deal))。

3.接下来,我们在已经存在的虚拟订单列表中,搜索具有相同标识符的订单。如果找到了这样的订单,那么我们就将创建的订单的交易与找到的订单的交易合并,并更新其属性,然后删除创建的订单。如果同一个订单还没有出现在列表中,我们只需将其添加到列表中。

这样一来,系统就变得完全确定了。我们的虚拟订单的状态会随着每笔新的交易而改变,不管实际的订单是待执行还是已经被移入历史记录,我们都会在系统中看到它的实际执行量。

Vasiliy,我已经实现了所有的功能(不是像你那样,但也不差),我只是想减少搜索时间......。
 
Serj_Che:

问题解决了,关系理顺了 )

我有一个相关的问题。

通过票据选择一个订单 来查看其属性是非常不方便的,因为该订单在历史或市场中的位置并不重要,而且票据也不会改变。

因此,我们必须在这里和那里都要寻找秩序。

如果像MT4那样,不是更容易吗:如果我们选择一个订单,它的位置并不重要。

我在MT4帮助中读到过。

你怎么看这个问题?

P.S. 我希望米哈伊尔不介意继续这个话题,以免产生更多新的话题?


米卡拉斯

С-4,讨论是建设性的,这非常好!

因此,我需要仓位的 "净 "价格来知道(例如在一个月内)我的利润是多少。

...

在函数中(我现在正在使用它)。

...

这个问题是相关的,一般来说,MetaTrader5的API确实是相当低级的。但是......。交易所的交易有很多细微的差别:通过多个交易执行订单,匹配的交易变成净头寸并通过清算转移,丰富的经纪交易等等,不一而足。因此,MetaTrader5的API(和MT5本身)是这样的,因为任何交易所的终端都应该是这样。

另一个问题是,它的API可以用MQL5编写的高级包装器包装,并通过它使用MT5的更低级别的功能。如果我有包装盒,米哈伊尔的利润计算任务会是这样的

for(int i = 0; i < TransactionsTotal(); i++)
{
    if(TransactionSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
         ENUM_TRANS_TYPE trans_type = TransactionType();
         if(trans_type == TRANS_HEDGE_POSITION)
         {
              if(HedgePositionGetInteger(HEDGE_POSITION_MAGIC) != myMagic)continue;  // Работаем только со своими позициями.
              if(HedgePositionGetString(HEDGE_POSITION_SYMBOL) != Symbol())continue; // Работаем только с позициями на своем инструменте.
              double profit = HedgePositionGetDouble(HEDGE_POSITION_PROFIT_POINTS); //Профит в пунктах
              double currency = HedgePositionGetDouble(HEDGE_POSITION_PROFIT_CURRENCY); //Профит в валюте депозита.
              double price_open = HedgePositionGetDouble(HEDGE_POSITION_PRICE_OPEN); //Фактическая цена открытия позиции без клирингов и пр. изменений.
              double sl = HedgePositionGetDouble(HEDGE_POSITION_SL); //Узнаем уровень стоп-лосса позиции, если он есть, если нет - вернет нормализованный 0.0.
              if(HedgeOrderSelect(ORDER_SELECTED_INIT)) //Выбираем ордер, открывающий текущую позицию.
              {
                 int deals = HedgeOrderGetInteger(HEDGE_ORDER_DEALS_TOTAL); //Получаем количество сделок, открывающего ордера.
              }
              // Ну и так далее...
         }   
    }
}
 
Mikalas:

不,你不能,因为交易发生在清算中,但它们没有票(或者说票=0)。

但有一个价格和一个类型(买入和卖出),当然还有输入和输出 :(

妈的,对。

然后为你感到悲伤。

 
Mikalas:
Vasiliy,我已经实现了所有的功能(不是像你那样,但也不差),我只是想减少搜索时间......。
顺便问一下,你是如何处理你的机器人的多方向条目的?毕竟,一个专家顾问的市场进入 可能是另一个机器人的退出。
 
Mikalas:

好问题!

如果该订单是有效的,它就不在历史记录中(这已经被检查过了,是肯定的)。

当然,一个活跃的订单可能会打开另一个位置,但如果

它将再次被部分执行,我们将不给它分配ORDER_POSITION_ID。

换句话说,ORDER_POSITION_ID只能在历史中看到

这里有另一个陷阱。该订单执行的部分交易将属于一个头寸,而另一部分将属于另一个新头寸。那么问题来了,当它最终进入历史时,将给它分配什么位置标识符?
 
C-4:
顺便问一下,你是如何处理你的机器人的多方向条目的?毕竟,一个专家顾问的入市 可能是另一个机器人的出市。
我没有任何重叠的地方。
 
C-4:
这里的问题是不同的。该订单的部分已执行交易将属于一个头寸,而另一部分将属于另一个新的头寸。那么问题来了,当它迟早要进入历史时,会给它分配什么位置的ID?

一个完全填满的订单,将收到它打开或改变的位置的ID。

但这只能在历史中得到(ID)。