Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 91

 
Jenya77769:

Здравствуйте! Неправильно сравниваются два минусовых числа q и w, когда они равны, оператор иф считает, что одно больше другого.В чем ошибка?   Когда q = -0,0002 и w тоже -0,0002, то res12=false, почему? 

потому что это double и они не равны в точности

КРИВОЙ СПОСОБ : сравнивайте нормализованные значения

 
Jenya77769:

Здравствуйте! Неправильно сравниваются два минусовых числа q и w, когда они равны, оператор иф считает, что одно больше другого.В чем ошибка?   Когда q = -0,0002 и w тоже -0,0002, то res12=false, почему? 


Сравнивайте их разницу с нулём, это правильнее и работает для чисел любого типа.

 

Люди, есть такой вопрос -

есть горизонтальная линия, длинной в день.

На ней есть текстовая метка, объект label.

Как сделать так, что-бы эта текстовая метка всегда была посередине линии (посередине суток), при любом зуме графика?

 
John Smith:

Люди, есть такой вопрос -

есть горизонтальная линия, длинной в день.

На ней есть текстовая метка, объект label.

Как сделать так, что-бы эта текстовая метка всегда была посередине линии (посередине суток), при любом зуме графика?

Изменить координату метки по оси Х, т.е. высчитать как середину линиию
 
Renat Akhtyamov:
Изменить координату метки по оси Х, т.е. высчитать как середину линиию

Ну это понятно, а как это сделать?


У меня был ещё второй вариант - с меткой привязанной к началу дня, с помощью текстовой переменной вставлять перед значением метки пробелы, в зависимости от зума графика.

По-сути нужно, что-бы при близком зуме метка была слева, а при zoom out метка смещалась на середину. Так как уровни зума в мт4 стандартные, то для каждого уровня зума подобрать нужное кол-во пробелов не так сложно. Но вот вопрос - в mql4 вообще есть такая функция, что-бы определить текущий уровень зума графика?

Тогда всё будет просто, что-то вроде этого: "if chartzoom = 50% then spacesnumber = 10", и тд.

Где spacesnumber - это string переменная, которая определяет кол-во пробелов перед текстом метки, типа  __________1.23456 - тут 10 пробелов знаком _

 
John Smith:

Ну это понятно, а как это сделать?


У меня был ещё второй вариант - с меткой привязанной к началу дня, с помощью текстовой переменной вставлять перед значением метки пробелы, в зависимости от зума графика.

По-сути нужно, что-бы при близком зуме метка была слева, а при zoom out метка смещалась на середину. Так как уровни зума в мт4 стандартные, то для каждого уровня зума подобрать нужное кол-во пробелов не так сложно. Но вот вопрос - в mql4 вообще есть такая функция, что-бы определить текущий уровень зума графика?

Тогда всё будет просто, что-то вроде этого: "if chartzoom = 50% then spacesnumber = 10", и тд.

Где spacesnumber - это string переменная, которая определяет кол-во пробелов перед текстом метки, типа  __________1.23456 - тут 10 пробелов знаком _

Тут мои комменты почитайте
 

Всем привет! Опять нужна помощь. Не могу понять в чем ошибка. Опять трал. Трал по МА. Нужно тралить несколько ордеров. Могут быть локи. Пока имеется один открытый ордер, все работает безупречно. Как только выставляется еще один начинается вакханалия - постоянная модификация (с одним и тем же параметром) первого ордера (ошибки 1 при этом не пишет) . Второй ордер при этом модифицируется  как и положено - при соответствующих условиях (первый, при изменении условий, изменяет параметры и продолжает постоянную модификацию уже с новыми параметрами). Ни как не могу найти причину. Кто подскажет? 

void TrailingStop()
{
   int i;
   int k          = OrdersTotal(); 
   double Ma      = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 1); 
   int MinDistans = int(MarketInfo(Symbol(), MODE_STOPLEVEL));
   
   double lips1  = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 1); 
   double lips2  = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 2);
   double teeth1 = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 1);
   double teeth2 = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 2);
   double jaw1   = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW , 1);
   double jaw2   = iAlligator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW , 2);
   
   for (i = 0; i < k; i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_BUY)
            {
               if(lips2 < teeth2 && teeth2 < jaw2 && lips1 < teeth1 && teeth1 < jaw1)
                  break;
               
               if(lips2 > teeth2 && teeth2 > jaw2 && lips1 > teeth1 && teeth1 > jaw1)
               {   
                  if((OrderStopLoss() + TrailingStep*Point) < Ma)
                  {
                     double Sl = NormalizeDouble(Ma, Digits);                 
                     
                     if((Bid - MinDistans) > Sl && (OrderStopLoss() + TrailingStep*Point) < Sl)
                     { 
                        OrderModifyX(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(), OrderExpiration(), 0);
                     }
                  }
               }
            }
         }
      }     
 
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))  
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if(OrderType() == OP_SELL)
            {
               if(lips2 > teeth2 && teeth2 > jaw2 && lips1 > teeth1 && teeth1 > jaw1)
                  break;
                  
               if(lips2 < teeth2 && teeth2 < jaw2 && lips1 < teeth1 && teeth1 < jaw1)
               {
                  if(MathAbs(OrderStopLoss() - TrailingOpen*Point) > Ma)
                  {
                     double Sl = NormalizeDouble(Ma, Digits);
                 
                     if((Ask + MinDistans) < Sl && (OrderStopLoss() - TrailingStep*Point) > Sl)
                     {
                        OrderModifyX(OrderTicket(), OrderOpenPrice(), Sl, OrderTakeProfit(), OrderExpiration(), 0);
                     }
                  }
               }
            }
         }
      }
   }
}



 
Youri Lazurenko:

Всем привет! Опять нужна помощь. Не могу понять в чем ошибка. Опять трал. Трал по МА. Нужно тралить несколько ордеров. Могут быть локи. Пока имеется один открытый ордер, все работает безупречно. Как только выставляется еще один начинается вакханалия - постоянная модификация (с одним и тем же параметром) первого ордера (ошибки 1 при этом не пишет) . Второй ордер при этом модифицируется  как и положено - при соответствующих условиях (первый, при изменении условий, изменяет параметры и продолжает постоянную модификацию уже с новыми параметрами). Ни как не могу найти причину. Кто подскажет? 


1. Цикл должен быть обратным.

2. А break зачем?

 
Artyom Trishkin:

1. Цикл должен быть обратным.

2. А break зачем?


Здравствуйте.

1 - "Цикл должен быть обратным" - вы имеете ввиду for(i = k; i > 0; i--)?

2. "А break зачем?" - чтобы выйти. Вообще, в начале, после выбора типа ордера и если он  против тренда break. Далее снова выбор типа ордера и если по тренду, тогда модификация.

Мне такой вариант с break помог перед этим. Когда вы подсказали решение на счет трала по МА. Если, например на бай, так получалось, что стоп находился выше МА, то  выдавало ошибку 1 пока МА не станет выше стопа, после этого ошибка исчезала. Когда ввел условие, что если стоп выше МА, то break, все нормализовалось.

 
Youri Lazurenko:

Здравствуйте.

1 - "Цикл должен быть обратным" - вы имеете ввиду for(i = k; i > 0; i--)?

2. "А break зачем?" - чтобы выйти. Вообще, в начале, после выбора типа ордера и если он  против тренда break. Далее снова выбор типа ордера и если по тренду, тогда модификация.

Мне такой вариант с break помог перед этим. Когда вы подсказали решение на счет трала по МА. Если, например на бай, так получалось, что стоп находился выше МА, то  выдавало ошибку 1 пока МА не станет выше стопа, после этого ошибка исчезала. Когда ввел условие, что если стоп выше МА, то break, все нормализовалось.

break полностью завершает цикл. А как же тогда остальные позиции?
Проверяйте где стоп находится относительно его нового уровня.
Обратный цикл от OrdersTotal()-1 до >=0
Причина обращения: