帮助。为什么EA不关闭交易

 

你好,朋友们。

我需要你的帮助。

我建立了一个EA,其过程的一部分是使用一个函数来关闭一个交易。这里是相关的kod的行数。

有人能帮助我吗,为什么EA没有关闭交易?谢谢你。

(也许,因为我在主要部分使用了ORDERSELECT ,但它不能在函数中使用ORDERSELECT,也就是????)

for(int cnt=0; cnt < OrdersTotal(); cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)。

如果( OrderSymbol() == Pair && OrderType() == OP_BUY )

{

如果 ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) *factor*TP )

{

CLOSE_Single_P(Pair, "LONG", OrderTicket(), OrderLots())。

}

}

}

...

...

...

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

void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)

{

int Code, sig;

双PRC。

如果 ( TREN == "LONG" )

Code = 0;//OP_BUY

否则

如果 ( TREN == "SHORT" )

代码 = 1;//OP_SELL

for ( int k=0; k < OrdersTotal(); k++ )

{

OrderSelect(k, SELECT_BY_POS, MODE_TRADES)。

if( OrderSymbol() == SYMB && OrderType() == Code && OrderLots() == LOTT && OrderTicket() == TICKET )

{

如果 ( OrderType() == OP_BUY )

PRC = MarketInfo(OrderSymbol(),MODE_BID)。

否则

如果 ( OrderType() == OP_SELL )

PRC = MarketInfo(OrderSymbol(),MODE_ASK)。

OrderClose(TICKET,LOTT,PRC,Slippage,Yellow)。

休息。

}

}

返回。

}

 

请使用SRC按钮来显示你的代码,以便更好地阅读 :)

你的OrderSelect()的编码方式是错误的。把你的代码和这个比较一下。 然后,如果你还有问题,请回信 :)

   for(int cnt=0; cnt<OrdersTotal(); cnt++)
     {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true &&
          OrderSymbol()==Pair && 
          OrderType()==OP_BUY)
          {
          // code to close
          }
      }
 
crossy:

你好,朋友们。

我需要你的帮助。

我建立了一个EA,其过程的一部分是使用一个函数来关闭一个交易。这里是相关的kod的行数。

有人能帮助我吗,为什么EA没有关闭交易?谢谢你。

当你有一个循环,并且你正在关闭或删除(待定)订单时,你必须 倒数,而不是 上升。

为什么你在Close_Single_P函数里有一个循环? 它不是用来关闭一个订单的吗? 当你调用该函数时,你传递符号、票号、订单类型 和头寸大小 ...... 这就是你关闭订单所需要的 ...... 几乎,你需要关闭的价格,为此你可以使用OrderClosePrice() ,然后你不需要担心它是买还是卖 ...... 事实上,只要摆脱这个函数,使用这一行来代替函数调用 ......

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow);

顺便问一下,你是在哪里设置滑点的?

当你使用订单函数时,它们会返回一个值 ......这个返回值告诉你函数是否起作用 ......学会使用这个返回值,如果它告诉你有一个问题,使用打印语句将相关信息报告给日志 ......那么你将知道什么地方出了问题,而不是猜测 ......

你是否验证了这一点 . . .

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )

. . .是真的吗?

为什么不添加一个打印语句,如果该行是真的,就执行该语句 ......那么你就会知道它是或不是 ......

if ( MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT)*factor*TP )
   {
   Print("Trying to close Order: ", OrderTicket());                             // <---- tells you that the   if  returned true
   if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)
      Print("OrderClose failed, error # ", GetLastError());                          // <------- reports the error if the OrderClose failed . . 
   }
 
onewithzachy:

请使用SRC按钮来显示你的代码,以便更好地阅读 :)

那么GetLastError()的回报是什么?


这段代码大约有4000行...

总之,我没有得到任何错误按摩。

 
crossy:


这段代码大约有4000行......。

总之,我没有得到任何错误的按摩。

你不需要把你的所有 代码 贴出来 ..但是当你发布任何 代码时,请使用SRC 按钮。

你没有得到任何错误信息,因为你没有把它们报告给日志 ..你必须检查 返回值并报告错误。

 
RaptorUK:

