Бред. Какая связь между кэшем, где сохраняются данные о запрашиваемой позиции, и транзакциями?
prostotrader, у Вас там с логикой алгоритма наверное что-то не то. Хотел было покопаться в чужом коде, но влом... потом тип исполнения тут:
request.type_filling=ORDER_FILLING_IOC; // разве так?
request.type_filling=ORDER_FILLING_RETURN; // а может так?
И вообще в каких университетах так учат кодировать?
Karputov Vladimir 并简化OnTradeTransaction()--考虑只将交易添加到历史中--没有订单
你会没事的,甚至不用写了(不要浪费你的时间)。
我开始研究它,因为真实的那台机器正在崩溃。
看起来他们在周末升级了服务器。毫秒的时间到了。可能会有更多的惊喜。
显然,OnTradeTransaction 功能是独立于交易日志工作的。
我认为该函数的这种行为是合理的--没有必要放慢操作流程,等到日志写完,一切都计算完毕。
在你的情况下,使用OnTrade 可能更好。
或等待并定期检查,当交易出现在历史上时,要有最小的停顿。
看起来他们在周末升级了服务器。毫秒的时间出现了。可能会有更多的惊喜。
显然,OnTradeTransaction 功能是独立于操作日志工作的。
我认为函数的这种行为是合理的--没有必要放慢操作流程,等待所有的东西都写入日记并计数。
在你的情况下,使用OnTrade 可能更好。
或等待并定期检查,当交易出现在历史上时,要有最小的停顿。
嗨,Sergei!
是的,我们做到了,但不是在周末,而是在星期四晚间会议之后(问了我的经纪人)。
我不能使用Trade()事件并等待终端中的数据更新。
专家顾问是很久以前写的,直到最近它还 "像时钟一样 "工作(也许我很幸运,TRADE_TRANSACTION_DEAL_AD 事件总是第一个到达)。
对专家顾问来说,尽快执行对等交易是很重要的,这就是为什么异步模式和OnTradeTransaction()。
现在,专家顾问(有时)发送重复的订单来打开和关闭头寸。
你: "我认为函数的这种行为是合理的,没有必要放慢操作流程,等待所有的东西都写进日记并统计出来"。
总之,在TRADE_TRANSACTION_DEAL_ADD 到达后,一切都被写入和计算了:)
问题是,TRADE_TRANSACTION_DEAL_ADD可能会丢失,TRADE_TRANSACTION_HISTORY_ADD可能会出现,然后终端会有过时的位置数据。:(,
这实际发生的。
奇怪的是,开发人员没有想到这一点。
TRADE_TRANSACTION_HISTORY_ADD只有在订单被执行或被删除(取消)时才出现,因此
如果订单状态发生变化(分别是位置可以改变),终端应该收到关于位置变化的信息。
即使TRADE_TRANSACTION_DEAL_ADD丢失了
让我们看看开发商是怎么说的。
Karputov Vladimir 并简化OnTradeTransaction()--考虑只将交易添加到历史中--没有订单
你会没事的,甚至不用写了(不要浪费你的时间)。
请 "教师 "和 "知识分子 "就实质问题发言。
而不仅仅是为了把他们的脚放在柱子上,以表明观点。
在向想要帮助你的人炫耀之前,你应该正常拟定你的问题。如果部分平仓是由OrderSend()函数 执行的,那么异步发送订单与它有什么关系?你问的是什么问题?
很好!
这应该被看作是帮助吗?
而卡尔普托夫与此无关,只是当我写我的帖子时,他已经发了他的帖子,我没有看到。
最初,问题是这样提出的(怕你懒得先看)。
如何建立日志来向开发者显示错误?
为什么,我自己做了,日志清楚地表明
在TRADE_TRANSACTION_HISTORY_ADD 之后(在TRADE_TRANSACTION_DEAL_ADD之前)。
终端不更新位置信息。
prostotrader,Dimitri正确地告诉你,部分(和全部)闭包在你的代码中不是异步的,而是同步的。这意味着该程序正在等待来自服务器的响应...
很可能OnTradeTransaction 被触发的速度比头寸本身的变化快。
然后在这里。
你可以尝试循环进行位置检查。也许这将有助于....
它是这样的。
如果不知道确切的算法( 你需要从程序中得到的那部分),就很难评估其实现的正确性...
完全改为异步模式
但一切都没有改变
这很明显,但“为了纯粹”的实验......
地下室的完整日志
1.>如果不知道确切的算法(你需要从程序中获得),就很难评估它是否实施正确......
以为不难理解这个程序的作用,好吧,如果不清楚,那么
专家顾问在FORTS市场上开仓,成交量为2份合同;如果开仓,则部分平仓,成交量为1份合同。
则该位置将被完全关闭。重复这个过程,直到计数器tr_cnt<50为止。
2.你可以 "运行 "PositionSelect()一百万次--它不会改变什么,因为
TRADE_TRANSACTION_DEAL_ADD 事件将不会被收到, 直到你进入循环,因此,终端将不会更新
职位信息
...
我在上面说过--不要被订单冲昏头脑:看一下交易情况。这里有一个简短的代码,显示了什么时候仓位量发生变化以及是什么类型的交易。
这里是印刷品,在部分关闭时。
你可以清楚地看到,只要一个交易类型为TRADE_TRANSACTION_DEAL_AD 的事件过去了,就是这样,终端的头寸数据就会被更新。