关于OnTradeTransaction函数的问题 - 页 2

 
Mikalas:

是的,不使用OnTradeTransaction是可能的,但那样你就必须挖掘历史,这将降低EA的整体性能

每个开发者都有选择的权利!

这就是为什么我开始向这个方向挖掘...

谢谢你的澄清。我将继续挖掘。没有人催促我。:))))

 
AlexeyVik:

这就是为什么我开始向这个方向挖掘...

谢谢你的澄清。我将继续挖掘。没有人催促我。:))))

问题是,我给出的例子只是一个保险,即TradeTransaction事件不会发生

事实上,我已经在一个 每天有2000笔交易的真实账户 上对该EA进行了6个月的日常工作。

我从来没有遇到过 "紧急 "情况!"。

好运!

 
C-4:
仿佛我们明白了一切,拍手称快。对不起,但你的代码是一团糟。

哦,对了,我完全忘了,瓦西里!

代码是100%有效的--把EA放在演示中,看看它是如何工作的。

在正常模式下,然后注释掉OnTradeTransaction函数,你就可以

你将看到 "紧急 "模式是如何工作的。

 
AlexeyVik:

所以,如果你不使用异步,就不需要OnTradeTransaction处理程序,因为猫头鹰会等待服务器的响应?

不要把事情复杂化。没有必要使用异步法在FORTS上交易。首先,请看这篇文章 的第3章:"异步操作的基础知识"。这不多,非常基本,但足以开始学习。那里描述的代码是100%异步的,然而,这并不妨碍它在同步模式下工作,而不获得所有OnTradeTransaction和其他事件。

AlexeyVik:

但到目前为止,我还没有找到确定止损单是否已被激活的最佳方法。例如,我设置市场买入0.1和卖出止损0.3,但当它激活0.3时,它仍然是0.2,在什么时候我应该跟随它...因此,事实证明,我们必须在每一次打勾时遵循两个命令。而我想在交易发生时才解除猫头鹰和控制。我想要的甚至不是控制,而是检查发生了什么并决定做什么。但我想情况并非如此......。也许最好是回到旧的、经过测试的方法......。

解决办法应以你的任务为基础。在MetaTrader 5中,你在任何时候都只有一个活动头寸,所以要靠你自己去关注它。没有必要查看订单历史。如果你仍然需要订单历史,那么你需要明确你的目标。

 
Mikalas:

哦,对了,我完全忘了,瓦西里!

代码是100%有效的--把EA放在演示中,看看它是如何工作的。

在正常模式下,然后注释掉OnTradeTransaction函数,你就可以

你将看到 "紧急 "模式是如何工作的。

我已经更仔细地看了你的代码。你把事情搞得太复杂了。不应该有任何 "紧急 "模式。无论你使用的是同步还是异步交易类型,你都必须专注于对交易环境 的分析。对OnTradeTransaction类型的事件的分析具有辅助性质。

米卡拉斯

是的,你可以省略OnTradeTransaction,但在这种情况下,你将不得不搜索历史,这将大大降低专家顾问的速度。

每个开发者都有选择的权利!

这不是真的。分析历史并不会降低EA的性能。不写长的CheckOrder(),而写这样的东西就可以了(真正的工作代码)。

///
/// Отслеживает поступление новых трейдов в истории трейдов.
///
void TrackingHistoryDeals()
{
    int total = HistoryDealsTotal();
    //Перебираем все доступные трейды и формируем на их основе прототипы будущих позиций типа COrder
    for(; dealsCountNow < HistoryDealsTotal(); dealsCountNow++)
    {  
        ulong ticket = HistoryDealGetTicket(dealsCountNow);
        AddNewDeal(ticket);
        graphRebuild = true;
    }
}

这就是全部。新交易的到来将由TrackingHistoryDeals()函数自动检测,而该函数又会被系统定时器调用。这个函数也必须在OnTradeTransaction()中调用,例如在TRADE_TRANSACTION_DEAL_AD事件发生时调用,以获得速度,而不是依赖设定的定时器权限。如果这个事件丢失了,专家顾问会在稍后发现这些变化(在我的例子中是200毫秒),等待下一次定时器的调用并获得订单触发的信息。

 
C-4:

更仔细地看了你的代码。你把事情搞复杂了。不应该有任何 "崩溃 "模式。无论你使用的是同步还是异步交易类型,你都应该专注于分析交易环境。对OnTradeTransaction等事件的分析具有辅助性质。

