简单问题

 

向大家问好。我创建了一个代码(修改了其他代码)用于关闭市场订单。



int l_pos_44 = 0;

如果(CheckFirstOP(OP_BUY) > 1) {

for (l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {

OrderSelect(l_pos_44, SELECT_BY_POS, MODE_TRADES)。

如果(OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) 继续。

double Price = OrderOpenPrice();

如果(NormalizeDouble(MathAbs(Bid - Price), Digits) < NormalizeDouble(Dist, Digits) ) {

Dist = MathAbs(Bid - Price);

int Ticket = OrderTicket();

double Lot = OrderLots();

OrderClose(Ticket, Lot, Bid, 3)。

}

}


(关闭卖出头寸的代码相同(显然用OP_SELL变量而不是OP_BUY))


int CheckFirstOP(int a_cmd_0) {

int l_count_4 = 0;

for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {

如果(OrderSelect(l_pos_8, SELECT_BY_POS)) {

如果(OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) {

如果(OrderType() == a_cmd_0){

l_count_4++;

休息。

}

}

}

}

返回(l_count_4)。

}


我需要一个代码来关闭多头或空头头寸,当有超过1个类型的头寸打开时......所以总共要保留2个头寸(1个买入和1个卖出)......我还需要保留最近打开的头寸,即在这种情况下,买入头寸的打开价格较高,卖出头寸的打开价格较低的那个。问题是,代码没有关闭头寸......没有关闭任何头寸。


当:"if (CheckFirstOP(OP_BUY) == 1) "时,代码会在第一个仓位开仓后立即关闭......也就是说,在买入和卖出订单 开仓后,它们会在下一个交易日关闭。而当:"if (CheckFirstOP(OP_BUY) > 1) "时,没有一个仓位被关闭。我不知道我做错了什么。

有人能帮助我吗?

 

I forgot:


double Dist = 1000000.0。

 
Aljohin:

请谁能帮助我?

1.这只是你代码的一部分,请给我们看一下函数CheckFirstOP()的例子。

2.for 循环是递增的。如果在循环中关闭订单,这将无法正常工作,请看 ->https://www.mql5.com/en/forum/119840。

3.你的变量命名规则......不是很好。

4.请使用SRC按钮来发布你的代码,这样它就能保留格式。像这样读你的代码非常困难。

 
gordon:

1.这只是你代码的一部分,请给我们看一下函数CheckFirstOP()的例子。

2.for 循环是递增的。如果在循环中关闭订单,这将无法正常工作,请参见->https://www.mql5.com/en/forum/119840。

3.你的变量命名规则......不是那么好。

4.请使用SRC按钮来发布你的代码,这样它就能保留格式。像这样读你的代码是很困难的。


double Dist=1000000.0;
if ( CheckFirstOP(OP_BUY) > 1) {
      for ( l_pos_44 = 0; l_pos_44 < OrdersTotal(); l_pos_44++) {
          OrderSelect( l_pos_44, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }

int CheckFirstOP(int a_cmd_0) {
   int l_count_4 = 0;
   for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
      if (OrderSelect( l_pos_8, SELECT_BY_POS)) {
         if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol()) {
            if (OrderType() == a_cmd_0) {
               l_count_4++;
               break;
            }
         }
      }
   }
   return ( l_count_4);
}
my fault...i'm very new to this stuf...
 
gordon:

3.你的变量命名惯例......不怎么好。

看起来像一个反编译器的命名惯例...

"他是这个东西的新手"

 
meikel:

看起来像一个反编译器的名称惯例......

"他是这方面的新手"

可能是的......我想修改我买的一个EA......他们也给我发了代码(他们说是错误的)......现在我明白了这个奇怪的命名法的原因......正如我说的,我是个新手(刚刚在这个网站上读了MQL4的书),至少在开始时不想修改很多东西,所以我让这些名字按照我发现它们的样子。

 
Ais:

你好

选择的订单可以通过表达式完全关闭: "OrderClose(OrderTicket (),OrderLots ( ),OrderClosePrice ( ), 0 );"

最好的问候

并没有解决我的问题...

 
gordon:

2.for 循环是递增的。如果在循环中关闭订单,这将无法正常工作,请参见 ->https://www.mql5.com/en/forum/119840。

在MQL4的书中没有提到(我想)......反正我试过了。


if ( CheckFirstOP(OP_BUY) > 1) {
      for(int i = OrdersTotal() - 1; i >= 0; i--) {
          OrderSelect( i, SELECT_BY_POS, MODE_TRADES);
          if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber || OrderType() != OP_BUY) continue;     
          double Price = OrderOpenPrice();
          if (NormalizeDouble(MathAbs(Bid - Price), Digits) > NormalizeDouble( Dist, Digits)) {              
             Dist = MathAbs(Bid - Price);                 
             int Ticket = OrderTicket();           
             double Lot = OrderLots();                          
             OrderClose( Ticket, Lot, OrderClosePrice(), 3); 
         }    
      }   
   }
it doesn't work, don't know why
 
Ais:

现在只需在这一行确定

是的,我试过了,它什么也没改变......这个程序很奇怪:)写一个简单的关闭指令并不难(我想)......

 
it doesn't work, don't know why
当你关闭订单索引5,订单索引6变成索引5,7变成6,等等。 计算起来,你会错过其他每一个未结订单。
 
WHRoeder:
当您关闭订单索引5时,订单索引6变成索引5,7变成6,等等。数一数,你会错过其他每一个未平仓的订单。

啊,好的,明白了......无论如何,代码的目的是只保留一个未平仓的订单,当有2个订单打开时立即开始工作,并在选择和分析所有订单(即2个订单)后关闭其中一个......所以我不认为在选择订单 时增量是一个大错误。总之,我尝试了递减的方法,但没有任何结果......也许我的方法不对......不知道......谁能试试我的代码,看看它是否真的关闭了交易......或者谁能写一个简单的代码来选择和关闭之前开立的订单(即买入时开价较高,卖出时开价较低的订单)?

谢谢你