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

 
Вопрос возник. Как узнать количество открытых окон и их идентификаторы. Нашел только получение id первого, текущего и следующего окна. И правильно понимаю тотал мы получить не можем, а только первый, некст и как понять что следующего окна нет.
 
Valeriy Yastremskiy #:
Вопрос возник. Как узнать количество открытых окон и их идентификаторы. Нашел только получение id первого, текущего и следующего окна. И правильно понимаю тотал мы получить не можем, а только первый, некст и как понять что следующего окна нет.
    long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
        break;
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    symb=ChartSymbol(currChart);
 
Vitaly Muzichenko #:

Принять что на все открытые позиции открыты окна нельзя. Поэтому алгоритм должен содержать поиск окна с нужным символом, и если его нет, открывать окно и рисовать ситуацию. Т.е. уровни, потом найти на каком произошла модификации СЛ, и либо удалить или изменить цвет уровня.

 
Valeriy Yastremskiy #:

Принять что на все открытые позиции открыты окна нельзя. Поэтому алгоритм должен содержать поиск окна с нужным символом, и если его нет, открывать окно и рисовать ситуацию. Т.е. уровни, потом найти на каком произошла модификации СЛ, и либо удалить или изменить цвет уровня.

Поставить флаг, если есть открытое окно, то рисовать, если нет открытого - пропускаем. Нет смысла открывать и рисовать, если его заведомо не открыли/закрыли

    long currChart=ChartFirst();
    int i=0;
    flag=false;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol) {
        flag=true;
        break;
      }
      currChart=ChartNext(currChart);
      if(currChart==-1) break;
      i++;
    }
    if(flag) {
    symb=ChartSymbol(currChart);
    ...
 
Vitaly Muzichenko #:

Поставить флаг, если есть открытое окно, то рисовать, если нет открытого - пропускаем. Нет смысла открывать и рисовать, если его заведомо не открыли/закрыли

Открывать новое или нет, если символ не открыт, это к заказчику. По мне, с открытием это более полный учет ситуаций заказчика. Из поиска нужен id окна искомого символа. Далее нарисовать в искомом окне.

int FcurrChartSimbol(symbol){   
long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      if(ChartSymbol(currChart)==symbol)
      return(currChart);
      currChart=ChartNext(currChart);i++;
      if(currChart==-1)return(-1);
      
    }}

Зы поправил. Это функция же))) 

 
Valeriy Yastremskiy #:

Открывать новое или нет, если символ не открыт, это к заказчику. По мне, с открытием это более полный учет ситуаций заказчика. Из поиска нужен id окна искомого символа. Далее нарисовать в искомом окне.


Зы поправил. Это функция же))) 

Оптимально, сделать заполнение в глобально видимый массив открытыми графиками и потом работать с массивом

int FcurrChartSimbol(symbol) {   
   long currChart=ChartFirst();
    int i=0;
    while(i<CHARTS_MAX) {
      i++;
      mass[i-1]=currChart;
      currChart=ChartNext(currChart);
      if(currChart==-1)
        break;
    }
   return(i); // количество графиков
}

Далее, запускать её по событию для обновления заполнения, к примеру при изменении количества позиций

int OT=OrderTotal();
if(OT != pOT) {
 FcurrChartSimbol(symbol);
 pOT=OT;
}

Так снизится нагрузка, не нужно будет бесполезно гонять цикл

 
Vitaly Muzichenko #:

Оптимально, сделать заполнение в глобально видимый массив открытыми графиками и потом работать с массивом

Далее, запускать её по событию для обновления заполнения, к примеру при изменении количества позиций

Так снизится нагрузка, не нужно будет бесполезно гонять цикл

Может я чего-то не понял, но не понимаю почему не используете для определения открытости графика SYMBOL_SELECT и SYMBOL_VISIBLE

Перебирая ордера делайте проверку

    if(!SymbolInfoInteger(Order_Symbol, SYMBOL_SELECT) || !SymbolInfoInteger(Order_Symbol, SYMBOL_VISIBLE))
      SymbolSelect(Order_Symbol, true);
 
Alexey Viktorov #:

Может я чего-то не понял, но не понимаю почему не используете для определения открытости графика SYMBOL_SELECT и SYMBOL_VISIBLE

Перебирая ордера делайте проверку

Ну это с другой оперы и связано с Market Watch, а не с открытыми графиками. Или нет?

P.S. Если есть открытая позиция, то символ в Market Watch будет виден в любом случае.
 
Vitaly Muzichenko #:

Ну это с другой оперы и связано с Market Watch, а не с открытыми графиками. Или нет?

P.S. Если есть открытая позиция, то символ в Market Watch будет виден в любом случае.

SYMBOL_SELECT да, но SYMBOL_VISIBLE не обязательно.

И да, согласен, это не обязательно открытый график.

 
Vitaly Muzichenko #:

Оптимально, сделать заполнение в глобально видимый массив открытыми графиками и потом работать с массивом

Далее, запускать её по событию для обновления заполнения, к примеру при изменении количества позиций

Так снизится нагрузка, не нужно будет бесполезно гонять цикл

Немного не понял логики. Мониторятся события открытия позиции, модификации СЛ, закрытия позиции на нескольких символах. Открытие позиции - поиск открыто ли окно с данным символом (ищем id окна), если открыто, то рисуем уровни и далее мониторим трал СЛ. Если не открыто, то либо открываем окно с нужным символом и таймфреймом и рисуем уровни, или не открываем. Событие модификации, находим окно нужного символа, уровни уже нарисованы и меняем цвет уровня или удаляем и рисуем уровень сл.

Вообще что бы исключить влияние клиента, в начале работы надо сделать анализ позиций и окон и открыть окна на символах, где есть открытые позиции и не открыты окна.  

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