多张单怎么调止损

 

写了个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);

}

//+------------------------------------------------------------------+

 

把“ 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

原因: