Let_it_go написал: Suntor если я уберу flush при каждой записи, не появятся ли чрезмерные риски того, что какая-то часть данных не запишется? Ну например я принудительно остановил скрипт. Ведь в этом случае какие-то строчки потеряются? Или не потеряются?
При останове скрипта луа машина, встроенная в терминал, автоматически закрывает все файлы посредством close(). Это происходит с версии qlua 6.xx вроде.
Вызов close() всегда подразумевает flush() - так устроена библиотека С.
Поэтому вы ничем не рискуете.
flush() имеет смысл только в том случае, если вы в реальном времени другой программой читаете создаваемый файл. Flush() сбрасывает файловый буфер на диск немедленно. Без него файловые операции кешируются в памяти. В момент закртытия файла все буферы сбрасываются на диск.
Igor Golovin написал: Можно ли одним скриптом луа запустить другой.? Пример идет скальпинг, и есть таблица визуализации итогов. Нужно, что бы скальпинг жил своей быстрой жизнью, а таблица своей медленной (дабы не тормозить процесс) . Можно за пустить два разных скрипта,.... Но можно ли сделать из одного (один скрипт загружает другой) ?
нельзя.
можно запустить 2 скрипта заранее. Первый работает, а второй крутится вхолостую иоемурсы не кушает. А нужный момент первый создаёт сигнал второму, что пора просыпаться. Сигналом может быть все что угодно - мьютекс, memorymappedfile и так далее. В простейшем случае файл.
арифметика плюс/минус между целыми числами, хранчщимтся в формате double, в 99.99 случаях даст целое, если сумма не представится большим числом, в котором будет переполнение мантиссы.
умножение и деление, не говоря уже о всяких корнях, в большинстве случаев уже даст накопившуюся ошибку.
аккуратнее с этим обфускатором. Не будет работать в длинном ряде случаев. Самомодифицируемый код - один из примеров. Любые функции типа dofile использующие upvalues, будут обработаны некорректно и так далее.
Как Вам вариант с генерацией файла типа pid индикатором? Имя файла - уникальный key. Внутри можно или просто датавремя последнего тика писать. Тогда настройки в отдельный файл при перезапуске индикатора сохранять. Либо датавремя+настройки дампить прямо в key-файл.
здравствуйте.
с файлом проблемы три.
1. При аварийном завершении терминала файлы останутся на диске. Можно попробовать поиграться с temporary files
2. Дата время внутрь файла не вариант. Существуют инструменты с двумя сделками за торговую сессию
Есть некая shared область памяти, куда каждая запущенная копия индикатора должна дописывать свою запись в виде key=data/ key должен быть уникальным. При уничтожении индикатора запись должна уничтожаться.
Читая эту область памяти, внешнее ПО должно получатьсписок ключей (то есть запущенныхкопий индикатора) и данные, к этой копии относящиеся. При удалении индикатора данные должны уничтожаться.
Есть индикатор, одновременно запущенный на несколшьких разных инструментах (или одинаковых), с разными или одинаковыми настройкками, на произвольных таймфреймах и т.п.
Необходимо:
Найти способ для каждой запущенной копии индикатора сгенерировать свой ключ (строка, число) для установления связи между этой конкретной копией индикатора и внешним ПО. Основная проблема - получение внешним ПО информации о закрытии индикатора (тем или иным способом), закрытии терминала и корректная работа при перезапуске индикатора (например в режиме связанных окон).
Допустимы любые быстрые способы - средства терминала, winapi и так далее. У меня не хватает фантазии пока.
то-есть, моя мысль состоит в том, чтобы спрятать написанный на Lua скрипт внутрь скомпилированной библиотеки, но при этом код останется тем же, какой можно напрямую запустить через диалог скриптов в Quik...
как бы это сделать по-человечески?...
ну собственно так оно и делается. Все возможности для этого в C API имеются.
если это будет необходимо, пишите, спрячу ваш готовый скрипт в dll, дело на пару минут.
s_mike@rambler.ru написал: если вы хотите большей надёжности, наиболее правильный путь это встраивание скрипта на луа в dll. Этим способом пользуюсь сам.
А можно поподробнее?... и как всё это прикручивается к Quik в конечном счёте.
есть такая штука - lua C Api.
позаолчет писать dll для луа скриптов.
в числе прочего можно создать функцию в длл и вызывать ее из скрипта. Можно также вызывать из длл функции скрипта.
Мое знакомство с некоторыми из них привело к осознанию, что никто не написал грамотного декомпилятора, который качественно восстанавливает текст скрипта из скопилированно варианта.
однако части скрипта можно увидеть прекрасно.
поэтому полагаться на компиляцию скрипта в luac вид можно условно.
если вы хотите большей надёжности, наиболее правильный путь это встраивание скрипта на луа в dll. Этим способом пользуюсь сам.
Алексей написал: Создана текущая таблица торгов с десятком выбранных инструментов. Она закреплена (в связке) с окном графика, так чтобы при выборе нужного инструмента менялся и график. Вопрос: можно ли реализовать возможность изменения идентификатора графика при смене инструмента? Необходимо для выполнения скриптов.
Алексей Ч привел вам код индикатора, иллюстрирующий проблему отсутствия вызова ondestroy.
"Проверили у себя на вашем скрипте. Версия рабочего места 7.16.3. Проблема не воспроизвелась"
каким образом у вас не воспроизводится проблема - одному богу известно. Если ondestroy в режиме связанных окон не вызывается - вы не можете не получить размножение меток. Только или не пробовать ))
Я же изначально вам писал о проблеме, которая возникает при выставлении меток из скрипта. Если вызов setlabelparams приходится на момент перерисовки графика с требуемым идентификатором, то происходят непредсказуемые вещи. Метка может оаздвоитьмя, может не раздвоиться. Setlabelparams возвратит false, самочувствие дескриптора метки также нельзя предсказать
Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Смена инструмента осуществляется при помощи настроек диаграммы? Можете выложить Ваш скрипт. На вопрос выше ответим позднее.
скрипт можно написать так.
создаем скриптом метку на графике с идентификатором xxx.
далее с периодичностью скажем в 100 миллисек ее перерисовываем посредством setlabelparams
все работает, проблем нет.
теперь любым способом из пользовательского интерфейса руками заставляем обновиться график с идентификатором xxx.
в части случаев (когда везёт) метка продолжает переустанавоиваться.
А вот если переустановка попала на момент перерисовки графика, там получается эффект непредсказуемый.
метка по своему номеру становится недоступной, setlabelparams возвращает false, изображение метки на диаграмме или остаётся или исчезает, непредсказуемо.
Впрочем, брать разницу между двумя произвольными соседними свечами тоже неправильно - между ними может быть промежуток более чем в длительность интервала (например, ночью)
Замечен такой эффект. Если из скрипта переустанавливать на графике скществующую метку, а в это время идёт перерисовка графика при смене инструмента, метка не только не переустанавливать я, но ещё и вовсе пропадает из таблиц терминала, делая невозможными любые последующие с ней действия.
Не могу понять, что происходит с метками в момент обновления окна в режиме связанных окон.
насколько я могу предположить, что после обновления окна идентификатор остается тем же и функция Setlabelparams должна метку найти и переставить. если запрос setlabelparams происходит в момент обновления окна, там может произойти что-то неясное и, как я думаю, происходит. Но что?
Каков должен быть алгоритм работы по перестановке метки из скрипта посредством setlabelparams? чтобы он работал в режиме связанных окон?
Напоминаю также о ошибке, заключающейся в отсутствии вызова ondestroy индикатора в том же режиме связанных окон. Это серьезная проблема - невозможно исполнить финализацию (закрыть процессы, удалить файлы, отвязаться от апишных дел и прочего)
приходится перед crrsyedatasource вызывать getsecurityinfo, чтобы проверять есть ли инструмент, да и это при запуске скрипта вместе с терминалом не помогает.
Что обусловлено отсутствие колбеков от Createdate source при условии, что последний вернул код успеха? Эффект проявляется при запуске терминала с работающим скриптом.
Эффект никогда не проявляется при запуске скрипта при уже работающем терминале.
Михаил Понамаренко написал: Здравствуйте! А моё пожелание уже не меняется уже более 10 лет. Возможность привязки метки к координатам окна диаграммы. Это позволит фиксировать надписи, например, к левому верхнему краю.
это не поможет фиксировать надписи у левого ВЕРХНЕГО края диаграммы, так как происходит постоянное масштабирование по вертикали и надписи будут либо спускаться вниз или уходить на верхний край.
длч решения такой задачи необходимо иметь механизм низкоуровневого рисования, как это например реализовано в программах теханализа и других более дружественных терминалах ( например метатрейдер)
этому пожеланию очень много лет, больше 10. Не делают, ведимо невозможно.
Даже в случае, когда на графике всего одна свеча, использовать этот колбек невозможно. Расчет индикатора может явно зависеть от выбранного таймфрейма, а при изменении этого таймфрейма индикатор об этом ничего не узнает и будет работать неправильно.
А какой в этом смысл? какую полезность можно вынуть из этого колбека, который сигнализирует о начале полного пересчета только в половине случаев из всех возможных?
отлавливать перерасчет свечей необходимо не только при изменении параметров, но и при смене таймфрейма.
узнать о смене таймфрейма-то мы не можем: колбека на изменение таймфрейма нет.
Sergey Gorokhov написал: s_mike@rambler.ru , Михаил, То что функция не срабатывает при изменении таймфрейма не значит что ее нельзя использовать. Да она не решает конкретно одну описанную задачу, но она и не должна ее решать согласно документации. А значит, это пожелание на доработку, которое мы можем предложить зарегистрировать.
Регистрируйте.
А сможете привести пример полезного использования этого колбека? Для чего его можно использовать?
Я не могу придумать, как этот колбек вообще можно применить.
Как я понимаю, смысл этого колбека предполагался в отслеживании момента начала процедуры пересчета всех свечей в индикаторе, начиная с первой. Основное назначение - отличить начало пересчета от повторных расчетов первой свечи, если она единственная.
Но если этот колбек не вызывается при смене таймфрейма - его использовать для этой заявленной цели невозможно: таймфрейм сменился, полный перерасчет всех свечей начался, а колбека-то нет!
Sergey Gorokhov написал: s_mike@rambler.ru , Михаил, но IP адрес у нашего демо только один. Даже если речь не про наш демо, а про брокерский, можно проверить ip и на всякий случай еще порт IPPORT
Сергей.
причем тут ваш сервер?
речь идёт о способе отличить реальные торги от учебных в общем случае / у любого брокера, а не про количество учебных серверов у вас.
Sergey Gorokhov написал: s_mike@rambler.ru , Михаил, но IP адрес у нашего демо только один. Даже если речь не про наш демо, а про брокерский, можно проверить ip и на всякий случай еще порт IPPORT
Sergey Gorokhov написал: Андрей , Здравствуйте, Самый надежный способ по IP адресу. Для этого используйте функцию getInfoParam с параметром IPADDRESS Подробнее в документации QLUA.chm глава "Сервисные функции", раздел "getInfoParam"
странный совет.
вот написал я скрипт и раздал его десяти разным людям. Скрипту хочется знать, запущен ли он на демо или на реальных торгах.
как скрипт, получив ip адрес, должен понять, демо это или нет? Брокеров куча, демонстрационных площадок тоже немало.
надо только добавить, что так можно делать только если часовой пояс вашего компьютера совпадает с часовым поясом биржи или Квик настроен на трансляцию времени в локальном поясном времени. В остальных случаях будет по прежнему несостыковка
Андрей написал: Доброго времени суток. Хотелось бы узнать, как получить реальную цену открытия позиции, а не цену открытия позиции после клиринга ?
Т.е. что бы допустим, я запустил робота, прошел клиринг, а он смог бы узнать реальную цену открытия. или же вдруг на сервере произошла перезагрузка, терминал был выключен после запускаю все заново и робот смог бы опять подхватить реальную цену открытия. (интересует как срочный рынок, так и фондовый) и желательно без костылей вроде сохранения цены открытия в базе данных и прочего...
вы хотите то, чего не может быть в природе. Вы можете открывать позицию одной сделкой, несколькими сделками, увеличивать ее, уменьшать и так далее, все по разным ценам. Это множество цифр совершения сделок. Какую из них вы назовёте ценой открытия - никто не знает.
поэтому максимум что можно пробовать спросить у терминала это текущую себестоимость. Себестоимость тоже можно считать разными способами и не факт, что используемый в терминале способ будет тем, что нужен вам.
Алексей написал: Подскажите мне балбесу,как из функции getClassSecurities взять к примеру первое значение ,проблема в том что переменная содержит запятые и поэтому выражение message(sec_list[1],1) выводит nil