为什么这样子才能在不同价位开单的小问题

 

我的想法是,当有条件开仓时,到函数开仓

如果是首仓,……;如果是已经建仓,则看是否是同一Magic号,如果是,同时现价Bid比前仓开仓价高才开仓,

可是按我的思路却得到错误的结果。

请各位高手帮看看,问题出在哪了,谢谢。

double Lot=0.01;
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

//

这是我认为应该正确的思路,但执行出来却是错误的结果

//

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

 

OrderSend()可能会使OrdersTotal()的结果加1

在循环开始处加这句试试

     Print("i=", i, ", OrdersTotal()=", OrdersTotal()); 
 

Loong 写道 >>

OrderSend()可能会使OrdersTotal()的结果加1

在循环开始处加这句试试

Loong,谢谢您的回复。

//

我想问题似乎不是出在数值的增大上。

问题可能出在我的逻辑不清,改为如下也能达到我的目的,不知这样对不对,

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)
{
if(OrderOpenPrice( )<Bid)
{
Lot=2*OrderLots( );
SOK=OrderSend(Symbol(),OP_SELL,Lot,Bid,3,Bid+50*Point,Bid-5*Point,"HaHa",MagicNu,0,Blue);
}
else break;
}
}
else return(0);
}

 
逻辑问题是,你OrderSend的那一单是否算在“作为开新仓条件的已经建仓事件”判断里?
 
Loong 写道
>>
逻辑问题是,你OrderSend的那一单是否算在“作为开新仓条件的已经建仓事件”判断里?

对您的回复不是很理解,我在开仓前加上Print后,开仓前后,及平仓后的显示结果是正常的

//

int SOK;
Print(" OrdersTotal()=", OrdersTotal());
if(OrdersTotal()==0)

打印结果整理如下:

19:59:02 AA EURUSD,M1: loaded successfully
19:59:02 AA started for testing
19:59:02 2009.12.01 16:00 AA EURUSD,M1: OrdersTotal()=0
19:59:02 2009.12.01 16:00 AA EURUSD,M1: open #1 sell 0.01 EURUSD at 1.5078 sl: 1.5128 tp: 1.5073 ok
19:59:02 2009.12.01 16:00 AA EURUSD,M1: OrdersTotal()=1
19:59:02 2009.12.01 16:00 AA EURUSD,M1: open #2 sell 0.02 EURUSD at 1.5080 sl: 1.5130 tp: 1.5075 ok
19:59:02 2009.12.01 16:00 AA EURUSD,M1: OrdersTotal()=2
19:59:02 2009.12.01 16:03 Tester: take profit #2 at 1.5075 (1.5072 / 1.5074)
19:59:02 2009.12.01 16:03 AA EURUSD,M1: OrdersTotal()=1
19:59:02 2009.12.01 23:59 Tester: order #1 is closed

//

成交结果如下:
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);
      }
 
> 贴程序时带格式的 --- 选中代码,按[src]
 
让你试
Print("i=", i, ", OrdersTotal()=", OrdersTotal());
是为了看循环和开仓的关系,别把i去掉。
 
你的EA的意思大概是见到自己开的旧仓就加倍开一次新仓然后break,所以逻辑上break应该加在嵌套if的最里层,但问题是OrderSend可能会改变OrdersTotal()的结果,所以循环可能不会老老实实终止。(理论上break之后就应该出来,但是它好象又回到循环开头去检查OrdersTotal()了,这样循环次数就不对了。MQL不是标准的C实现,里面好多奇怪的东西,别太相信它。)
如果把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

原因: