求救!关于两个EA同时运行的问题。

 

各位高手:我现在有两个不同的EA,分别运行不同的货币对。但现在发现一个新问题 :

total=OrdersTotal();
if(total<2)..... 由于两个程序的开头都是这样的,所以,有时候一个货币对连续开两单,这样另外一个货币就无法开单。麻烦各位帮忙解决一下。十分感谢。

 
wang 写道 >>

各位高手:我现在有两个不同的EA,分别运行不同的货币对。但现在发现一个新问题 :

total=OrdersTotal();
if(total<2)..... 由于两个程序的开头都是这样的,所以,有时候一个货币对连续开两单,这样另外一个货币就无法开单。麻烦各位帮忙解决一下。十分感谢。

检查你的定单的symbol,并对其计数,大于1就不开仓。

 
hexinchen 写道 >>

检查你的定单的symbol,并对其计数,大于1就不开仓。

很感谢您,可是我真的还不是很明白,我把我的程序COPY一下,麻烦您帮忙指点一下,

totalopen=OrdersTotal();
if (totalopen<2)
{
if((MacdPPrevious-SignalPPrevious)<0 && diff>dea)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,ask,3,0,0,"try2 sample",999,0,Green);
if(ticket<0)
{RefreshRates();}
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());
return(0);
}

if((MacdPPrevious-SignalPPrevious)0 && diff<dea)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,bid,3,0,0,"try2 sample",999,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}

else Print("Error opening SELL order : ",GetLastError());
return(0);
}
return(0);
}
// it is important to enter the market correctly,
// but it is more important to exit it correctly...

for(cnt=0;cnt<totalopen;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS,MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
if((diffpprevious-deapprevious)<0 && diff<dea )
{
OrderClose(OrderTicket(),OrderLots(),bid,3,Violet);
Print("30mins buy cross",OrderClosePrice());
return(0); // exit
}
if((MacdPPrevious-SignalPPrevious)>0 && diff>dea &&(TimeCurrent()-OrderOpenTime())>300)
{
if( OrderStopLoss()!=NormalizeDouble(open-modifysl*point,digits)&& OrderTakeProfit()!=NormalizeDouble(open+modifytp*point,digits))
}

}
else
{
if(OrderType()==OP_SELL)
{
if((diffpprevious-deapprevious)*(diffprevious-deaprevious)<0 && diff>dea &&(TimeCurrent()-OrderOpenTime())>300)
{
OrderClose(OrderTicket(),OrderLots(),ask,3,Violet);
Print("30mins sell cross",OrderClosePrice());
return(0); // exit
}

if((MacdPPrevious-SignalPPrevious)<0 && diff<dea &&(TimeCurrent()-OrderOpenTime())>300)
{
if( OrderStopLoss()!=NormalizeDouble(open+modifysl*point,digits )

{
OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(open+modifysl*point,digits),NormalizeDouble(open-modifytp*point,digits),0,Green);
}
}
}

return(0);
} ..........大概就这样的,另外一个程序和这个程序有点类似,前面红色的部分都是一样的,这样每次开单的时候,一种货币同时会开两单,我是想达到交叉开单的目的,就是每种货币开一单。

请您 帮忙一下,十分感谢。

 

改变下思路吧。用订单总数控制EA开仓个人认为是一种很差劲的方式。

建议采用如下方式。

1、用OrderMagic标记订单。

2、开仓前根据OrderMagic()和OrderSymbol()遍历查找所有已开仓位。

3、找到,就不开仓,没找到再发送开仓命令。

 

需要修改ea的思路。

原ea的思路没有考虑多次运行的情况。因此,可以用OrdersTotal() < 2来做。

新的ea,可以这样考虑。同一个ea有多个运行实例。因此服务器上有N个开仓单都是同一个ea发出的。每个ea在发出开仓单后,在程序中保存对应的订单编号。以后只需要检查订单编号是否存在就可以了。

 
2个货币用2个不同magic number
 

计算订单时不要用total=OrdersTotal();
if(total<2).....

换成 orderselect(。。。)

if ordersymbol=。。。 and ordertype==op_buy

orderbuy++

在判断orderbuy的数量

记住在最后要把orderbuy归零

sell同理

for(int i=OrdersTotal(); i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()== Symbol() )

{
if(OrderType()==OP_BUY ) {orderbuy++;}
}
//


//
{
if(OrderType()==OP_SELL ) {ordersell++; }
}
//

//

}

 
wang 写道 >>

各位高手:我现在有两个不同的EA,分别运行不同的货币对。但现在发现一个新问题 :

total=OrdersTotal();
if(total<2)..... 由于两个程序的开头都是这样的,所以,有时候一个货币对连续开两单,这样另外一个货币就无法开单。麻烦各位帮忙解决一下。十分感谢。

int exitorder ()
{int isorder=0;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
if(OrderMagicNumber()!=MAGIC|| OrderSymbol()!=Symbol()) continue;
if(OrderType()==1 || OrderType()==0)
isorder++;
}
// Print("11",isorder);
return(isorder);

}

原因: