我正在制作一个项目,要求我放置 BUYSTOP
和 SELLSTOP
一对订单,然后在下一个栏上如果没有触发这些订单,则删除它们并放置新订单。
这是我的代码:
if(logic == true && OrdersTotal() == 0)
{bool res = OrderSend(....);}
if(OrdersTotal() != 0)
{
if(ordertype == OP_BUY || ordertype == OP_SELL)
{
bool del = OrderDelete(....);
}
}
此代码在我测试时正确下订单并删除它们。
但是当EA在实时服务器上处于活动状态时,它不会打开订单,因为该平台已经开启了其他工具的订单。
我敢肯定会有一个简单的方法可以解决这个问题,但由于我是新手,我无法理解这一点。
答案 0 :(得分:0)
目前尚不清楚您是否使用幻数和符号检查。 你应该检查......
int _ordersTotal = OrdersTotal()-1;
for (int i = _ordersTotal; i >= 0; i--){
if (OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;
....
}
在不同的实现中,即你可以创建一个函数(字符串符号)来检查你是否有一些指定符号的工作订单。
答案 1 :(得分:0)
Measure twice before cut once
OrderDelete()
之前检查实际上有四个值(三个用于挂件)子> 正如您的定义所述,处理{ OP_{BUY|SELL}STOP }
订单时,需要检查以下三项:
Symbol()
匹配(不会因删除其他EA或手动订单而导致不必要的副作用)OrderType()
匹配(不会忽略订单的实际状态{ PENDING | AT_MARKET }
和方向{ BUY | SELL }
)OrderMagicNumber()
匹配(不会忽略可为每个人设置的UUID
选择器实用程序OrderSend()
)那么,让我们勾勒出检测过程:
int myEaContextAwareMagicNUMBER = ...;
for ( int ii = OrdersTotal();
ii >= 0;
ii--
)
if OrderSelect( ii, SELECT_BY_POS, MODE_TRADES )
{
if ( OrderSymbol() != _Symbol
&& OrderMagicNumber() != myEaContextAwareMagicNUMBER
&& OrderOpenTime() >= Time[1] // Prev. Bar
&& !( OrderType() == OP_BUYSTOP
|| OrderType() == OP_SELLSTOP
)
) continue; // __^ __^ __^ __^ __^ __^ loop for next test
// -------------------------------------------+
// FINALLY PROCESS THE MATCHING OrderDelete() |
// -------------------------------------------+
...
..
.
// -------------------------------------------+
}
else Print( "WARN: OrderSelect() failed at db.POOL.SELECT(), RECORD_NUMBER == ", ii );
那么如何删除未触发的挂起已完成。
接下来是关于
的评论“......当ea在实时服务器上处于活动状态时,它不会打开订单,因为该平台已经开启了其他工具的订单。”
如果没有提供准确的 { GetLastError() | _LastError }
值,很难提供任何建议。
某些帐户类型的某些代理确实限制了OrderSend()
接受政策,因此除GetLastError()
值外,相应的经纪商条款和条件也适用。
Do not hesitate to ask more & may enjoy other Questions/Answers in MQL4
domain.