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

 
Anatoliy Markov #:

Благодарю Вас за участие. Постановка задачи мне понятна. С реализацией забуксовал...

Пробовал с комментами. До второй группы нумерует правильно. На третьей возвращает единицу для коммента, хотя первая группа еще в рынке. Смысл такой, чтобы не плодить номера, а занимать освободившиеся. Надеюсь, понятно объяснил). 

Не совсем понятно, но всё равно воспользуйтесь кнопкой для вставки кода


или сочетанием клавиш ALT+s

 
void OnTick()
{
  //---
    
    for(int a=1; a<10; a++)
     {
       comment="";
       for(int i=0; i<OrdersTotal(); i++)
         {
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
             if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
               {    
                  if (OrderComment()==IntegerToString(a)) continue; 
                  else
                  {
                   comment=IntegerToString(a);
                   break;                  
                  } 
               }
            } 
         } 
        if(comment!="") break; 
     }
    if (CountOfBuy(magic)<1 && CountOfSell(magic)<1) comment="1";
  //---
}
Да, так более информативно. Т.е. этот незамысловатый модуль должен давать коммент для 
последующего присвоения ордеру. Когда открыта группа с комментом 1, он дает коммент 2 (это правильно). 
Когда открыта 2-я группа, опять дает 1. Не могу понять.
 

Всем доброго вечера!

Написал функцию, определяющую наличие уже установленного отложенного ордера, но функция почему-то не работает. Подскажите, пожалуйста, где ошибка? С уважением, Владимир.

//+------------------------------------------------------------------+
//| Функция IsMainPendingOrder (установлен отложенный ордер):        |
//| возвращает истину, если в советнике уже установлен отложенный    |
//| ордер, в противном случае возвращает ложь.                       |
//| Применим для функции с типом данных bool, чтобы хранить          |
//| логические значения true (истина) или false (ложь).              |
//+------------------------------------------------------------------+
bool IsMainPendingOrder()
  {
   int orders_total=OrdersTotal(); // количество установленных отложенных ордеров
//--- перебираем все установленные отложенные ордера
   for(int i=orders_total-1; i>=0; i--)
     {
      ulong  order_ticket=OrderGetTicket(i); // тикет ордера
      /* если отложенного ордера нет, значит и у нашего советника отложенного ордера нет */
      if(OrderSelect(i)==false)
         return false; // поэтому возвращаем ложь
     }
   /* если отложенный ордер уже есть и его мэджик совпадает с мэджиком нашего советника */
   if(OrderGetInteger(ORDER_MAGIC)==Magic_Number)
      return true;  // то возвращаем истину
   /* в противном случае, если отложенный ордер уже есть, но его мэджик не совпадает с мэджиком нашего советника */
   else
      return false; // значит это чья-то чужая позиция, поэтому возвращаем ложь
  }
 
MrBrooklin #:

Всем доброго вечера!

Написал функцию, определяющую наличие уже установленного отложенного ордера, но функция почему-то не работает. Подскажите, пожалуйста, где ошибка? С уважением, Владимир.

ОШИБКА НАЙДЕНА САМОСТОЯТЕЛЬНО!!!

Вот нормально работающий код. Может кому-нибудь пригодится. С уважением, Владимир.