这是不正确的。对历史的分析并不会降低专家顾问的性能。你只需要写这样的东西,而不是你的长的CheckOrder(),(真正的工作代码)。

这就是全部。新交易的到来将由TrackingHistoryDeals()函数自动检测,而该函数又会被系统定时器调用。这个函数也必须在OnTradeTransaction()中调用,例如在TRADE_TRANSACTION_DEAL_AD事件发生时调用,以获得速度,而不是依赖设定的定时器权限。如果事件丢失,专家顾问会在稍后发现这些变化(在我的案例中是200毫秒),等待下一次的定时器调用,并获得订单触发的信息。

我们在说不同的语言。

你坚持你的观点,而我,如果你允许的话,将坚持我的观点。

你甚至没有看到那些明显的东西。

当TradeTransaction事件到来时,你不需要检查任何东西--所有的数据都已经存在了。

如果TradeTransaction事件已经到来,CheckOrder()函数根本就不起作用!!!。

 
Mikalas:

我们在用 "不同的语言 "说话。

保持你的观点,而我,经你允许,将保持我的观点。

不,我们说的是同一种语言--MQL5和其异步方言OrderSendAsync。无论你怎么看,Async中的任务都需要以同样的方式解决。请看我上面的文章。异步代码--与外部专家同步互动。本质上是多态性的一种非琐碎表现。这都是由于该代码的重点放在了对交易环境变化的分析 上。这再次证明,事件模型是有用的,但却是次要的,即使在异步操作中我们也可以不使用。
 
C-4:
不,我们说的是同一种语言--MQL5和其异步方言OrderSendAsync。无论你怎么看,你都必须用Async来解决同样的问题。请看我上面的文章。异步代码--与外部专家同步互动。本质上是多态性的一种非琐碎表现。所有这些都要归功于这样一个事实,即该代码的重点是对交易环境变化的分析。这再次证明,事件驱动模型是有用的,但却是次要的,即使在异步操作中,我们也可以不使用它。
Vasiliy,不要固执己见,在Demo上运行这个例子--然后你就会明白所有的事情了!"。
 
Mikalas:
Vasily,不要再坚持了,在一个演示上运行这个例子--然后你就会明白所有的事情了!

谢谢,不觉得有什么问题了。

2015.02.05 23:37:21.147 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=14

2015.02.05 23:37:20.767 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=13

2015.02.05 23:37:20.464 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=12

2015.02.05 23:37:20.105 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=11

2015.02.05 23:37:19.912 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=10

2015.02.05 23:37:19.832 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=9

2015.02.05 23:37:19.036 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=7

2015.02.05 23:37:05.723 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=6

2015.02.05 23:36:59.919 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=5

2015.02.05 23:36:59.199 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=4

2015.02.05 23:36:53.693 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=3

2015.02.05 23:36:52.689 TestTradeTrans (AUDCAD,H1) OnTradeTransaction: 没有收到订单票。要求=2

2015.02.05 23:36:44.410 专家 自动交易已启用

2015.02.05 23:36:41.995 TestTradeTrans (AUDCAD,H1) Order not sent!AUDCAD返回代码=客户终端不允许自动交易

2015.02.05 23:36:39.996 TestTradeTrans (AUDCAD,H1) Order not sent!AUDCAD返回代码=客户终端不允许AutoTradeTrans。

2015.02.05 23:36:39.958 TestTradeTrans (AUDCAD,H1) Order not sent!AUDCAD返回代码=客户终端不允许AutoTradeTrans。

2015.02.05 23:36:34.581 MQL5 'TestTradeTrans.mq5'成功编译了。

我已经设法禁用了它,否则它就会淹没整个终端。

Z.I.顺便说一下,不要试图把这个代码嵌入到文章中。这个例子在任何情况下都是不可接受的,因为它在每一次打勾 时都会产生可怕的垃圾订单!!。

 
C-4:

谢谢,我不觉得有什么问题。

我设法把它关掉了,否则弹跳会淹没整个终端。

:)

1.森林的例子

2.不能放支架点吗?

3.我的印象是,你在通过一条线阅读信息 :)

让我们这样做吧。

我问你问题,你回答他们,好吗?

问题1:如果没有TradeTransaction事件到来(或没有使用),如何识别订单票(通过发送OrderSendAsync 命令)?