простой вопрос

 

Приветствую всех вас. Я создал код (модифицируя другие коды) для закрытия рыночных ордеров.



int l_pos_44 = 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, 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++) {

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

}


Мне нужен код для закрытия длинных или коротких позиций, когда открыто более 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:

похоже на соглашение о названиях декомпиляторов ...

"Он новичок в этом деле"

вероятно да... я хочу модифицировать советника, которого купил... они также прислали мне код (сказали, что по ошибке)... теперь я понимаю причину этой странной номенклатуры... как я уже сказал, я новичок (только что прочитал книгу по 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 ордеров)... так что я не думаю, что это большая ошибка - инкремент при выборе ордеров...В любом случае, я пробовал метод декрементации без каких-либо результатов... может быть, я пытаюсь неправильно... не знаю... может ли кто-нибудь попробовать мой код и посмотреть, действительно ли он закрывает сделки... или может ли кто-нибудь написать простой код для выбора и закрытия предыдущего открытого ордера (т.е. того, который имеет более высокую цену открытия для покупки и более низкую цену открытия для продажи)?

спасибо

Причина обращения: