Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
подскажите как правильно получить список инструментов в окне Ордер (F9)?
я получаю количество элементов, но получить именно строки по номеру не удается, возвращает -1.
#define ID_SYMBOL 0x053E //имя символа для выбора
cm хандл ComboBox
Алексей, спасибо, ф-ция работает, но..
Как раз ID потока нужен, т.к. у меня задействованы два терминала.
Я выкрутился через идентификацию заголовка, но хотелость бы всё таки знать, как ID потока определить из-под тестера?
Прежде чем получать какой-либо текст, нужно сначала подготовить буфер достаточного размера для приёма этого текста. .......
КСТАТИ!!!
Когда адаптировал под свои нужды Вашу ф-цию
столкнулся с тем, что строковый буфер string textbuf объявленый локально на уровне функции, инициализируется всего лишь один раз при первом вызове,
и в дальнейшем ведет себя как статическая переменная.
Не могли бы прокомментировать данную ситуацию?КСТАТИ!!!
Когда адаптировал под свои нужды Вашу ф-цию
столкнулся с тем, что строковый буфер string textbuf объявленый локально на уровне функции, инициализируется всего лишь один раз при первом вызове,
и в дальнейшем ведет себя как статическая переменная.
Не могли бы прокомментировать данную ситуацию?Понял о чём речь. Вы имели ввиду что в буфере хранится старое значение, полученное из GetText. Помню раньше тоже меня это удивляло. Но это особенности MQL. Где-то на форуме разработчики говорили, что все константные строки, заданные на уровне компилятора, хранятся в памяти постоянно в отдельном месте, и при выходе из функции не теряются (не затираются). Их адрес изначально известен и не меняется в процессе работы программы. Поэтому при повторном вызове функции, когда идёт обращение к этой же константной строке, то она берётся с того же самого адреса. Но там у нас уже другой текст, который был помещён функцией GetText.
Аналогично можно сделать просто Print("Абвгдежзийклмнопрсту") и там тоже получишь другой текст :) Т.е. дело не в переменной textbuf, а дело в константной строке. На этапе компиляции проверяются все константные строки и помещаются как бы в базу данных, причём только уникальные строки. Если обнаруживаются одинаковые строки, то для них создаётся только один общий экземпляр в базе данных. Соответсвенно если ты запортишь этот экземпляр в процессе работы, то все вызовы такой строки из любого места программы также вернут испорченный результат.
Если тебя это не устраивает, то можно создать буфер программно:
Тогда подобной проблемы не будет. Правда я уже не помню, можно ли так делать. Не возникнет ли ошибки доступа к памяти... Попробуй.
Тогда подобной проблемы не будет. Правда я уже не помню, можно ли так делать. Не возникнет ли ошибки доступа к памяти... Попробуй.
Я как только прочитал, про то "что 255 символов не вмещается в экран и вид форума портится" - сразу так и сделал.
Но такой вариант не сработал, АПИшная ф-ция ничего не вернула... Поэтому оставил ваш вариант.
......
Все равно, большое спасибо, за очередной обстоятельный ответ.
Я как только прочитал, про то "что 255 символов не вмещается в экран и вид форума портится" - сразу так и сделал.
Но такой вариант не сработал, АПИшная ф-ция ничего не вернула... Поэтому оставил ваш вариант.
......
Все равно, большое спасибо, за очередной обстоятельный ответ.
Всегда пожалуйста.
Насколько я понимаю, причина в том, что в данном случае в функцию передаётся ссылка не на оригинальный текстовый буфер принадлежащий переменной, а на его копию, т.е. временный буфер, который создаётся перед вызовом функции. Соответственно даже если функция и меняет текст в этом буфере, то это ничего не даёт, поскольку оригинальный то буфер остаётся неизменным. А ссылка на временный буфер теряется при выходе из функции. Я в своё время мучился из-за этого с передачей строки в DLL. Но решение есть. Нужно передавать в функцию элемент строкового массива. При этом никакой промежуточный буфер не создаётся, и функция получает ссылку на оригинальный буфер.
Так должно работать.
длину получаю нормально, однако текст получить никак :-(
объясните как правильно инициализировать строку, и вообще возможно ли это реализовать без внешней dll ?
это надо чтобы найти символ в списке инструментов и его выбрать.
длину получаю нормально, однако текст получить никак :-(
объясните как правильно инициализировать строку, и вообще возможно ли это реализовать без внешней dll ?
это надо чтобы найти символ в списке инструментов и его выбрать.
Насчёт инициализации строки я как-раз объяснял в предыдущем сообщении товарищу lasso. Нужно либо использовать элемент строкового массива, либо просто инициализировать строковую переменную константой достаточной длины. В вашем случае проще использовать константу, поскольку заранее известно, что размер получаемой строки не превысит 78 байт:
12 байт (тикер инструмента) + 2 байта (запятая и пробел) + 64 байт (полное название инструмента) . Это максимально возможная длина строки. Ну можно округлить до 80.
Но если вам нужно просто ВЫБРАТЬ определённый инструмент в списке, то вам незачем получать его название. Нужно просто использовать сообщение CB_SELESTRING. Там в качестве строкового параметра достаточно отправить лишь начальную часть названия ("EURUSD,") и он сам найдёт и выделит подходящий элемент из списка.
API советник Million Dollar Robot близкого будущего: Сам рисует в терминале кучу прибыльных сделок... :) и когда через месяц-другой новоиспеченный миллионер пытается снять прибыль у брокера, то узнает что не было ни одной сделки... однако срок возврата денег за советник кончился... :))))))))
Ребята, помогите, пожалуйста, определить хэндл кнопок Бай/Селл в окошке Ордер. Хэндл от окошка Ордер я нашел:
Дальше пытаюсь определить хэндл кнопки (например, Бай), но в ответ получаю 0.
Самое интересное, что не получается найти хэндл ни от одного элемента в боксе "Немедленное исполнение". И от самого Немедленного исполнения тоже не удается найти. Хотя WinSpy++ видит его как отдельный элемент и показывает для него ID 0xFFFF.
Прошу строго не судить, я начинающий.