伟大而可怕的MT4永远(或如何制定过渡策略) - 页 11

 
secret:
订单已经事先下好了。价格触动了它,但它后来被执行,价格更差。

不,如果限制的表现更糟糕,那么就去死的经纪人或处理它。

而如果停止,那也很好,因为它是。20-30毫秒是完全可以接受的,如果订单是在其他地方输出的,而不仅仅是由一个插件检查。

而那里有多少虱子--这根本不重要。

 
Andrei Trukhanovich:

如果佣金是以美元计算的,与美元数量有什么关系?

奇怪的是,账户的货币也受到影响。显然,这不是当前的汇率,而是一个固定汇率。加上四舍五入,如果地段小的话。

 

我不得不自己去寻找一些东西,一个非常容易复制的例子就这样诞生了,它显示了用订单工作是多么容易。


因此,让我们想象一下,我们运行一个以经典的OnTick模式运行的EA。由于OnTick可能发生在终端环境状态下的任何时间,所以看看EA可能看到的情况会很有趣。因此,专家顾问onTick可能遇到的状态被挑选出来如下。

#define  TOSTRING(A) #A + " = " + (string)(A) + " "

void OnTradeTransaction( const MqlTradeTransaction&, const MqlTradeRequest&, const MqlTradeResult& )
{
  static int i = 0;
  
  Print(i++);
  
  if (HistorySelect(0, INT_MAX))
    Print(TOSTRING(PositionsTotal()) + TOSTRING(OrdersTotal()) + TOSTRING(HistoryDealsTotal()) + TOSTRING(HistoryOrdersTotal()));
        
  Print("----------------");
}

这段代码只是简单地打印出当前有多少头寸/订单,以及有多少已成交的交易/订单。


我们运行它,只是手动开仓和平仓。没有别的了。我有以下的打印结果(它可能会因运行而改变)。

        // Открываем позицию руками.

        0
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        1
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        2
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        3
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        4
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        5 // Открывающий позицию ордер исчез полностью - нет среди живых и мертвых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 25 
        ----------------
        6 // Открылась позиция, но нет соответствующей ей сделки.
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 25 HistoryOrdersTotal() = 26 
        ----------------
        7
        PositionsTotal() = 1 OrdersTotal() = 0 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------

        // Закрываем позицию руками.
        8 // Позиция и закрывающий ее ордер.
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        9
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        10
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        11
        PositionsTotal() = 1 OrdersTotal() = 1 HistoryDealsTotal() = 26 HistoryOrdersTotal() = 26 
        ----------------
        12 // Позиция закрыта, но закрывающий ее ордер продолжает висеть.
        PositionsTotal() = 0 OrdersTotal() = 1 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        13 // Закрывающий позицию ордер полностью исчез - нет среди мертвых/живых.
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        14
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 26 
        ----------------
        15
        PositionsTotal() = 0 OrdersTotal() = 0 HistoryDealsTotal() = 27 HistoryOrdersTotal() = 27 
        ----------------

因此,OnTick专家顾问可以遇到这16种情况中的任何一种,一些有趣的情况我在上面评论过。

我不是故意要捡一个例子的。刚刚运行了它并公布了结果。发射也可以给出其他有趣的变体。


我能够对结果进行评论,因为我清楚地知道我在做什么(我打开一个单一的位置,然后用手关闭它)。

对于不知道的专家顾问来说,感觉如何呢?让我们想象一下,有几个专家顾问在账户上并行工作。我认为,对上述情况的共生所产生的混乱进行分析的难易程度是显而易见的。


附上一个简明的代码,任何人都可以复制它。

 
fxsaber:

我不得不自己去寻找一些东西,一个非常容易复制的例子就这样诞生了,它显示了用订单工作是多么容易。


因此,让我们想象一下,我们运行一个以经典的OnTick模式运行的EA。由于OnTick可能发生在终端环境状态下的任何时间,所以看看EA可能看到的情况会很有趣。因此,专家顾问onTick可能遇到的状态被挑选出来如下。

这段代码只是简单地打印出当前有多少头寸/订单,以及有多少已成交的交易/订单。


我们运行它,只是手动开仓和平仓。没有别的了。我有以下的打印结果(它可能会因运行而改变)。

因此,OnTick专家顾问可以遇到这16种情况中的任何一种,一些有趣的情况我在上面评论过。

我不是故意要捡一个例子的。刚刚运行了它并公布了结果。发射也可以给出其他有趣的变体。