//+------------------------------------------------------------------+
//| Функция IsMainPendingOrder (установлен отложенный ордер):        |
//| возвращает истину, если в советнике не установлен отложенный     |
//| ордер, в противном случае возвращает ложь.                       |
//| Применим для функции тип данных bool, чтобы хранить              |
//| логические значения true (истина) или false (ложь).              |
//+------------------------------------------------------------------+
bool IsMainPendingOrder()
  {
   int orders_total=OrdersTotal(); // количество установленных отложенных ордеров
//--- перебираем все установленные отложенные ордера
   for(int i=orders_total-1; i>=0; i--)
     {
      ulong  order_ticket=OrderGetTicket(i); // тикет ордера
      /* если отложенного ордера нет, значит и у нашего советника отложенного ордера нет */
      if(OrderSelect(i)==false)
         return true; // поэтому возвращаем значение истина
      else // в противном случае
         return false; // возвращаем значение ложь
     }
   /* если отложенный ордер уже есть и его мэджик совпадает с мэджиком нашего советника */
   if(OrderGetInteger(ORDER_MAGIC)==Magic_Number)
      return true;  // то возвращаем истину
   /* в противном случае, если отложенный ордер уже есть, но его мэджик не совпадает с мэджиком нашего советника */
   else
      return false; // значит это чужой ордер, поэтому возвращаем значение ложь
 

Подскажите, пожалуйста, как организовать или в какую сторону смотреть:

Вот, чтобы не проводить расчёт баров, придумали буферы. При каждом новом тике проверяется только последний бар (как я понял). При появлении нового бара, расчёт начинается только с ним. 

Благодаря буферу, линии не отрисовываются заново на всей истории, а к её последнему краю добавляется дополнительный отрезок. Всего буферов 8. 

А если мне нужно сделать расчёт сотню раз (допустим, 100 раз отрисовать линию, изменяя одну только переменную), а затем лучший результат отрисовать. А при новом тике или таймере сделать всё тоже самое, но уже с имеющейся "историей" результатов (отрисовок). Где и как мне хранить эту информацию, чтобы потом не проводить эти расчёты по новой по всей истории?

Или, если проще выразиться, как увеличить количество буферов в индикаторе? Может записывать отдельно в файл? Как лучше
 
Ivan Butko #:

Подскажите, пожалуйста, как организовать или в какую сторону смотреть:

Вот, чтобы не проводить расчёт баров, придумали буферы. При каждом новом тике проверяется только последний бар (как я понял). При появлении нового бара, расчёт начинается только с ним. 

Благодаря буферу, линии не отрисовываются заново на всей истории, а к её последнему краю добавляется дополнительный отрезок. Всего буферов 8. 

А если мне нужно сделать расчёт сотню раз (допустим, 100 раз отрисовать линию, изменяя одну только переменную), а затем лучший результат отрисовать. А при новом тике или таймере сделать всё тоже самое, но уже с имеющейся "историей" результатов (отрисовок). Где и как мне хранить эту информацию, чтобы потом не проводить эти расчёты по новой по всей истории?

Или, если проще выразиться, как увеличить количество буферов в индикаторе? Может записывать отдельно в файл? Как лучше

В индикаторах 512 буферов.

 
Artyom Trishkin #:

В индикаторах 512 буферов.

Ого.. Благодарю Вас. Я, наверное, не туда смотрел. Буду пробовать

 
MrBrooklin #:

ОШИБКА НАЙДЕНА САМОСТОЯТЕЛЬНО!!!

Вот нормально работающий код. Может кому-нибудь пригодится. С уважением, Владимир.

Ни кому не пригодится. В Вашем коде грубейшие ошибки. И исправлять их бессмысленно.

Вы не удосужились выучить даже основы языка, а пытаетесь что-то писать.

Вы уж или займитесь серьёзно или бросьте это дело.

 
Koldun Zloy #:

Ни кому не пригодится. В Вашем коде грубейшие ошибки. И исправлять их бессмысленно.

Вы не удосужились выучить даже основы языка, а пытаетесь что-то писать.

Вы уж или займитесь серьёзно или бросьте это дело.

Доброе утро! Да, Вы абсолютно правы. Нужно бросить это бессмысленное дело, а именно - обращаться в раздел

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

и ждать здесь помощи.

С уважением, Владимир.

 
MrBrooklin #:
Доброе утро! Да, Вы абсолютно правы. Нужно бросить это бессмысленное дело, а именно - обращаться в раздел

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

и ждать здесь помощи.

С уважением, Владимир.

Правильно, бросайте.

Вы даже не поняли что я Вам написал на русском языке.

Зачем Вам лезть в программирование?

Причина обращения: