Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
В сервисе Фриланс выполнено тысячи оплачиваемых заказов. Присоединяйся!
RedFish
226
RedFish 2011.07.13 05:50 

Библиотечная функция. Вот код.

void Chek(double lot,double in,double stop,int magic)
{
   bool flag=false;
   bool result=false;
   int k=0;
   int ticket=-1;
   int total=OrdersTotal();
   for(int i=0; i<total; i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderSymbol()==Symbol()&&OrderMagicNumber()==magic&&OrderType()==OP_SELLSTOP)
         {
            flag=true;
            if(OrderOpenPrice()==in&&OrderStopLoss()==stop)
               continue;
            else
            {
               while(k<10)
               {
                  while(IsTradeContextBusy())
                  {
                     Sleep(2000); // торговый поток занят - ждем 2 секунды и еще спрашиваем
                  }
                  result=OrderDelete(OrderTicket());
                  if(result==true)
                     break;
                  k++;
                  Sleep(2000); // нет, ждем 2 секунды и еще пробуем
                  if(k==10)
                  {
                     Alert(" Пара - ",Symbol()," Ордер №",OrderTicket()," Удалить отложенник НЕ удалось!"); 
                     SendMail("W4"," Удалить отложенник НЕ удалось!");
                  }
               }
               k=0;
               while(k<10)
               {
                  while(IsTradeContextBusy())
                  {
                     Sleep(2000); // торговый поток занят - ждем 2 секунды и еще спрашиваем
                  }
                  RefreshRates();
                  ticket=OrderSend(Symbol(),OP_SELLSTOP,lot,in-20*k*Point,10,stop,0,NULL,magic,0,Red);
                  if(ticket>0)
                     break;
                  k++;
                  Sleep(2000); // нет, ждем 2 секунды и еще пробуем
                  if(k==10)
                  {
                     Alert(" Пара - ",Symbol()," Ордер №",OrderTicket()," НЕ удалось выставить отложенник!"); 
                     SendMail("W4"," НЕ удалось выставить отложенник!");
                  }
               }
            }
         }
      }
   }
   if(flag==false)
   {
      k=0;
      while(k<10)
      {
         while(IsTradeContextBusy())
         {
            Sleep(2000); // торговый поток занят - ждем 2 секунды и еще спрашиваем
         }
         RefreshRates();
         ticket=OrderSend(Symbol(),OP_SELLSTOP,lot,in-20*k*Point,10,stop,0,NULL,magic,0,Red);
         if(ticket>0)
            break;
         k++;
         Sleep(2000); // нет, ждем 2 секунды и еще пробуем
         if(k==10)
         {
            Alert(" Пара - ",Symbol()," Ордер №",OrderTicket()," НЕ удалось выставить отложенник!"); 
            SendMail("W4"," НЕ удалось выставить отложенник!");
         }
      }
   }
   return;
}

Функция работает с отложенными ордерами. Заложен алгоритм. Находим (если есть) отложенник и сравниваем его цену входа и стоп с имеющимися данными. Далее если не совпадает, то удаляет отложенник и выставляет новый опять же с имеющимися данными. Если данные совпадают, то программа должна НЕ трогать этот отложенник. Если отложенников нет, то выставляется отложенник опять же с имеющимися данными цены входа и стопа. Программа организована так, что отложенник может быть только один или может не быть, но два и более не будут ни когда.

Проблема. Программа находит отложенник и тупо удаляет его и выставлят опять новый отложенник точно с такими же данными, как и у удаленного. Получается, что оператор continue не работает (так как я думаю )) он должен работать). В моем понимании если мы нашли отложенник и у него совпадают параметры оператор continue должен отправить на следущую этерацию цикла for, а он у меня очевидно этого не делает и программа попадает в else где удаляет тупо нужный мне отложенник и выставляет такой же. Как мне этого избежать? Конечно можно вместо continue поставить return и по идее должно сработать железно, но когда то учили меня, что это плохой способ написания кода, когда прерывается не до конца выполненный оператор for.

Заранее Вам благодарен за ответ.

// Большая просьба - для вставки кода пользоваться кнопкой SRC (Vinin) //

Victor Nikolaev
Модератор
14069
Victor Nikolaev 2011.07.13 05:59  
RedFish:

Библиотечная функция. Вот код.

Функция работает с отложенными ордерами. Заложен алгоритм. Находим (если есть) отложенник и сравниваем его цену входа и стоп с имеющимися данными. Далее если не совпадает, то удаляет отложенник и выставляет новый опять же с имеющимися данными. Если данные совпадают, то программа должна НЕ трогать этот отложенник. Если отложенников нет, то выставляется отложенник опять же с имеющимися данными цены входа и стопа. Программа организована так, что отложенник может быть только один или может не быть, но два и более не будут ни когда.

Проблема. Программа находит отложенник и тупо удаляет его и выставлят опять новый отложенник точно с такими же данными, как и у удаленного. Получается, что оператор continue не работает (так как я думаю )) он должен работать). В моем понимании если мы нашли отложенник и у него совпадают параметры оператор continue должен отправить на следущую этерацию цикла for, а он у меня очевидно этого не делает и программа попадает в else где удаляет тупо нужный мне отложенник и выставляет такой же. Как мне этого избежать? Конечно можно вместо continue поставить return и по идее должно сработать железно, но когда то учили меня, что это плохой способ написания кода, когда прерывается не до конца выполненный оператор for.

Заранее Вам благодарен за ответ.

// Большая просьба - для вставки кода пользоваться кнопкой SRC (Vinin) //


Поищите по форуму "Сравнение действительных чисел". Вам поможет
RedFish
226
RedFish 2011.07.13 06:31  

Спасибо за исправление и ответ.

RedFish
226
RedFish 2011.07.13 07:48  
Vinin:

Поищите по форуму "Сравнение действительных чисел". Вам поможет

Я посмотрел. Но я получаю свои числа из расчетов и их нормализую до пятого знака. Программа их сравнивает, больше раз одно и тоже число полученное одним и тем же способом при этом нормализовано в конце обработке. В журнале фиксируется удаление и постановка ордера с теми же параметрами. В журнале до пятого знака, но и нормализованы числа были до пятого знака. Там больше нет "хвостиков" после пятого знака и получается, что оператор if не срабатывает(?) странно как то ... Я думал, что continue не срабатывает, как я хочу. Запутался.
Victor Nikolaev
Модератор
14069
Victor Nikolaev 2011.07.13 07:52  
RedFish:

Я посмотрел. Но я получаю свои числа из расчетов и их нормализую до пятого знака. Программа их сравнивает, больше раз одно и тоже число полученное одним и тем же способом при этом нормализовано в конце обработке. В журнале фиксируется удаление и постановка ордера с теми же параметрами. В журнале до пятого знака, но и нормализованы числа были до пятого знака. Там больше нет "хвостиков" после пятого знака и получается, что оператор if не срабатывает(?) странно как то ... Я думал, что continue не срабатывает, как я хочу. Запутался.


Сделайте Print() в проблемных местах и проверяйте как, когда и почему выполняется.

RedFish
226
RedFish 2011.07.13 08:06  
Vinin:


Сделайте Print() в проблемных местах и проверяйте как, когда и почему выполняется.



Я в операторе if каждое число еще раз нормализовал теперь до 4 знака и все вроде заработало. Грубовато немного. Спасибо.
TarasBY
1743
TarasBY 2011.10.20 07:05  
RedFish:

Я в операторе if каждое число еще раз нормализовал теперь до 4 знака и все вроде заработало. Грубовато немного. Спасибо.
Нормализовать нужно ОБЕ сравниваемые величины до одинакового количества знаков. А в Вашем случае 4 (2+2).
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий