把“ for(cont=0;cont<OrdersTotal( );cont++)” 改为 for(cont=OrdersTotal()-1;cont>=0;cont--)
这个问题,看来普遍存在啊
for(cont=0;cont<OrdersTotal( );cont++)
{
OrderSelect(cont, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol())
{
OpenOrders++;
OrderTypeHere=OrderType();
break;
}
}
加的break加的不是地方吧 你这里加了break 找到第一个符号要求的单子,然后就跳出循环了 和没写循环没什么区别吧
大伙可以用SRC按钮引用代码~
楼上说的也是一个原因:
for(cont=0;cont<OrdersTotal( );cont++) { OrderSelect(cont, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() == Symbol()) { OpenOrders++; OrderTypeHere=OrderType(); break; } }
这里加break后会在找到当前图表的第一个单后即跳出循环。
根本原因就是 OrderSelect(cont, SELECT_BY_POS, MODE_TRADES);你永远只是选中了一个单(准确说就是你所有单中第一个symbol等于当前图表symbol的单),所以后面OrderXxxx()这些函数都是针对同一个单处理的,除非该单关闭才进入下一个。modify sl处理需要放到循环里做。
如有技术问题可以加我新开的专业群交流:309856361
写了个EA,主要思路是手动下单,之后通过EA调止损,问题是只能调第一张的,如果原本有2张以上的单,第二张就没反应,请高手看看该怎么改。
//+------------------------------------------------------------------+
//| 3ATR止损.mq4 |
//| Copyright ?2010, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright ?2010, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern int SlipPoints=5;//滑点
extern int ATRtime=240;
extern int NATR=3;
int start()
{
int cont,OpenOrders=0,OrderTypeHere;
//----
for(cont=0;cont<OrdersTotal( );cont++)
{
OrderSelect(cont, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == Symbol())
{
OpenOrders++;
OrderTypeHere=OrderType();
break;
}
}
if(OpenOrders>=1)
{
if(OrderTypeHere==OP_BUY)//多单
{
if(Bid-OrderOpenPrice()>NATR*iATR(NULL,0,ATRtime,0))
{
if(OrderStopLoss()<Bid-(NATR*iATR(NULL,0,ATRtime,0)))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(NATR*iATR(NULL,0,ATRtime,0)),OrderTakeProfit(),0,Green);
return(0);
}
}
else if(OrderStopLoss( )==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-(NATR*iATR(NULL,0,ATRtime,0)),OrderTakeProfit(),0,Green);
return(0);
}
}
else//空单
{
if((OrderOpenPrice()-Ask)>(NATR*iATR(NULL,0,ATRtime,0)))
{
if((OrderStopLoss()>(Ask+NATR*iATR(NULL,0,ATRtime,0))) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+NATR*iATR(NULL,0,ATRtime,0),OrderTakeProfit(),0,Red);
return(0);
}
}
else if(OrderStopLoss( )==0)
{
OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+NATR*iATR(NULL,0,ATRtime,0),OrderTakeProfit(),0,Red);
return(0);
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+