我能够对结果进行评论,因为我清楚地知道我在做什么(我打开一个单一的位置,然后用手关闭它)。

对于不知道的专家顾问来说,感觉如何呢?让我们想象一下,有几个专家顾问在账户上并行工作。我认为,对上述情况的共生所产生的混乱进行分析的难易程度是显而易见的。


附上一个简明的代码,每个人都可以复制它。

你必须了解OnTradeTransaction被调用多少次,以及你在什么时候能得到什么。

贸易_交易_订单_添加

增加一个新的公开订单。

贸易_交易_订单_更新

修改一个开放的订单。这些变化不仅包括客户终端或交易服务器端的明确变化,还包括下单状态的变化(例如从 ORDER_STATE_STARTEDORDER_STATE_PLACED 或从ORDER_STATE_PLACEDORDER_STATE_PARTIAL 等等)。

贸易_交易_订单_删除

将订单从未结订单列表中删除。一个订单可以因交易请求或因执行(填补)并转入历史而从未结订单列表中删除。

贸易_交易_交易_添加

在历史上增加一笔交易。这是作为订单执行的结果或作为账户平衡操作的结果进行的。

贸易_交易_交易_更新

在历史上改变了一个交易。当以前执行的交易在服务器上被改变时,就可能出现这种情况。例如,该交易在外部交易系统(交易所)中被改变,在那里被经纪人删除。

贸易_交易_交易_删除

从历史中删除该交易。可能会有这样的情况,以前执行的交易在服务器上被删除。例如,一个交易在外部交易系统(交易所)中被经纪人删除了。

贸易_交易_历史记录_添加

由于执行或取消,将订单添加到历史中。

贸易_交易_历史_更新

修改订单历史中的一个订单。这种类型是为了增加贸易服务器方面的功能。

贸易_交易_历史_删除

从订单历史中删除一个订单。这种类型是为了在贸易服务器方面进行功能扩展。

贸易_交易_位置

改变与交易执行无关的头寸。这种交易类型表明,交易服务器一方的头寸已被改变。仓位的成交量、开盘价、止损和止盈水平可能会被改变。有关变化的信息通过OnTradeTransaction处理程序传递给MqlTradeTransaction 结构。因交易而导致的头寸变化(增加、修改或取消)不会导致TRADE_TRANSACTION_POSITION交易的发生。

交易请求

一个通知,表明服务器已经处理了一个交易请求,并且已经收到了其结果。对于这种类型的交易,有必要只分析一个字段--MqlTradeTransaction 结构中的type(交易类型)。必须分析OnTradeTransaction 函数的第二和第三个参数(请求和结果)以获得额外的信息。

 
Alexey Viktorov:

你必须弄清楚OnTradeTransaction被调用多少次,以及你在什么时候能得到什么。

我想我已经尽可能说得很清楚了。

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

伟大而可怕的MT4永远(或如何建立迁移策略)

fxsaber, 2021.05.03 12:48

因此,OnTick EA可能会遇到这16种情况中的任何一种,即我上面评论的有趣的情况。

 
fxsaber:
我想我已经尽可能说得很清楚了。

如果你在OnTradeTransaction 中处理这一切,那么OnTick()与它有什么关系?

获取调用OnTradeTransaction的原因,并相应处理此次调用中的内容。
 
Alexey Viktorov:

如果你在OnTradeTransaction 中全部处理,那么OnTick()与它有什么关系?

获取调用OnTradeTransaction的原因,并相应处理此次调用的内容。

也许论坛中的某个成员会解释。它对我不起作用。

 
Alexey Viktorov:

如果你在OnTradeTransaction 中全部处理,那么OnTick()与它有什么关系?

获取调用OnTradeTransaction的原因,并相应地处理该调用中的内容。

OnTick 中,绝对是所有这些奇怪的东西都到位 了。只是很难用 OnTick做一个容易复制的例子。OnTradeTransaction 被选为一个例子,但它并没有改变本质

 
traveller00:

OnTick绝对有所有这些奇怪的地方只是很难用OnTick 做一个容易复制的例子。OnTradeTransaction 被选为一个例子,但它并没有改变 重点。

继续模仿堂吉诃德......

 
fxsaber:

нет среди живых и мертвых

如果能在MT4Orders层面上解决这个问题就更好了。

如今,不幸的是,顺序颠倒的情况时有发生。很可能是因为这个原因。