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); //Получаем количество сделок, открывающего ордера.
}
// Ну и так далее...
}
}
}
...
但我想通过订单 来实现它(一个部分执行的订单会 "站立 "一两天或三天的情况)。
...
迈克尔,你是对的!你为什么不这样做?你必须明白,在处理净头寸时,你迟早会面临这样的事实:你不能不分析其中包含的订单。这是我作为一个花了几个月时间研究这个问题,并多次犯过这个错误的人告诉你的:)此外,如果你有一个以上的交易机器人,你必须考虑每个机器人在总仓位中的利润,这里也不能没有订单。所有必要的信息都包含在订单和基于订单的交易中,通过将交易映射到一个单一的净头寸,信息被不可逆转地删除。
但如果你的系统建立在对订单和交易的分析上,你应该考虑订单的 部分执行。要做到这一点,你应该创建一个虚拟版本的订单并控制新交易的到来。我的算法如下。
1.收到了一个新的交易(HistoryDealsTotal()的计数器已经改变)。
2.如果这个交易是由某个订单发起的,我们创建一个新的订单,包括一个单一的交易(COrder* order = new Order(deal))。
3.接下来,我们在已经存在的虚拟订单列表中,搜索具有相同标识符的订单。如果找到了这样的订单,那么我们就将创建的订单的交易与找到的订单的交易合并,并更新其属性,然后删除创建的订单。如果同一个订单还没有出现在列表中,我们只需将其添加到列表中。
这样一来,系统就变得完全确定了。随着每一笔新的交易,我们的虚拟订单将改变其状态,如果实际的订单正在等待执行或已经被移入历史,这并不重要,我们将始终在系统中看到它的实际执行量。
如果我们平仓,而订单中未执行的部分没有被删除,它就会打开(或改变)另一个仓位?
好问题!
如果该订单是有效的,它就不在历史记录中(这已经被检查过了,是肯定的)。
当然,一个活跃的订单可能会打开另一个位置,但如果
它将再次被部分执行,我们将不给它分配ORDER_POSITION_ID。
换句话说,ORDER_POSITION_ID只能在历史中看到。
是的,这发生在股市中,这些情况必须考虑到。这是限价订单的基本缺点之一。
在你的例子中,我认为我们可以替换它。
敬请关注。
因为所有买入和卖出类型的交易都是由某种订单发起的。
不,你不能,因为交易发生在清算中,但它们没有票(或者说票=0)。
但它们有一个价格和一个类型(买入和卖出),当然还有输入和输出 :(
米哈伊尔,这是很正确的!你为什么没有实施呢?你必须明白,在处理净头寸时,你迟早会面临这样一个事实:你不能不对其中包含的订单进行分析。这是我作为一个花了几个月时间研究这个问题,并多次犯过这个错误的人告诉你的:)此外,如果你有一个以上的交易机器人,你必须考虑每个机器人在联合头寸中的贡献,这里也不能没有订单。所有必要的信息都存在于订单和基于订单的交易中,相反,将交易垫入一个单一的净头寸中会不可逆转地删除这些信息。
但如果你的系统建立在对订单和交易的分析上,你应该考虑订单的 部分执行。要做到这一点,你应该创建一个虚拟版本的订单并控制新交易的到来。我的算法如下。
1.收到了一个新的交易(HistoryDealsTotal()的计数器已经改变)。
2.如果这个交易是由一个订单发起的,我们创建一个新的订单,其中包括一个交易(COrder* order = new Order(deal))。
3.接下来,我们在已经存在的虚拟订单列表中,搜索具有相同标识符的订单。如果找到了这样的订单,那么我们就将创建的订单的交易与找到的订单的交易合并,并更新其属性,然后删除创建的订单。如果同一个订单还没有出现在列表中,我们只需将其添加到列表中。
这样一来,系统就变得完全确定了。我们的虚拟订单的状态会随着每笔新的交易而改变,不管实际的订单是待执行还是已经被移入历史记录,我们都会在系统中看到它的实际执行量。
问题解决了,关系理顺了 )
我有一个相关的问题。
通过票据选择一个订单 来查看其属性是非常不方便的,因为该订单在历史或市场中的位置并不重要,而且票据也不会改变。
因此,我们必须在这里和那里都要寻找秩序。
如果像MT4那样,不是更容易吗:如果我们选择一个订单,它的位置并不重要。
我在MT4帮助中读到过。
你怎么看这个问题?
P.S. 我希望米哈伊尔不介意继续这个话题,以免产生更多新的话题?
С-4,讨论是建设性的,这非常好!
因此,我需要仓位的 "净 "价格来知道(例如在一个月内)我的利润是多少。
...
在函数中(我现在正在使用它)。
...
这个问题是相关的,一般来说,MetaTrader5的API确实是相当低级的。但是......。交易所的交易有很多细微的差别:通过多个交易执行订单,匹配的交易变成净头寸并通过清算转移,丰富的经纪交易等等,不一而足。因此,MetaTrader5的API(和MT5本身)是这样的,因为任何交易所的终端都应该是这样。
另一个问题是,它的API可以用MQL5编写的高级包装器包装,并通过它使用MT5的更低级别的功能。如果我有包装盒,米哈伊尔的利润计算任务会是这样的
不,你不能,因为交易发生在清算中,但它们没有票(或者说票=0)。
但有一个价格和一个类型(买入和卖出),当然还有输入和输出 :(
妈的,对。
然后为你感到悲伤。
Vasiliy,我已经实现了所有的功能(不是像你那样,但也不差),我只是想减少搜索时间......。
好问题!
如果该订单是有效的,它就不在历史记录中(这已经被检查过了,是肯定的)。
当然,一个活跃的订单可能会打开另一个位置,但如果
它将再次被部分执行,我们将不给它分配ORDER_POSITION_ID。
换句话说,ORDER_POSITION_ID只能在历史中看到。
顺便问一下,你是如何处理你的机器人的多方向条目的?毕竟,一个专家顾问的入市 可能是另一个机器人的出市。
这里的问题是不同的。该订单的部分已执行交易将属于一个头寸,而另一部分将属于另一个新的头寸。那么问题来了,当它迟早要进入历史时,会给它分配什么位置的ID?
一个完全填满的订单,将收到它打开或改变的位置的ID。
但这只能在历史中得到(ID)。