Помощь: Почему советник не закрывает сделку - страница 6

 
RaptorUK:

Вам совсем не нужна Функция ... ... ... избавьтесь от нее.



Здравствуйте, Raptor,

Мне нужна эта функция, так как советник сложный, и я использую эту функцию со многими версиями условий закрытия.

Надеюсь, вы меня поймете.

Y.

 
onewithzachy:

Давайте сделаем это снова часть 2 :(


Спасибо onewithzachy, но как я уже отвечал, мне нужна эта функция для закрытия с многими вариантами условий, поэтому слишком сложно помещать команды кода закрытия внутри каждого условия, особенно, что это не одна команда кода.

Спасибо,

Y.

 
RaptorUK:

Сделайте это... ( повторяется отсюда: https://www.mql5.com/en/forum/139543 )

. ... и вам вообще не понадобится Функция.


Raptor, мне эта функция нужна для выхода из РЕКВАТНЫХ ситуаций, как вы видите.

Y.

 
onewithzachy:

@ RaptorUK, я подумываю о том, чтобы надеть шлем для аварийных ситуаций, так я хотя бы смогу думать наперед, чем сейчас. Разве не так, те водители думают наперед? :D


@ skaboy, я прошу вас вежливо, если вы не возражаете, не могли бы вы использовать кнопку SRC для публикации вашего кода. Мы просили об этом уже слишком много раз только в этой теме.

@ Crossy, Прошла почти неделя с момента вашего первого сообщения. Конечно, я понимаю, что у вас может не быть ясной головы сейчас, имея дело с 4000 линиями, прямо сейчас я сам тоже здесь. Если вы все еще не понимаете, вы можете попросить нас написать этот код Close для вас. Однако вы все равно должны написать код хоть немного - и показать нам. :D, код RaptorUK чуть выше там более прямой, чем мой, подумайте об этом и затем вы можете двигаться дальше с вашим советником.

С тем, как вы пишете код здесь - слишком много ненужного повторяющегося кода - вы должны немного беспокоиться с вашими 4000 строк кода, что это может замедлить ваш советник и заставить его пропустить тик. Это нормально пропустить пару пунктов, но что случится, если вы пропустите 10 пунктов? И, вероятно, ваши 4000 строк могут быть сокращены до 400 строк. Кто знает? Ваш советник станет более легким и быстрым :D.


Спасибо, onewithzachy,

У моего советника есть небольшая ошибка, которая заключается в следующем:

1) Он закрывает релевантный тикет и ищет его тоже.

2) Эта ошибка появляется не при каждом закрытии ордера, иногда она работает хорошо.

Что касается остальных 3,950 строк кода - они работают очень хорошо.

Я прилагаю соответствующие строки кода, снова.

Y.

...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      Check = false;
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+
 
crossy:



Здравствуйте, Raptor,

Мне нужна эта функция, так как советник сложный, и я использую эту функцию со многими версиями условий закрытия.

Надеюсь, вы меня поймете.

Y.

Я не думаю, что вы понимаете код, который вы скопировали и вставили откуда-то еще ... и нет, это не для реквот. . вы даже не проверяете, является ли ошибка, которую вы получаете, реквотой.
 
RaptorUK:
Я не думаю, что вы понимаете, что вы скопировали и вставили откуда-то еще ... и нет, это не для реквот. ... вы даже не проверяете, является ли полученная вами ошибка реквотой.


Нет, Раптор, ошибка, которую я получил, была: Номер билета не найден. И я могу сказать вам, что реквота была закрыта за секунду до этого.

Я не понимаю, как он закрывает тикет и продолжает поиск...

 
crossy:


Я не понимаю, как он закрывает тикет и продолжает его поиск...

Это из-за цикла, который, как я говорил, не нужен ... в функции, которая не нужна.

"Почему у вас есть цикл в функции Close_Single_P? " из 3-го сообщения на странице 1

"Почему цикл?" со страницы 4, 2-й пост

 

Я ошибаюсь или эта функция никогда не закрывает ордера SHORT?

...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);
                               ^^^^ - You always pass LONG to variable TREN, so variable PRC (below) is always equal taken from LONG, but NEVER from SHORT.

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      Check = false;
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         ^^^   Never executed
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+
 
Waidas:

Я ошибаюсь или эта функция никогда не закрывает ордера SHORT?


Вайдас, Вы правы. Но это лишь небольшой фрагмент советника, который закрывает LONG и SHORT.

Спасибо.

 
RaptorUK:

Это из-за цикла, который, как я сказал, вам не нужен ... в функции, которая вам не нужна.

"Почему у вас есть цикл в функции Close_Single_P? " из 3-го сообщения на странице 1

"Почему цикл?" со страницы 4, 2-й пост


Raptor, Вы были правы, и я убрал петли, так что функция теперь без петель.

Я снова прикрепляю ее здесь.

Y.

...
   for(int cnt = OrdersTotal()-1; cnt >= 0 ; cnt--) 
   {
      CodeY = false;
      if ( OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) )
      {
         CodeY    = true;
         OrderS   = OrderSymbol();
         OrderT   = OrderTicket();
         OrderM   = OrderMagicNumber();
         OrderTyp = OrderType();
         OrderL   = OrderLots();
      }   
      if ( CodeY && OrderS == Pair1 && OrderTyp == OP_BUY && OrderM == MAG &&.... )
    
         CLOSE_Single_P(Pair1,"LONG",OrderT,OrderL);

//-----------------------------------------------+
void CLOSE_Single_P(string SYMB, string TREN, int TICKET, double LOTT)
{
   double PRC;
   bool Check = false;

   for ( int cntt=0; cntt<20000; cntt++ )
   {
      if ( Check )
      {
         Check_Ini();
         return;
      }
      if ( TREN == "LONG" )
         PRC = MarketInfo(SYMB,MODE_BID);
      else
      if ( TREN == "SHORT" )
         PRC = MarketInfo(SYMB,MODE_ASK);
         
      Check = OrderClose(TICKET,LOTT,PRC,Slippage,Yellow);
   }
   return;
}
//-----------------------------------------------+