OrderSend()可能会使OrdersTotal()的结果加1
在循环开始处加这句试试
Print("i=", i, ", OrdersTotal()=", OrdersTotal());
Loong,谢谢您的回复。
//
我想问题似乎不是出在数值的增大上。
问题可能出在我的逻辑不清,改为如下也能达到我的目的,不知这样对不对,
for(int i=OrdersTotal()-1;i>=0;i--) |
逻辑问题是,你OrderSend的那一单是否算在“作为开新仓条件的已经建仓事件”判断里?
对您的回复不是很理解,我在开仓前加上Print后,开仓前后,及平仓后的显示结果是正常的
//
int SOK;
Print(" OrdersTotal()=", OrdersTotal());
if(OrdersTotal()==0)
打印结果整理如下: 19:59:02 AA EURUSD,M1: loaded successfully |
//
成交结果如下: |
---|
1 2009.12.01 16:00 sell 1 0.01 1.5078 1.5128 1.5073 0.00 10000.00 2 2009.12.01 16:00 sell 2 0.02 1.5080 1.5130 1.5075 0.00 10000.00 3 2009.12.01 16:03 t/p 2 0.02 1.5075 1.5130 1.5075 1.00 10001.00 4 2009.12.01 23:59 close at stop 1 0.01 1.5082 1.5128 1.5073 -0.40 10000.60 |
昏,换另一个时间段测试,3楼改的还是不对,1楼这个才正确开仓,但却是不合逻辑的,哪位高手能帮我看看是什么问题,谢谢! |
另,哪位朋友能告诉我当贴程序时是可以带格式的,谢谢song_song 重贴代码 |
for(int i=OrdersTotal()-1;i>=0;i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) { if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNu && OrderOpenPrice( )<Bid) { Lot=2*OrderLots( ); SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue); } break;//----为什么中断放在这里才能正确在不同价位开仓 } else return(0); } |
Print("i=", i, ", OrdersTotal()=", OrdersTotal());
是为了看循环和开仓的关系,别把i去掉。
如果把break提到嵌套if的外层,那就是只要见到旧仓,不管是不是这个EA开的,都会开新仓,意思就不对了,你不同时开MagicNu不同的仓,查不出这个错来。
想起来应该看看是不是多执行了start()
int start() {//开头加上 static int iexe = 0; Print("iexe=", iexe++); ……
for循环开头加上Print
for(int i=OrdersTotal()-1;i>=0;i--) {Print("i=", i, ", OrdersTotal()=", OrdersTotal());
看Print的结果,到底是循环错了,还是又执行了start()
您好Loong,原来我的Print语句是放在循环外的,所以我说开仓前后显示是正常的,现在放在循环里,你帮看看如何才能解决问题。谢谢您的热心。
正如您的推测,我正是想如果开仓条件没有消失,如果价格还再往上,那我就每点再开一个不同的仓,新仓要终止比前仓的价格至少高1Point。
如果同时遇到另外的条件也成立,那就另外从最小仓开始开仓,也就是说Magic不同时,会另外开仓,不过这部分我还没有写入,毕竟目前这部分我还没解决。
void OpenSellOk(int MagicNu) { int SOK; if(OrdersTotal()<1) SOK=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue); else { for(int i=OrdersTotal()-1;i>=0;i--) { Print("i=", i, ", OrdersTotal()=", OrdersTotal()); OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNu && OrderOpenPrice( )<Bid) { Lot=2*OrderLots( ); SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue); } break; } } }
成交结果如下:
1 2009.12.01 16:00 sell 1 0.01 1.5078 1.5128 1.5073 0.00 20000.00
2 2009.12.01 16:00 sell 2 0.02 1.5080 1.5130 1.5075 0.00 20000.00
3 2009.12.01 16:03 t/p 2 0.02 1.5075 1.5130 1.5075 1.00 20001.00
4 2009.12.01 23:59 close at stop 1 0.01 1.5082 1.5128 1.5073 -0.40 20000.60
//
日志结果整理如下:
22:42:17 2009.12.01 16:00 AA EURUSD,M1: open #1 sell 0.01 EURUSD at 1.5078 sl: 1.5128 tp: 1.5073 ok
22:42:17 2009.12.01 16:00 AA EURUSD,M1: i=0, OrdersTotal()=1
22:42:17 2009.12.01 16:00 AA EURUSD,M1: open #2 sell 0.02 EURUSD at 1.5080 sl: 1.5130 tp: 1.5075 ok
22:42:17 2009.12.01 16:00 AA EURUSD,M1: i=1, OrdersTotal()=2
22:42:17 2009.12.01 16:03 Tester: take profit #2 at 1.5075 (1.5072 / 1.5074)
22:42:17 2009.12.01 16:03 AA EURUSD,M1: i=0, OrdersTotal()=1
22:42:17 2009.12.01 23:59 Tester: order #1 is closed
//
//
void OpenSellOk(int MagicNu) { int SOK; if(OrdersTotal()<1) SOK=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue); else { for(int i=OrdersTotal()-1;i>=0;i--) { Print("i=", i, ", OrdersTotal()=", OrdersTotal()); OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNu && OrderOpenPrice( )<Bid) { Lot=2*OrderLots( ); SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue); if(SOK>1) break; //中断放判断开仓后 } } } }
成交结果如下:
1 2009.12.01 16:00 sell 1 0.01 1.5078 1.5128 1.5073 0.00 20000.00
2 2009.12.01 16:00 sell 2 0.02 1.5080 1.5130 1.5075 0.00 20000.00
3 2009.12.01 16:00 sell 3 0.02 1.5079 1.5129 1.5074 0.00 20000.00
4 2009.12.01 16:00 sell 4 0.04 1.5080 1.5130 1.5075 0.00 20000.00
5 2009.12.01 16:00 sell 5 0.02 1.5079 1.5129 1.5074 0.00 20000.00
6 2009.12.01 16:03 t/p 2 0.02 1.5075 1.5130 1.5075 1.00 20001.00
7 2009.12.01 16:03 t/p 3 0.02 1.5074 1.5129 1.5074 1.00 20002.00
8 2009.12.01 16:03 t/p 4 0.04 1.5075 1.5130 1.5075 2.00 20004.00
9 2009.12.01 16:03 t/p 5 0.02 1.5074 1.5129 1.5074 1.00 20005.00
10 2009.12.01 23:59 close at stop 1 0.01 1.5082 1.5128 1.5073 -0.40 20004.60
//
日志结果整理如下:
22:51:31 2009.12.01 16:00 AA EURUSD,M1: open #1 sell 0.01 EURUSD at 1.5078 sl: 1.5128 tp: 1.5073 ok
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=0, OrdersTotal()=1
22:51:31 2009.12.01 16:00 AA EURUSD,M1: open #2 sell 0.02 EURUSD at 1.5080 sl: 1.5130 tp: 1.5075 ok
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=1, OrdersTotal()=2
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=0, OrdersTotal()=2
22:51:31 2009.12.01 16:00 AA EURUSD,M1: open #3 sell 0.02 EURUSD at 1.5079 sl: 1.5129 tp: 1.5074 ok
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=2, OrdersTotal()=3
22:51:31 2009.12.01 16:00 AA EURUSD,M1: open #4 sell 0.04 EURUSD at 1.5080 sl: 1.5130 tp: 1.5075 ok
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=3, OrdersTotal()=4
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=2, OrdersTotal()=4
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=1, OrdersTotal()=4
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=0, OrdersTotal()=4
22:51:31 2009.12.01 16:00 AA EURUSD,M1: open #5 sell 0.02 EURUSD at 1.5079 sl: 1.5129 tp: 1.5074 ok
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=4, OrdersTotal()=5
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=3, OrdersTotal()=5
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=2, OrdersTotal()=5
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=1, OrdersTotal()=5
22:51:31 2009.12.01 16:00 AA EURUSD,M1: i=0, OrdersTotal()=5
22:51:31 2009.12.01 16:03 Tester: take profit #2 at 1.5075 (1.5072 / 1.5074)
22:51:31 2009.12.01 16:03 Tester: take profit #3 at 1.5074 (1.5072 / 1.5074)
22:51:31 2009.12.01 16:03 Tester: take profit #4 at 1.5075 (1.5072 / 1.5074)
22:51:31 2009.12.01 16:03 Tester: take profit #5 at 1.5074 (1.5072 / 1.5074)
22:51:31 2009.12.01 16:03 AA EURUSD,M1: i=0, OrdersTotal()=1
22:51:31 2009.12.01 23:59 Tester: order #1 is closed
如果是首仓,……;如果是已经建仓,则看是否是同一Magic号,如果是,同时现价Bid比前仓开仓价高才开仓,
可是按我的思路却得到错误的结果。
请各位高手帮看看,问题出在哪了,谢谢。
int start()
{
//----
if(OpenSellS(PERIOD_M1))
OpenSellOk(111);
if(OpenSellS(PERIOD_M5))
OpenSellOk(222);
return(0);
}
//+------------------------------------------------------------------+
void OpenSellOk(int MagicNu)
{
int SOK;
if(OrdersTotal()==0)
SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue);
else
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{
if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==MagicNu && OrderOpenPrice( )<Bid)
{
Lot=2*OrderLots( );
SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue);
}
break; //----为什么中断放在这里才能正确在不同价位开仓
}
else return(0);
}
}
}
结果如下:
1 2009.12.01 16:00 sell 1 0.01 1.5078 1.5128 1.5073 0.00 10000.00
2 2009.12.01 16:00 sell 2 0.02 1.5080 1.5130 1.5075 0.00 10000.00
3 2009.12.01 16:03 t/p 2 0.02 1.5075 1.5128 1.5075 1.00 10001.00
4 2009.12.01 23:59 close at stop 1 0.01 1.5082 1.5128 1.5073 -0.40 10000.60
//
这是我认为应该正确的思路,但执行出来却是错误的结果
//
{
Lot=2*OrderLots( );
SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue);
break; //----如果放中断在此却不能正常开仓
}
结果如下:
1 2009.12.01 16:00 sell 1 0.01 1.5078 1.5128 1.5073 0.00 10000.00
2 2009.12.01 16:00 sell 2 0.02 1.5080 1.5130 1.5075 0.00 10000.00
3 2009.12.01 16:00 sell 3 0.02 1.5079 1.5129 1.5074 0.00 10000.00
4 2009.12.01 16:00 sell 4 0.04 1.5080 1.5130 1.5075 0.00 10000.00
5 2009.12.01 16:00 sell 5 0.02 1.5079 1.5129 1.5074 0.00 10000.00
6 2009.12.01 16:03 t/p 2 0.02 1.5075 1.5128 1.5075 1.00 10001.00
7 2009.12.01 16:03 t/p 3 0.02 1.5074 1.5128 1.5074 1.00 10002.00
8 2009.12.01 16:03 t/p 4 0.04 1.5075 1.5128 1.5075 2.00 10004.00
9 2009.12.01 16:03 t/p 5 0.02 1.5074 1.5128 1.5074 1.00 10005.00
10 2009.12.01 23:59 close at stop 1 0.01 1.5082 1.5128 1.5073 -0.40 10004.60