当你有一个循环,并且你正在关闭或删除(挂单)订单时,你必须 倒数,而不是 上升。

为什么你在Close_Single_P函数里有一个循环? 它不是用来关闭一个订单的吗? 当你调用该函数时,你传递符号、票号、订单类型和头寸大小 ......这就是你关闭订单所需要的全部 ......好吧,你几乎需要关闭的价格,为此你可以使用OrderClosePrice() ,然后你不需要担心它是买还是卖 ...... 事实上,只要摆脱该函数,使用这一行来代替函数调用 ... .

.......顺便问一下,你是在哪里设置滑点的?

当你使用订单函数时,它们会返回一个值 ......这个返回值告诉你函数是否起作用 ......学会使用这个返回值,如果它告诉你有一个问题,使用打印语句将相关信息报告给日志 ......那么你将知道什么地方出了问题,而不是猜测 ......

你的订单是否应该被关闭?

....是真的吗?

为什么不添加一个打印语句,如果该行是真的,就执行该语句 ... ...那么你就会知道它是或不是 ... ...。


谢谢Raptor的明智提议。你总是明智地、清晰地帮助我。

我将尝试你刚才的建议。

最好的祝愿。

 

你已经选择了票据,为什么还要通过第二个orderSelect循环来寻找同样的票据?

你为什么不检查 OrderClose的返回值并打印出错误以找出原因?

 
WHRoeder:

你已经选择了票据,为什么还要通过第二个orderSelect循环来寻找同样的票据?

你为什么不检查OrderClose的返回值并打印出错误以找出原因?


好了,朋友们,谢谢你们的努力。

我做了一些修改,但没有任何帮助,直到我看到WHRoeder的评论。

你是个天才,我认为你是对的。

我将在周一 尝试修改后的EA。

祝你周末愉快。

 
crossy:


好了,朋友们,谢谢你们的努力。

我做了一些修改,但没有任何帮助,直到我看到WHRoeder的评论。

你是个天才,我认为你是对的。

我将在周一尝试修改后的EA。

祝你周末愉快。


好吧,我的朋友们。

我做了你所有的建议 - 但EA失败了。

还有什么想法吗?

 

让我们再做一次

  #include "..\libraries\stdlib.mq4" // drag and drop from libraries to very top of your code
  
  for(int cnt = OrdersTotal(); cnt >= 0; cnt--)  // from RaptorUK, count it down to zero 
     {
     if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES) == true && OrderSymbol() == Pair) // this is how to write OrderSelect()
        {
        if(OrderType()== OP_BUY) // the code below is to close buy position only
          {
          
          //---
           if(MarketInfo(Pair,MODE_BID) >= Open_P_BUY + MarketInfo(Pair,MODE_POINT) * factor * TP) // from RaptorUK, is this statemement true ?
             {
              //CLOSE_Single_P(Pair,"LONG",OrderTicket(),OrderLots()) // From RaptorUK & WHRoeder, you don't have to do OrderSelect() twice
             Print("Trying to close buy position : ", OrderTicket());                            
             if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), Slippage, Yellow)) // From Raptor UK, are you doing the slippage correctly ?
                Print("failed to close buy position ", ErrorDescription(GetLastError())  ); 
             }
             else
             {
             Print ("Not qualify to close buy position ", OrderTicket()); // from RaptorUK, is this statemement true ?, if not this print will tell you
             }
          //---
             
           }
           /*
           else
           {
           if (OrderType() == OP_SELL)
              {
              
              }
           }
           */
        }
     }
      

当我还在读瓦伦蒂诺-罗西的MotoGP勒芒赛第二次领奖时,我希望我写得正确 :)

 
onewithzachy:

让我们再做一次

当我还在读瓦伦蒂诺-罗西的MotoGP勒芒赛第二次领奖时,我希望我写得正确 :)


谢谢onewithzachy。

首先,我认为你有一个小错误,那就是。

for(int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--)

你必须添加绿色和粗体的修正。

但是,我不明白下面这一行对我们有什么帮助?

#include "...\libraries\stdlib.mq4"

谢谢,Y。

原因: