Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Зачем продавать продукты в MetaTrader AppStore? Узнай из статьи!
nys2000
133
nys2000 2016.05.27 12:02 

Функция, определяющая профит последнего открытого рыночного ордера для buy и sell и дальнейшее приведение всех ордеров

к полученному значению.

 

//==========================================================================
// Приведение к одному TP
//==========================================================================
void NormTakeProfit()
{
int i,b_Ticket=0,s_Ticket=0;
double BuyTP,SellTP;
bool Ans;

//определение TakeProfit последнего открытого ордера Buy и Sell
   for(i=1; i<=OrdersTotal(); i++)     
      {      
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
         {                                     
         if (OrderSymbol()!=Symbol())
            continue;         
         if (OrderType()>1)
            continue;

         if (OrderType()==0)  
            {
            if (b_Ticket < OrderTicket())  
               {
               BuyTP=OrderTakeProfit();
               b_Ticket=OrderTicket();
               } 
            }
         if (OrderType()==1)  
            {
            if (s_Ticket < OrderTicket())  
               {
               SellTP=OrderTakeProfit();
               s_Ticket=OrderTicket();
               }   
            }
            
          }
      }

//приведение всех открытых ордеров к одному TakeProfit для ордеров Buy и Sell


   for(i=1; i<=OrdersTotal(); i++)     
      {      
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
         {                                     
         if (OrderSymbol()!=Symbol())
            continue;
         if (OrderType()>1)
            continue;

         if (OrderType()==0 && OrderTakeProfit() != BuyTP)
            {
            Ans=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(), BuyTP,0);
            if (Ans==true)
               Alert("Ордер ",OrderTicket()," модифицирован");
            else
               Alert("Модификация ордера  ",OrderTicket()," не удалась. Ошибка ", GetLastError());
             }  
               
         if (OrderType()==1 && OrderTakeProfit() != SellTP)
            {
            Ans=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(), SellTP,0);
                  if (Ans==true)
                     Alert("Ордер ",OrderTicket()," модифицирован");
                  else
                     Alert("Модификация ордера  ",OrderTicket()," не удалась. Ошибка ", GetLastError());
             }  
                
         }
      }   
return;
}
Компилятор выдает warning:
possible use of uninitialized variable 'BuyTP'	Template.mq4	649	53
possible use of uninitialized variable 'SellTP'	Template.mq4	658	53

Очевидно, что данные переменные определены в начале функции и их область видимости - вся функция. Указанный warning касается лишь второго цикла, хотя эти переменные используются и в первом.

 В чем подвох и может ли это иметь критические последствия при выполнении. Ну, скажем, эти переменные для второго цикла будут иметь нулевые значения.

Заранее благодарен. 

. ... Rick D. ... .
1074
. ... Rick D. ... . 2016.05.27 16:30  
Да просто занулить переменные в начале и warning исчезнет.
Vladimir
199
Vladimir 2016.05.30 05:29  
nys2000:
 

Указанный warning касается лишь второго цикла, хотя эти переменные используются и в первом.

 В чем подвох и может ли это иметь критические последствия при выполнении. Ну, скажем, эти переменные для второго цикла будут иметь нулевые значения.

Разница между первым и вторым циклом в том, что в первом их значения никак не используются, лишь назначаются (инициализируются в данном случае, т.е. назначаются впервые); тогда как во втором их значения уже не назначаются, а используются (use в сообщениях компилятора). Факт того, что каждый ордер, обрабатываемый во втором цикле (по тому же символу и с OrderType(), равным 0 или 1), в первом цикле уже получил значение, компилятор опознать не в силах.

Совет RickD делает программу более надежной, ведь о соответствии этих двух циклов при правке MQL текста через 8 лет можно и забыть.

Кстати, сравнивать числа типа Double надо бы тоже понадежнее, чем по байтному совпадению (OrderTakeProfit() != BuyTP). Или нормализовать оба с одинаковым числом знаков, или использовать допустимую погрешность.

Наконец, и OrderType() надежнее сравнивать не с числами, а с константами. Вдруг разработчики, сохраняя имена, изменят значения констант, например, OP_BUY, которая сейчас нулевая (для этих целей, в частности, и вводятся имена вместо чисел).  В этом случае вся логика отсева ненужных ордеров (OrderType()>1) станет другой (в неожиданный для Вас момент), а сохранять значения констант вечно разработчик вовсе не обязан.

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий