Владимир написал: Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.
Я правильно понимаю, что список параметров, которые можно получить с помощью GetParamEx, до сих пор является тайной за семью печатями, и нигде-нигде официально не описан?
Не совсем так, он не является тайной. Он есть в info.chm -Раздел 8. Алгоритмический язык QPILE --Функции для получения значений Таблицы текущих торгов ---Значения параметров функций
Если там какого-то параметра нет, его можно узнать выведя таблицу по DDE с установленной галкой "Формальные заголовки"
дмитрий б написал: Я эти значения вывожу в таблицу чтоб узнать работает это или нет а в дальнейшем я эти значения буду использовать в коде .
Если требуется просто узнать работает или нет, то можно запустить отладчик (в контекстном меню таблицы)
Цитата
дмитрий б написал: Подскажите а могу ли я эти значения приобразовать в переменные примеру bar1 bar2 также с максимум и минимум этих баров как это лучше сделать
Вопрос не совсем понятен, зачем преобразовывать, если у Вас и так есть массивы CANDLE и CANDLE_OLD из которых Вы уже можете взять максимум и минимум.
дмитрий б написал: Пожалуйста подскажите что надо делать дальше потому что я в программирование совсем недавно подскажите и если не трудно надпишите код желательно с прояснениями если не трудно заранее спасибо большое
У Вас есть массив CANDLE_OLD, Вам остается только что-то с ним сделать, например вывести в таблицу. Как вывести в таблицу можно посмотреть на примере аналогичного массива CANDLE Вам остается просто заменить одно на другое.
дмитрий б написал: ПЫТАЮСЬ ВЗЯТЬ ЗНАЧЕНИЕ ПРЕДЫДУЩЕЙ СВЕЧИ ВСЕ РОВНО ПОЛУЧАЕТСЯ ТЕКУЩАЯ СВЕЧА А НЕ ПРЕДЫДУЩАЯ
Здравствуйте, По присланному коду не видно чтобы была попытка взять предыдущую свечу. Видно что Вы ее сохраняете в массив CANDLE_OLD однако больше с этим массивом Вы ничего не делаете.
s_mike@rambler.ru написал: Оказалось, что у брокера весна и он начал транслировать в таблице обезличенных сделок информацию за вечернюю сессию предыдущего дня.
Отказ от классов вечерней сессии был в версии 11.0 шлюза срочного рынка: 11.0
Sergey Gorokhov написал: не зная логики скрипта трудно сказать влияет та или иная настройка или нет.
Разве я где-то писал про настройки, влияющие на скрипт с именем XXXXX?
Я писал о настройках сервера/шлюза/остального, которые могут повлиять на работу любого скрипта.
В таком случае, влияют абсолютно все настройки логинов ТС/шлюзов/сервера/прав/терминала. Отправить их все в QLUA не представляется возможным, ровно как и адаптировать робота под каждую из них.
s_mike@rambler.ru написал: А зачем перечислять? Открываем админку сервера и по каждой настройке. Может она влиять на функционал скрипта? - добавляем в список То же самое и про настройки рабочего места
не зная логики скрипта трудно сказать влияет та или иная настройка или нет.
Михаил, Увы но как уже было сказано чтобы у всех, все, было одинаково никогда не будет. Если стоит задача определения параметров, уточните что именно Вам бы хотелось проверять. И как именно Вы бы хотели их проверять И мы зарегистрируем пожелание на доработку
s_mike@rambler.ru написал: Я хочу иметь возможность узнать те настройки, которые явно влияют на поведение и функционал скриптов. Раз брокер может их менять - дайте их на чтение из скрипта
почему бы нет, это хорошее пожелание на доработку. давайте попробуем перечислить нужные в скрипте опции
Михаил, Вопрос понятен. Вы хотите чтобы у всех брокеров все было одинаково. Такого не будет. Ибо каждый брокер решает свои задачи по организации доступа к торгам и у каждого брокера есть возможность настроить наш софт под эти задачи. С Вашей стороны, как программиста, нужно предусмотреть в коде возможность того что брокер может отключить функционал.
Константин Рейм написал: Ошибка отправки транзакции: Не найдено поле "Проверять лимиты" для транзакции "Ввод заявки" по классу "FORTS (опционы)"
Установите в терминале QUIK настройку Настройки - Основные - Торговля - Заявки - Применять стандартные формы ввода. Попробуйте создать карман транзакций (Торговля - Карман транзакций) и положить туда транзакцию "Ввод заявки" по классу "FORTS (опционы)" с заполненным признаком "Проверять лимиты" Сообщите получится или нет?
Optimus1 Optimus1 написал: А получать фактические данные с уже высчитанного уграфика RSI без доп. вычислений в скрипте - не поулчится ?
для получения данных с графика в QLUA есть функция getCandlesByIndex
Цитата
Optimus1 Optimus1 написал: Что то не увидел, чтобы разработчики Quik там что то любезно предоставили :)
речь про ссылку Все индикаторы на Lua там все индикаторы которые есть в QUIK реализованы на LUA Функции которые используются, в том числе позволяют проводить расчеты по заданной таблице данных
Евгений Миронов написал: в том то и дело что там нет цены приобретения акций. например вчера купил акции газпром за 150 руб/штука, сегодня они стоят 152 руб. но уже нигде не вижу цены 150, т.к. таблица состояния счета имеет колонки Цена и ликвидная цена
"Баланс. цена" - Для спот-рынка – соответствует значению параметра «Цена приобретения» в таблице лимитов по бумагам.
Здравствуйте, Дело в том что для получения данных по SiM6 требуется указать параметр USE_CASE_SENSITIVE_CONSTANTS Суть работы этого параметра в том что абсолютно все строковые константы становятся зависимыми от регистра букв. Это касается не только пользовательских констант, но и служебных. В частности Ваш код не работает так как служебные константы "High", "Low", "Close" и "Volume" указаны в неправильном регистре. Согласно документации, они должны быть указаны БОЛЬШИМИ буквами.
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Кирилл Мазеин написал: А кодировка может повлиять на объявление переменных?
Согласно документации для Qpile скриптов кодировка должны быть CP-1251. Любая другая кодировка уже означает что есть вероятность некорректной работы скрипта
Николай Бехтерев написал: А если мой пример, и функция main( ), в которой я что-то делаю с fut_pos? Да, в коллбеке пусто, но в майн табличка будет обновляться после коллбека?
Причем тут Main и колбек? Видимо происходит какое-то непонимание процесса.
В main ничего не будет обновляться пока Вы сами это не напишите. Хотите передавать таблицу в main напишите так:
Код
mytable={}
function OnFuturesClientHolding(fut_pos)
mytable=fut_pos
end
function main()
while true do
message(type(mytable)) --работаем с таблицей mytable
end
end
Николай Бехтерев написал: Ясно, что описаны, просто я не совсем понимаю, что делают другие битовые функции, вот и спросил, есть ли способ за одну битовую функцию на этими битами узнать всё и сразу. Ясно, будем тыкать.
Рекомендуем почитать в интернете статьи на тему "Битовые операции". Без этой теории трудно будет разобраться, зато когда разберетесь флаги покажутся легким делом.
Николай Бехтерев написал: Хорошо, но если в описании функции КоллБека не передать табличку, то она не обновится, верно? Т.е. в моём примере выше, в отличие от вашего табличка с данными обновится, а в вашем нет, по сколько функции не передаётся таблица, верно?
В Вашем примере Вы ничего не делаете с "fut_pos", а раз ничего не делаете какой к нем смысл. Зачем обновлять таблицу раз Вы с этими обновлениями все равно ничего не делаете. Поэтому в моем примере я убрал ее, тем самым показав что этот параметр не обязателен. Проще говоря, хотите работать с данными которые пришли в колбек, задайте параметр функции, если нет можете не задавать, на ваш вкус.
Николай Бехтерев написал: Есть способ выяснить за одну функцию (хелп в этом деле скромный помощник, я чуть ли не методом тыка выведываю всё) сразу все флаги? А то как-то нелепо каждый бит bit.band'ом щупать.
Флаги описаны в хелпе, глава "Описание битовых флагов"
Кирилл Мазеин, Если язык непривычный, Вы можете перейти на Lua. QPILE мы уже давно признали устаревшим и оставили только для обратной совместимости. Ошибка "Missing assignment" говорит о том что какая-то из переменных не задана.
Здравствуйте, Выполните очистку данных через меню Система - Заказ данных - Перезаказать данные. В появившемся окне поставить все галки и нажать Перезаказать
Космонавт написал: ок но Ваш ответ о другом у меня вопрос почему при проходе 61 акции sleep (1) даёт задержку не 61 миллисекунда, а гораздо больше.
потому что 61*15 = 915мс займет обработка цикла. Если проще то sleep не может работать чаще чем ему разрешит операционная система. Частоту системного таймера Windows можно изменить, но это на Ваш страх и риск и рассказывать как это делается мы не будем. К слову если точнее, то частота системного таймера равна 15.625
Николай Бехтерев написал: И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
можно и без speep Например запоминать номер выставленной заявки и перед выставлением новой, проверять исполнилась старая или нет через функцию getOrderByNumber
function OnQuote(class, sec)
if class == "SPBFUT" and sec == "SiM6" then
stock = getQuoteLevel2(class, sec)
OFFER_PRICE = stock.offer[1].price
if (OFFER_PRICE < LAST_OFFER_PRICE) then
--sendTransactio("ТУТ УБИВАЕМ ПРЕДЫДУЩУЮ ЗАЯВКУ")
-- while не выясним убили мы заявку или нет, не выставляем новую.
--sendTransaction
end
LAST_OFFER_PRICE = OFFER_PRICE
end
end
function main()
while is_run == 1 do
sleep(1000)
end
end
Николай Бехтерев написал: какой минимальный набор в main, я чувствую что у меня всё по коллбекам сейчас раскидается. что же оставить в main?
Достаточно в main оставить цикл вида while is_run == 1 do sleep (1000) end
Цитата
Николай Бехтерев написал: А ещё у меня ощущение, что без sleep( ) скрипт, даже если засунуть по коллбекам всё, работать не будет. Я прав? Получается в main засовывается sleep всё равно?
Во первых никто не говорил что надо "все" перетаскивать. Как уже было не раз сказано, перенести надо только проверку и только результат этой проверки (выставление заявки)
Во вторых, рекомендация дана исходя из того кода который Вы привели,, если у Вас код другой рекомендация тоже может быть другой. В общем случае, если есть циклы их желательно держать в main В частном случае (то что Вы написали выше) в цикле (который "while totalnet >= 0 do") нет необходимости и только по этому была дана рекомендация от него избавиться.
Николай, Никто не говорил что main надо убрать. речь о том чтобы перенести проверку и выставление заявки в колбек OnQuote Без main скрипт отработает один раз и остановится.
Sergey Gorokhov написал: и проверка на totalnet вам по сути не нужна.
почему? Потому что мы должны на все 100% удостовериться, что сняли заявку и это мы опять в OnTrade смотрим?
OnTrade - это НЕ заявки, это сделки. Если Вам нужно смотреть снятие заявки, это OnOrder
Цитата
Николай Бехтерев написал: Цитатав main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleepНе понимаю почему проверку в OnQuote если всё равно происходит выставление заявки в main? Т.е. допустим мы в OnQuote будем иметь два ценовых уровня OFFER и LAST_OFFER допустим мы сравнили и выяснили, что наша заявка не лучшая, тогда нам всё равно эту перемену как-то нужно передать в main и получится уже два if-then, а значит большая вычислительная мощность, разве нет?
Зачем в main передавать переменную и там ставить заявку когда все можно сделать в OnQuote? Сейчас у Вас как раз код написан не оптимально. Раз есть sleep то значит проверка произойдет с задержкой, а оно Вам не надо Я Вам предлагаю наиболее оптимальный вариант без всяких циклов и sleep. Прислушаться к совету или нет дело Ваше.
Здравствуйте, На сколько становится понятно, задача проще чем кажется. Раз папка и имя файла заранее известны, значит нужно делать не поиск файла а проверить его существование. Это легко делается функцией io.open с параметром "r+" Если функция вернула nil значит файла не существует
В коде действительно много ошибок, но суть понятна В колбеке на стакан Вы обновляете текущую цену. в main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleep