OrderSend()问题 - 页 2

 
Yedelkin:
我一定是错过了这样一个话题。我在哪里可以看到KimV的订单检查功能?
这是为4人准备的,但你可以去看看,可能会派上用场。你可以在他的网站上查看:"免费图书馆 "下,订购放置图书馆。
 
-Alexey-:
这是第四版的,但你可以看一下,可能会有帮助。你可以在他的网站上翻阅,在 "免费图书馆 "部分,即用于下订单的图书馆。

从四人中选一个是不行的。我使用

位置选择

选择一个开放的位置进行进一步操作。如果函数成功完成,返回true。如果函数失败,返回false。要获得有关错误的信息,请调用GetLastError() 函数。

boolPositionSelect(
字符串//工具名称
);

参数

标志

[in] 金融工具的名称。

返回的值

bool类型的值。

注意事项

对于每个符号,在任何时候都只能建立一个头寸,这是一个或几个交易 的结果。在客户终端的 "工具箱 "面板的 "交易 "选项卡中也显示的头寸和活跃的挂单 不应该被混淆。

PositionSelect()函数将有关位置的数据复制到程序环境中,随后调用PositionGetDouble()PositionGetInteger()PositionGetString() 返回先前复制的数据。这意味着该位置本身可能已经不存在了(或者它可能已经在数量、方向等方面发生了变化),但这个位置的数据仍然可以被检索出来。为了保证获得新鲜的位置数据,建议在申请之前立即调用PositionSelect()函数。

 
sergey1294:

从一个四胞胎中选出的人将不会工作。我使用PositionSelect 来定义位置

当使用PositionSelect()函数时,它"......如果函数失败则返回false",这是令人震惊的。也就是说,如果 PositionSelect()函数失败 就会返回false,而不仅仅是没有头寸。 换句话说,不能排除这样的情况:OrderSend()函数返回true,PositionSelect()函数返回false,而头寸仍然打开。
 
papaklass:
你在分析这些情况时,是在一个虱子的前夜还是在不同的虱子上?

好的,我将从以下方面着手。

一个"√"是指一个工具的价格变化。这种变化的频率是不可预测的:从每秒钟几个到每小时几个。相应地,OrderSend()和PositionSelect() 函数必须不依赖于ticks的活动。既然如此,我认为我们应该检查,以避免重复的订单(并分析相应的情况),而不涉及蜱虫的行为(频率)。

所以我觉得很难准确回答这个问题 :/。

 
papaklass:

我提出问题时不是这个意思。OnTick()事件处理程序在下一个tick到达时被触发。正因为如此,我重新表述了我的问题。

你是在一次OnTick()调用中分析这些情况,还是在不同的调用中分析?

如果在一个新的tick(用户事件)到来后,有必要向服务器发送一个交易请求,那么这个请求的成功执行的检查是在到达的tick(事件)的 "处理中 "进行的。也就是说,根据你的术语,"在一次调用OnTick()时"。[而且不管在这一处理过程中,有多少ticks(事件)到达(必须到达)]。
 
papaklass:

好吧,我还是无法得到答案,你是否在一个刻度上执行OrderSend()和PositionSelect()?

我想建议你不要在一个tick(触发OnTick())内做这些查询,而是在两个tick上做。

- 在第一次打勾时

即:如果请求响应成功,你将开仓的标志设置为buy=true,并中断OnTick()的执行,直到下一个tick(触发OnTick())操作者返回。

- 在第二个刻度线 - PositionSelect()。

在这种情况下,你不会有重复的职位空缺。

不保证在下一个tick时已经开仓。 衡量手动设置订单时开仓的时间。

我建议你把订单执行控制转移到OnTrade(),这个事件只作为服务器对交易操作 的响应而产生。

虽然我不是很清楚为什么每个订单有4个OnTrade()事件?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - Документация по MQL5
 
papaklass:

好吧,我还是无法得到答案,你是否在一个刻度上执行OrderSend()和PositionSelect()?

根据你的术语,事实证明我的OrderSend()和PositionSelect()函数是在 "一个刻度内 "执行的。

纸杯

...我想建议这些查询不是在一个tick(触发OnTick())内执行,而是在两个tick内执行。

- 在第一次打勾时

即:如果请求回复成功,你就在buy=true中设置开仓标志,并中断OnTick()的执行,直到下一个tick(触发OnTick())运算符返回

- 在第二个刻度线 - PositionSelect()。

在这个变体中,你将不会有重复的开仓。

我之前写过,函数OrderSend()和PositionSelect() 的执行与点子的出现/不出现没有关系。而且我简要地解释了原因。因此,检查 "在第二个刻度线 - PositionSelect() "不应该使我们在所有可能的情况下避免订单的翻倍。

 
Urain:

虽然我不是很清楚为什么每个订单有4个OnTrade()事件?

过去有一篇关于OnTrade()的文章。

Urain

不能保证在下一个交易日已经开仓...

这大致是我的意思。
 
papaklass:

好吧,我还是无法得到答案,你是否在一个刻度上执行OrderSend()和PositionSelect()?

我想建议你不要在一个tick(触发OnTick())内进行这些查询,而是在两个tick上进行。

- 在第一次打勾时

即:如果请求响应成功,你将开仓的标志设置为buy=true,并中断OnTick()的执行,直到下一个tick(触发OnTick())操作者返回

- 在第二个刻度线 - PositionSelect()。

在这种情况下,你不会有重复的职位空缺。

不--不是在打勾。在第一秒钟内。

这里有一个简化的说法。

所以 - 如果没有暂停,它将连续打开2个订单。但我把它设定为3秒--而且我不后悔))))。不过,这仍然是秩序的开端。


void OnTimer()
{
  while(true)
  {
     zOrderSend (_Symbol,0.1,ORDER_TYPE_BUY);

     Sleep (1); 

   if (PositionSelect(_Symbol)==true) {break;} 
  }
}
 

在MT5中计算订单是一门完整的科学:使用OnTrade()函数处理专家顾问中的交易事件

没有暂停会使你免于重新开盘,总会发生这样的情况,即订单的执行时间会延长1秒。

ps:还有,别忘了魔法。