打开相反的订单

 

大家好。

希望得到你们的帮助来处理这个问题。

当一个订单打开后,价格低于订单的开仓价,我想开一个相反的订单。

在这种特殊情况下,我试图使用这个代码,但没有成功。谁能帮帮我?

谢谢

路易斯

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)*UsePoint<OpenPrice)
     {      
     SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(SellTicket>0)AddLimitsSell();
      }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)*UsePoint>OpenPrice)
     {      
     BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket>0)AddLimitsBuy();
      }
     }
    }
   }
  }
 
luisneves:

大家好。

希望得到你们的帮助来处理这个问题。

当一个订单打开后,价格低于订单的开仓价,我想开一个相反的订单。

在这种特殊情况下,我试图使用这个代码,但没有成功。谁能帮帮我?

谢谢

路易斯

你能不能回答这个问题,这将对你有很大的帮助。

1.OrderSelect()的返回值是什么 - 阅读OrderSelect的文档会帮助你回答这个问题。

2.2.当你发送订单失败时,会出现什么错误?

 
luisneves:

大家好。

希望得到你们的帮助来处理这个问题。

当一个订单打开后,价格低于订单的开仓价,我想开一个相反的订单。

在这种特殊情况下,我尝试使用这个代码,但没有成功。谁能给我一些帮助?

如果你能解释你为什么使用这个变量,你可能会明白你的问题是什么 ... ...另外 ...OpenPrice 的值来自哪里?


你不想知道你的OrderSend()是否有效吗? 如果失败了,你不想知道原因吗?你不想知道失败时的相关变量是什么吗?

请阅读:什么是函数的返回值?我如何使用它们?

 

嗨,RaptorUK。

谢谢你的及时回复。

UsePoint 是为了调整5个小数点,所以是Point*10。

OpenPrice 是OrderOpenPrice()

谢谢你

路易斯

 
luisneves:

嗨,RaptorUK。

谢谢你的及时回复。

UsePoint 是为了调整5个小数点,所以是Point*10。

你能解释一下为什么你在这种情况下使用它吗?

 

嗨,RaptorUK。

你是对的。我只需要把它用于止盈和止损(我想......)。

 
luisneves:

嗨,RaptorUK。

你是对的。我只需要把它用于止盈和止损(我想......)。

谢谢你的回答和思考 :-)
 

嗨,RaptorUK。

我看了一下你提供的链接,在代码中加入了错误程序,刚刚返回的错误是:2012.11.06 06:40 market order ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

然后我在代码中对OrderSelect和使用Ticket做了一些修改,但事情还是没有进展。我还搜索了一下其含义,发现是ERR_INVALID_FUNCTION_PARAMVALUE(4051),不幸的是我不知道

如何从这里得到...

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect(Ticket,SELECT_BY_TICKET);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)<OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(Ticket>0)AddLimitsSell();
      } 
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)>OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(Ticket>0)AddLimitsBuy();
      }
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
      
      
     }
    }
   }
  }


 
luisneves:

嗨,RaptorUK。

我看了一下你提供的链接,在代码中加入了错误程序,刚刚返回的错误是:2012.11.06 06:40 market order ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

然后我在代码中对OrderSelect和使用Ticket做了一些修改,但事情还是没有进展。我还搜索了一下其含义,发现是ERR_INVALID_FUNCTION_PARAMVALUE(4051),不幸的是我不知道

如何从这里得到...

你需要检查你发送给OrderSend()函数 的值 ......它们的类型是否正确? 例如,UseSlippage 必须是一个int,听起来像是一个bool ...... LotSize 是一个双数 ? 它在正确的范围内吗? 大于Min Lot,小于Max Lot,是Lot Step的倍数?
 
RaptorUK:
你需要检查你发送给OrderSend()函数的值 ......它们的类型是否正确?例如,UseSlippage 必须是一个int,听起来像是一个bool ...... LotSize 是一个双数 ?它在正确的范围内吗?大于Min Lot和小于Max Lot,并且是Lot Step的倍数?


嗨,RaptorUK。

很抱歉占用你的时间,可能你开始厌倦我了。所以Slippage是一个int,LotSize是一个double....,事情还是很糟糕....。

我真的很努力去理解这个问题,但似乎我的无知占了便宜(...)

有的时候,似乎是测试器的一些问题,然后我在Demo上尝试。在这里,如果价格低于(买入)OrderOpenPrice,我就不能有一个相反的订单开仓。

请你看一下附件中的代码。

我不希望你为我写代码,而只是提供一点帮助。

请提前感谢您提供的任何帮助,也感谢您的耐心。

路易斯

附加的文件:
 
luisneves:


嗨,RaptorUK。

很抱歉占用你的时间,可能你开始厌倦我了。所以Slippage是一个int,LotSize是一个double....,事情还是很糟糕....。

我真的很努力去理解这个问题,但似乎我的无知占了便宜(...)

有几次,似乎是测试器的一些问题,然后我在Demo上尝试。在这里,如果价格低于(买入)OrderOpenPrice,我就不能有一个相反的订单开仓。

请你看一下附件中的代码。

我不希望你为我写代码,而只是提供一点帮助。

请提前感谢您提供的任何帮助,也感谢您的耐心。

你为什么把正确的代码改为错误的代码?

你的循环是通过交易池中的所有订单(开仓和挂单)进行循环。.现在这段代码没有意义,在循环的第一遍,票据来自哪里?

 for(int Counter=OrdersTotal()-1; Counter>=0; Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect( Ticket,  SELECT_BY_TICKET);


还有一个问题要问你..为什么这个函数的类型是双倍 的,而它并没有返回任何东西?