//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 12.03.2008 |//| Описание : Возвращает флаг существования ордеров. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любой ордер) |//| mn - MagicNumber (-1 - любой магик) |//| ot - время открытия ( 0 - любое время установки) |//+----------------------------------------------------------------------------+boolExistOrders(stringsy="", intop=-1, intmn=-1, datetimeot=0){inti, k=OrdersTotal(), ty;
if(sy=="0")sy=Symbol();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ty=OrderType();
if(ty>1 && ty<6){if((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)){if(mn<0 || OrderMagicNumber()==mn){if(ot<=OrderOpenTime())return(True);
}}}}}return(False);
}
if (err==146)
{
while (IsTradeContextBusy())
{
if (IsTradeAllowed()) break;
else
Sleep(1000*1,1);
}}
我认为这是一个更快的解决方案。请分享您的意见。
谢谢你。
你对这个变体有什么看法。
在我看来,这是一个更快的解决方案。我是这样工作的。评论。
谢谢你。
我将会很好地接受。带着理解。暂停的时间更少,工作更快。但你的版本中存在一些不合理的冗余。
IsTradeContextBusy 函数返回贸易线程占用的标志。在第195次建造之前,根本没有这样的功能。因此,我们使用了IsTradeAllowed 函数,该函数返回一个符号,表明EA被允许进行交易,并且交易流是自由的。
我们通过在EA属性对话框(F7键)中勾选 "允许EA进行交易 "的选项,允许EA进行交易。
错误146(贸易流繁忙)与允许专家顾问进行交易没有关系。因此,让我们回顾一下IsTradeAllowed 函数的属性,因为它们只与交易线程有关。
所以,交易线程是自由的,IsTradeAllowed 函数返回True。交易线程很忙,IsTradeAllowed 函数返回False。现在让我们看一下IsTradeContextBusy 函数返回的值。交易线程是自由的,IsTradeContextBusy 函数返回False。交易线程很忙,IsTradeContextBusy 函数返回True。我们可以看到,对于相同的贸易流状态,IsTradeAllowed 和IsTradeContextBusy 函数的值是相反的。此外,这些功能在贸易流动状态方面是相互重复的,而不是相互补充的。因此,可以排除其中一个。哪一个?IsTradeAllowed 函数,正如我在上面已经提到的,除了交易流状态标志,还返回允许EA交易的标志,在这种情况下,即处理错误146(交易流繁忙)时,对我们来说是没有必要的。因此,只使用一个函数IsTradeContextBusy 就足够了。如果你执行上述缩写,你的代码将被简化为我的。
唯一的区别是停顿的大小。但这是一个品味、个人偏好、交易风格等方面的问题。你可以放一个0.1秒的停顿。这不是什么大问题...我只是更喜欢11秒。在SetOrder 函数中发现了两个错误。
注意!带 SetOrder 功能的在线交易的帖子已被纠正。这个功能有点长。它不适合放在整个柱子里,所以不得不移到拖车上。
在这篇文章中,我决定给出解释SetOrder 函数如何工作的要点。我自己不从事订单工作,也就是说,我在这里是在别人的领域。也许知道SetOrder 函数如何工作的人可以提出改进建议或发现错误。
1.在第一行代码中,局部变量被声明,其中一些变量被初始化。例如,在lsComm中,写的是EA的名称和GetNameTF 函数返回的时间框架的名称。顺便说一下,我不打算在GetNameOP、GetNameTF、Message 等函数上多说,只有在有人对它们有疑问时才会说。
2.检查收到的参数。如果sy 是空的,它将以当前工具的名称初始化。图表上图标的颜色变量由操作类型初始化。如果订单的非零到期时间小于当前时间,它将被重置为零。
3.交易尝试周期的主体,其数量由全局变量 NumberOfTry 的值 限制。在SetOrder 函数的主循环内进行的操作更进一步。
4.如果SetOrder 函数在测试器中没有被执行,我们有机会终止其操作。等待贸易流释放周期在此进行。市场环境变量被更新,当前时间被记录。
5.向交易服务器发送一个请求。如果票数是正数,SetOrder 函数就会终止。
6.如果票数为负数,则进行执行错误的处理。
7.如果出现128(超时日期已过)、142(订单已排队)和143(订单已被交易商接受执行)的错误,我们会暂停66秒。暂停之后,使用ExistOrders函数(我们将在后面描述),我们检查在服务器请求和当前时刻之间的时间间隔内是否已经设置了订单。如果命令已经设定,则退出该功能。
8.项目大小以及买入和卖出价格都存储在本地变量中。
9.在错误130(不正确的止损)的情况下,如果可能的话,订单、止损和取出的价格水平会被纠正。
10.这些信息,可以帮助解决问题或以后找到错误,显示在报告中。
在最后,我们处理其他错误。有的显示长时间停顿(5分钟),有的封锁专家顾问,有的允许进一步尝试交易,等等。
就这样吧!描述完毕!
ExistOrders()函数。
返回一个存在订单的标志。回答订单是否被设定的问题。你可以使用这个功能来请求任何订单,以及更具体的订单。请求过滤器是用功能参数配置的。
如何使用ExistOrders()函数的例子。
1.检查任何订单的可用性
2.检查当前图表上任何工具的任何订单的可用性
3.检查任何工具上是否存在买入限价单
4.检查欧元兑美元是否有一个神奇号码为123456的卖出止损单
5.检查任何设置时间为2小时或更短的订单的可用性
在预告片中,有一个测试ExistOrders 函数的脚本。脚本中的前4个例子被注释掉了。警告!在 12.03.2008 07:24的帖子中,我已经替换了SetOrder.mq4的附件