做了一个2个EMA交叉的EA,需要建议 - 页 4

 
prupru:

我现在有一个更大的问题,我的经纪人倾向于部分执行订单。

亲爱的客户。

请注意,您的交易已被部分打开(15.84中的2.32手),价格为587.318。

如果您对这个问题有任何其他问题,不要犹豫,请联系我们。

亲切的问候。

经理。

这里是支持说的。

请注意,在高波动性或低流动性期间,限价订单可能被部分执行。这意味着,如果价格得到满足,该仓位将立即得到全部或部分填补。在您的情况下,您的订单被部分执行,这就是您收到通知信的原因。

我知道如何关闭所有订单,尽管它们被部分关闭,我只需要在OrdersTotal()>0 时关闭所有订单,但我不知道当订单部分打开时该怎么办。

编辑。

我刚刚意识到,我必须检查适当的Symbol和magicnumber订单,这就有点困难了

编辑:这里是关闭所有订单的函数,即使是部分关闭的订单也应该关闭。


//Close all my Orders
void CloseAllOrders()
{
int notMyOrders = 0;

 while (OrdersTotal()>notMyOrders)
 {
 notMyOrders = 0;
 for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
   if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) {notMyOrders++; continue;}
   if(OrderType()<= 1)CloseOrder();
         
   }
 }
return;
}  
重写的
 
deVries:

重写


这对我来说有点棘手,我读了4、5遍才明白。谢谢!

还有......如果OrderSelect 返回错误会怎样?

Orderselect返回false的频率是多少?这有可能吗?

 
prupru:


哇哦

这对我来说有点棘手,我读了4、5遍才明白。谢谢!

还有......如果OrderSelect 返回错误会怎样?

Orderselect返回false的频率是多少?这有可能吗?


for(int i = OrdersTotal()-1; i >= 0 ; i--)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;

i= 0

从循环中回来

i = -1

如果(OrderSelect(-1,SELECT_BY_POS,MODE_TRADES)==false) break;// ==> 结束检查 交易,我们打破循环。

下一个CloseOrder()

//CloseOrder
void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(10);
 RefreshRates();
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,Slippage,CLR_NONE))
  {
   Print("Close order error: ",GetLastError());
   Print("Type ", OrderType()," PR ",PR, " Ask ", Ask, " Bid ", Bid, " OrderTicket ", OrderTicket(), " OrderLots ", OrderLots());
  }
return;}
//--------------------------- end of close order

GetLastError() 可以返回哪些常见的错误?

如果平仓失败,可能下一个交易也会失败,因为有一个错误,如tradecontext太忙或其他错误......

那么你能做些什么来避免很多这种情况的发生呢?

 
deVries:


那么你能做些什么来避免很多这种情况的发生呢?

还不知道。我得好好想想。

我现在被另一个问题所困扰。

我把我的EA放在WINDOWS 2003 VPS上,现在它出现了 "因超时而终止 "的错误,但我在家里的电脑上从未见过这种错误。

而且这个错误不是在我的平仓和开仓循环运行的时候出现的,而是在expert jush检查穿越和闲置的时候出现的。

我的意思是,程序检查新条形图,trailingstop = 0,所以没有调用尾随止损功能,然后如果新条形图打开,它检查EMA交叉,没有交叉(我得到超时错误的时候,EMA线离交叉还很远),所以程序返回(0)

没有任何周期!它怎么能被超时终止呢?

 
prupru:

还不知道。我得考虑一下。

我现在被另一个问题所困扰。

我把我的EA放在WINDOWS 2003 VPS上,现在它返回 "因超时而终止 "的错误,但我在家里的电脑上从未见过这样的错误。

而且这个错误不是在我的平仓和开仓循环运行的时候出现的,而是在expert jush检查穿越和闲置的时候出现的。

我的意思是,程序检查新条形图,trailingstop = 0,所以没有调用尾随止损功能,然后如果新条形图打开,它检查EMA交叉,没有交叉(我得到超时错误的时候,EMA线离交叉还很远),所以程序返回(0)

没有任何周期!它怎么能被超时终止呢?


这不是一个周期吗?

while(!IsTradeAllowed()) Sleep(10);
 
deVries:


这不是一个周期吗?


我的意思是在EA被终止的时候,EMA线还远未交叉,所以没有调用NewOrder函数,所以你所说的周期(在NewOrder函数内)没有运行。

增加了IsStopped条件

while( (!IsTradeAllowed()) && (!IsStopped()) ) Sleep(10);
while ( (LotRemains>0) && (!IsStopped()) )
while ( (OrdersTotal()>0) && (!IsStopped()) ) 
 
也许超时错误的出现是因为我用完了VPS的处理器资源。我已经切换到一个更昂贵的计划,我没有看到他们,直到我运行一些沉重的东西,如windows uodate。