Symbol() не соответствует символу графика

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

Добрый день!

Подскажите, в чем может быть причина того что функция Symbol() возвращает отличное от имени графика значение?

Для меня это тайна покрытая мраком и подозрения на баги терминала (MT4)

Но может быть я что-то не так делаю? Впервые сталкиваюсь с таким поведением функции.

Evgeniy Zhdan
16732
Evgeniy Zhdan  
Покажите пример
Mikhail Zaprudin
282
Mikhail Zaprudin  
Evgeniy Zhdan:
Покажите пример

У меня есть советник, он получает данные из другого терминала, сравнивает котировки и делает другие вычисления

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

Запускается много экземпляров (много графиков открыто и к каждому прикреплен советник) и либо работает нормально, либо прыгает между текущим и каким-то другим символом

Причем, если перезапустить советник отдельно через окно свойств (F7 - Ok), то все становится нормально

Это проявляется не всегда

Вывожу через canvas

string smb = ShortArrayToString(t.symbol);
int sf1 = StringFind(Symbol(), smb);
dat.TextOut(4*W, n*H, smb + " " + Symbol() + " " + IntegerToString(sf1),
         COLOR2RGB((sf1 != 0) ? clrRoyalBlue : clr), TA_RIGHT|TA_TOP);

структура t содержит данные из другого терминала

Как писал выше, заметил что котировки и имена иногда стали прыгать

Думал косяк в передаче/приеме данных какой-то, долго ловил и в итоге сделал просто вывод Symbol(), а он не соответствует графику и из-за этого данные не те отображаются

Скриншот прикреплю чуть позже

Mikhail Zaprudin
282
Mikhail Zaprudin  

Таблица накладывается, но видно что имя графика отличается

Первый символ - имя из других терминалов

Второй символ - результат функции Symbol()

Третье число - результат StringFind(Symbol(), smb), если данные не те, то должно быть отлично от нуля, а оно всегда 0, что дополнительно подтверждает некорректность работы функции Symbol()

Andrey Ziablytsev
2504
Andrey Ziablytsev  

да нормально все)

StringFind(Symbol(), smb) 
ищет в строке GBPCHFp подстроку GBPCHF, возвращает индекс первого вхождения
Mikhail Zaprudin
282
Mikhail Zaprudin  
Andrey Ziablytsev:

да нормально все)

На скриншоте выше советник привязан к графику EURCHFp, а Symbol() возвращает GBPCHFp, что не корректно

Думаю, я не ошибусь если скажу, что Symbol() должен возвращать EURCHFp и тогда результат работы StringFind будет -1

Это лишь дополнительная проверка

Igor Zakharov
6652
Igor Zakharov  
если в OnInit() вставить Print(Symbol(),"  ",_Symbol); то что печатается?
Mikhail Zaprudin
282
Mikhail Zaprudin  
Igor Zakharov:
если в OnInit() вставить Print(Symbol(),"  ",_Symbol); то что печатается?

В OnInit все нормально проходит, потом начинается "пляска"

Поймаю опять - прикреплю скрин со значениями из OnInit и в моменте

Dmitry Fedoseev
57473
Dmitry Fedoseev  
Mikhail Zaprudin:

У меня есть советник, он получает данные из другого терминала, сравнивает котировки и делает другие вычисления

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

Запускается много экземпляров (много графиков открыто и к каждому прикреплен советник) и либо работает нормально, либо прыгает между текущим и каким-то другим символом

Причем, если перезапустить советник отдельно через окно свойств (F7 - Ok), то все становится нормально

Это проявляется не всегда

Вывожу через canvas

структура t содержит данные из другого терминала

Как писал выше, заметил что котировки и имена иногда стали прыгать

Думал косяк в передаче/приеме данных какой-то, долго ловил и в итоге сделал просто вывод Symbol(), а он не соответствует графику и из-за этого данные не те отображаются

Скриншот прикреплю чуть позже

А функция Sуmbol() тут причем?

Mikhail Zaprudin
282
Mikhail Zaprudin  
Dmitry Fedoseev:

А функция Sуmbol() тут причем?

По ней идет фильтрация какие данные использовать

В любом случае, результат должен соответствовать активному графику, так?

И если в каких-то моментах это нарушается, то работа функции должна быть пересмотрена

Благодаря Игорю мне пришла светлая мысль просто зафиксировать значение в переменной и потом использовать ее вместо того чтобы дергать Symbol()

Это решает мою задачу, но не решает проблему в целом

Igor Makanu
9860
Igor Makanu  
Mikhail Zaprudin:

В любом случае, результат должен соответствовать активному графику, так?

Вы понимаете, что если внезапно перестала  работать   функция Symbol() - то все и у всех просто "рухнуло" ?

тут 2 варианта:

- ищите ошибку в коде у себя, рапринтуйте все что только можно

- Вы переключили счет или брокера, и не прекращали корректно работу своего кода, тогда будут непонятные и не воспроизводимые баги .... тут кстати, если у Вас глобально описаннеы переменные, то они инициализируются при запуске один раз, в случае переключения ТФ или символа или другого счета, нужно это обрабатывать в OnInit() / OnDeinit() иначе глобально описанные переменные не изменят свои значения

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