Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 805

 
Sfinks35:
Добрый день!
Вроде бы сделал теперь верно:

Но при компилляции выдает одно предупреждение: possible loss of data due to type conversion по строке:
index = GetPatt5barsDN(index);

В заголовке функции (и в самой функции) ошибок нет при компилляции.

double low3 = 0;
   int index = 0;
   low3 = GetPatt5barsDN(index); // Здесь передача значения по ссылке

   Print("low3= ", low3);
   Print("index= ", index);
 

Приветствую, у меня такой вопрос: могу ли я как то пропустить определенный проход при оптимизации.

Например я оптимизирую робота по 2 МА - быстрой и медленной начиная с 10 и заканчивая 1000 для каждой

Как я могу пропустить проходы в тех случаях, когда период медленной меньше периода быстрой?

 
Roman Sharanov:

Приветствую, у меня такой вопрос: могу ли я как то пропустить определенный проход при оптимизации.

Например я оптимизирую робота по 2 МА - быстрой и медленной начиная с 10 и заканчивая 1000 для каждой

Как я могу пропустить проходы в тех случаях, когда период медленной меньше периода быстрой?

В этом случае при инициализации сделайте return(INIT_PARAMETERS_INCORRECT);

 
Igor Zakharov:

В этом случае при инициализации сделайте return(INIT_PARAMETERS_INCORRECT);

спасибо

 

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

Ниже привожу условия закрытия и пользовательскую функцию Close().

if(CountBuy() >= 1 && CountSell() >= 1 && CountSymbolTotal() >= NumberOrder)
   {
      int    i;
      int    total    = OrdersTotal();
      double accruals = CalculateCommission() + CalculateSwapBuy() + CalculateSwapSell();
   
      if((CountProfitBuy() + CountProfitSell()) >= (MaxOrderProfit*GetLots()+ accruals))
      {
         for(i = total-1; i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               { 
                  if(OrderType() == OP_BUY)
                     OrderCloseX();
               }
            }
         } 
         for(i = total-1; i >= 0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               { 
                  if(OrderType() == OP_SELL)
                     OrderCloseX();
               }
            }
         }            
      }
   }
//---------------------
void OrderCloseX()
{
   int i;
   int ticket = -1;
   int k      = OrdersTotal();
   
   for(i = k - 1; i >= 0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if((OrderType() == OP_BUY || OrderType() == OP_SELL) )
         {            
            ticket = OrderTicket();
         }
      }
   }
   if(OrderTicket() != ticket) 
      if(!OrderSelect(ticket, SELECT_BY_TICKET))
         Print("Ошибка в выборе ордеров!");

   while(true)
   {
      int  error;
      bool result = true;
      
      if (OrderType()==OP_BUY) 
         result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, 0);
         
      if (OrderType()==OP_SELL) 
         result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, 0);
         
      if(result != TRUE) 
      { 
         error = GetLastError(); 
            Print("LastError = ", error); 
      }
      else 
      { 
         error = 0; 
      }
      if(error == 135) 
         RefreshRates();
      else break;
   } 
}

 
Youri Lazurenko:

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

Ниже привожу условия закрытия и пользовательскую функцию Close().

Вы сначала проверяете перебором через OrderSelect() ордера как положено - контролируете символ и магикномер ордера, а потом закрываете ордера в OrderCloseX() и опять перебираете ордера, но уже почему то не контролируете в OrderSelect() символ и магикномер

думаю, что чтобы не переписывать весь код нужно нужно в OrderCloseX() добавить:

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
 
Igor Makanu:

Вы сначала проверяете перебором через OrderSelect() ордера как положено - контролируете символ и магикномер ордера, а потом закрываете ордера в OrderCloseX() и опять перебираете ордера, но уже почему то не контролируете в OrderSelect() символ и магикномер

думаю, что чтобы не переписывать весь код нужно нужно в OrderCloseX() добавить:

Спасибо. Исправлю. Уже исправил. Может в этом и причина - получается, вызывается на одной из пар функция OrderCloseX(), которая потом срабатывает на всех остальных парах и магиках. Могыт быть, могыт быть. Еще раз спасибо.

 
Igor Makanu:

Digits - Предопределенные переменн

Я тоже решил воспользоваться этой функцией, я читал что если количество знаков у конторы 5 например 1.00000 и последние значения нули она может вернуть не 5ть знаков а ноль или например число будет выглядеть так 1.24700 вернёт 3 знака после запятой хотя их должно быть 5ть это правда?

 
Seric29:

Я тоже решил воспользоваться этой функцией, я читал что если количество знаков у конторы 5 например 1.00000 и последние значения нули она может вернуть не 5ть знаков а ноль или например число будет выглядеть так 1.24700 вернёт 3 знака после запятой хотя их должно быть 5ть это правда?

Digits используют с NormalizeDouble

https://docs.mql4.com/ru/convert/normalizedouble

NormalizeDouble - Преобразование данных - Справочник MQL4
NormalizeDouble - Преобразование данных - Справочник MQL4
  • docs.mql4.com
Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров, должны быть нормализованы с точностью, значение которой можно получить функцией Digits(). Нужно...
 
Внезапно все терминалы потеряли связь с брокерами. Везде ошибка connect failed.
В окне логина сервер выбрать не дает, пусто. Перед этим я ничего нигде не менял, ничего не устанавливал и ничего не удалял.
В чем причина?
Причина обращения: