Добрый день. Он не нуждается в деинсталляции - достаточно просто удалить вручную папку с программой. После этого практически никаких следов от нее не останется.
Вообще интересно, как именно, то есть на основе каких данных разработчики строят в терминале Таблицу изменений параметров. Возможно, что в базе данных терминала все-таки хранится порядковый номер в пределах одной секунды того момента времени (временного среза), когда было получено изменение того или иного параметра, относящегося к любому инструменту (из числа тех, по которым в терминал поступают изменения параметров). Но тогда непонятно, почему нельзя было предоставить возможность получать значение этого номера с помощью QLua. Поэтому у меня даже возникли сомнения в том, можно ли полностью доверять той информации, которая отображается в Таблице изменений параметров. Хотя не исключено, что эта таблица строится как-то иначе, без использования подобных номеров. В связи с этим хотелось бы услышать от разработчиков, хотя бы вкратце, как же именно реализовано построение Таблицы изменений параметров в терминале.
Серж пишет: Я не решал подобных задач, но полагаю, что для тех параметров, которые изменяются реже одного раза в мс (а это все параметры из ТТП), можно построить таблицу соответствий вида:
Код
{par1_i, par2_i},
где par1_i, par2_i - значение каждого параметра, синхронизированные по значению ms
К сожалению, этого сделать не получится, так как в ТТП время записей приведено с точностью до целых секунд. Миллисекунд там нет. Кстати, видел, что разработчики не так давно писали (еще на старом форуме) о том, что биржа теперь может транслировать миллисекунды для ТТП по инструментам с рынка FORTS. Однако разработчики пока еще не решились добавить этот параметр в ТТП.
В таблице "Клиентский портфель" нажмите право кнопкой мыши на любой строке и выберите пункт контекстного меню "Открыть таблицу [Купить/Продать]. В открывшейся таблице для тех акций, которые доступны для short, в колонке "Тип" присутствует буква К.
1) Иногда брокеры предусматривают несколько разных настроек подключения к одному и тому же серверу (через разных провайдеров брокера). Это делается на случай выхода из строя интернет-канала одного из провайдеров. Дополнительных денег от вас это не требует. Более точную информацию вы можете получить у своего брокера. 2) Да, только к этим айпи. 3) Правильно. 4) Если выход в интернет у вас организован через прокси-сервер (например, при нахождении внутри корпоративной сети), то необходимо прописать настройки этого прокси-сервера в меню Настройки / Соединение с Интернетом.
Дмитрий пишет: Вопрос немного не по теме - а айсберг заявки можно выставлять не только по акциям на фондовой секции Московской биржи, но также и на других секциях (на валютном, на срочном рынке)?
Все файлы хранятся в папке с файлом info.exe и ее подпапках (подкаталогах). Если при перемещении не находит ключ - значит, надо проверить какой путь к нему указан в настройках. Обычно эти пути прописаны в файлах signalcom.ini , SSLPro_Pr.ini Если ключ лежит в подпапке программы Quik, а путь в файле настроек указан абсолютный, то он при перемещении программы не будет найден. Либо исправьте полный путь, либо пропишите относительный (считая, что папка с файлом info.exe является текущей).
А для того чтобы получить доступ к данным графика цены или стандартного индикатора с помощью функции GET_CANDLE языка QPILE - их обязательно предварительно открывать в терминале? Или же она работает по принципу CreateDataSource из QLua, то есть независимо от наличия в терминале открытого графика?
sam063rus пишет: что мешает Вам самим написать аналоги стандартных индикаторов на qlua
То, что это займет какое-то время... И мысль о том, зачем заново писать то, что уже написано? Кстати, а готовых текстов этих стандартных индикаторов на QLua Вам не встречалось?
sam063rus, то что Вы пишете - очень печально. Я, например, задавался вопросом - что если мне понадобится проанализировать, какие сигналы выдает тот или иной имеющийся в Quik индикатор на графиках по нескольким десяткам разных инструментов на разных временных интервалах. Я так понимаю, что прицепив индикатор к графику цены, этому индикатору можно присвоить идентификатор, по которому затем получать в скрипте его значения с помощью getCandlesByIndex. Но добавлять индикатор на график цены можно только вручную, так же как и присваивать ему идентификатор (tag). Очевидно, что при количестве инструментов в несколько десятков, помноженных на несколько таймфреймов, эта задача становится практически невыполнима. Если бы разработчики хотя бы сделали аналог функции CreateDataSource для индикаторов, с помощью которой можно было бы получать их значения, привязав как-то индикатор к данным, получаемым с помощью этой функции (CreateDataSource) по определенному инструменту - то отсутствие возможности автоматического открытия графиков и добавления на них индикаторов было бы не так страшно.
Здравствуйте! Скажите, пожалуйста, что означает поле Идентификатор сессии в Информационном окне (строка из 36 символов)? Для чего он нужен? И почему у одного брокера значение этого идентификатора одинаковое для двух разных серверов (в течение одного дня), а у другого - всегда разное (т.е. для каждого сервера свой идентификатор). О чем это говорит?
Тут надо еще учесть, что реальное расписание может отличаться от приведенного. Например, в дни экспирации опционов Вечерний клиринговый сеанс продлевается до 19:10. Плюс бывают всякие нештатные ситуации, правда реже.
Подскажите еще, пожалуйста - можно ли в клетки этих экранных таблиц, созданных с помощью Lua, вводить какие-то данные? Есть ли более простой способ сделать это, чем перехват нажатий клавиш внутри функции, заданной с помощью SetTableNotificationCallback() ?
Николай Камынин, и Вам спасибо! :) Не ожидал, что столько ответов получу на свой вопрос.
Цитата
Серж пишет: Функции работы с таблицами, в т.ч. DestroyTable() не работают после нажатия кнопки "Остановить", поэтому их вызов надо размещать в колбеке OnStop().
А об этом где-то разработчики писали или это тоже из разряда нигде не упоминающихся особенностей?
Серж и sam063rus, спасибо за помощь! Про порядок вызова функций в документации, к сожалению, ничего не сказано. Использование враппера, судя по его тексту, скорей всего привело бы к той же самой ошибке при добавлении строк, если бы я добавлял их функцией QTable:AddLine() до вызова QTable:Show(). Во всяком случае в примере его использования из справки сначала идет Show, а уже потом AddLine. Наверное, при работе с большим числом таблиц удобней было бы использовать quik_table_wrapper.lua, но мне было нужно создать одну простейшую таблицу для эмуляции работы экранной кнопки типа старт/стоп и одной настройки в виде check box. С экранными таблицами раньше не работал, поэтому решил пока не заморачиваться изучением текста quik_table_wrapper.lua.
Здравствуйте! Пытаюсь создать таблицу для последующего вывода на экран. Но почему-то в нее не добавляются строки. Вдобавок не отображается заголовок окна. И при вызове функции DestroyTable() окно не закрывается (хотя должно, как я понял из документации). Что я делаю неправильно? Вот код:
Код
stopped = false
function OnStop(stop_flag)
stopped = true
end
function main()
t_id = AllocTable()
res = AddColumn(t_id,1,"col1",true,QTABLE_CACHED_STRING_TYPE,30)
message("AddColumn - " .. tostring(res), 1)
res = AddColumn(t_id,2,"col2",true,QTABLE_CACHED_STRING_TYPE,30)
message("AddColumn - " .. tostring(res), 1)
row1 = InsertRow(t_id, -1)
message("InsertRow - " .. tostring(row1), 1)
row2 = InsertRow(t_id, -1)
message("InsertRow - " .. tostring(row2), 1)
SetWindowCaption(t_id, "Моя таблица")
CreateWindow(t_id)
while not stopped do
sleep(1000)
end
DestroyTable(t_id)
end
Из сообщений в терминале видно, что InsertRow в обоих случаях возвращает 0.
Список доступных для транзакций инструментов, получение списка инструментов для совершения транзакций с учетом различных аккаунтов у одного и того же брокера.
Вопрос немного не по теме - а айсберг заявки можно выставлять не только по акциям на фондовой секции Московской биржи, но также и на других секциях (на валютном, на срочном рынке)?
Уважаемые разработчики, сегодня обнаружил ошибку в работе обновленной версии вашей утилиты QMinEditor.exe (кстати, путем обратной конвертации полученных с ее помощью текстовых файлов в двоичный формат, который вы так и не захотели опубликовать). Ошибка заключается в следующем: если в двоичном файле с данными графика есть свечи, где цена отрицательная (меньше 0), то в текстовый файл вместо нее выводится 0. Отрицательные цены встречаются по инструментам типа "спред" (класс FUTSPREAD) - посмотрите, например, минутные интервалы по спредам GZH5GZM5 и RIM5RIU5.
sam063rus, за последнее время я пользовался услугами двух широко известных брокеров и у обоих есть возможность не защищать ключ паролем, а путь к ключевому носителю задавался только один раз.
Я знаю, что привел грубый расчет, которые не полностью соответствует описанной в спецификации методике. Просто чтобы не усложнять пример. Я просто хотел показать, что Ваше утверждение:
Цитата
Серж пишет: Так, если бы вы купили брент по 100$ при курсе 30 руб./$, а продали по 50$ при курсе 60 руб./$, то в рублях вы бы ничего не заработали и не потеряли.
в общем случае не соответствует действительности. Именно из-за особенностей расчета вар.маржи в приведенном Вами примере мы можем получить как прибыль, так и убыток.
Серж пишет: Т.е., когда вы открыли шорт по брен, вам надо было открыть лонг по доллару на сумму 100$. В момент закрытия позиции по брен, вы закрываете лонг по доллару на 50$. И ваш финансовый результат составит 50$.
Ваша схема годится только для реальной торговли на спотовом рынке с поставкой: продали нефть, получили полностью ее цену в рублях, перевели в доллары (в итоге имеем 100$), потом через какое-то время купили обратно рубли на 50$ и закрыли позицию по нефти. В сухом остатке имеем 50$.
А при торговле фьючерсами в приведенном Вами примере фин.результат составит уже не 50$, а (37.5$ + 25$) = 62,5$ 37.5$ - от продажи фьючерса на нефть, а 25$ - от купленного фьючерса на курс доллар-рубль (50$*60 - 50$*30 = 1500 руб. = 1500/60 долл. = 25$) И зачем в данном случае открывать длинную позицию по фьючерсу на курс доллар-рубль на сумму 100 долларов, если потом закрывать ее только на 50? Что мне делать с оставшейся позицией на 50? А если ее тоже закрыть, то фин.результат и вовсе окажется равным 87,5$.
Серж пишет: Если бы вы сразу конвертировали рубли в 100$, то ваш финансовый результат составил бы порядка 50$
Вы имели в виду - купил фьючерс на доллар-рубль? Если просто купить доллары, то их как было 100, так и останется столько же, независимо от курса. Но Вы правы только при условии что рубль обесценился на столько же, на сколько нефть. А вот в 2008-2009 году рубль не падал так же сильно, как нефть.
Цитата
Серж пишет: Вы оплачиваете фьючерс именно в рублях, т.к. депозит рублёвый.
Строго говоря я его не оплачиваю, а всего лишь вношу гарантийное обеспечение, из которого может быть списана вар.маржа. Это все-таки несколько разные вещи. Ведь если бы я действительно оплачивал фьючерс в рублях и продавал потом за рубли, то не имело бы никакого значения как меняется курс в каждый из тех дней, когда у меня есть открытая позиция. Было бы достаточно учитывать только курс на день покупки и на день продажи фьючерса.
Серж пишет: Нужно, чтобы QUIK переключался на другой сервер через заданное количество неудачных попыток подключения.
А Вы попробуйте добавить в список соединений несколько одинаковых (на один и тот же сервер). Тогда он будет их перебирать столько раз, сколько Вам нужно, пока не дойдет до соединения с другим сервером. Решение корявое, но пока разработчики внесут исправление в программу (если вообще внесут) - это может решить Вашу проблему.
Еще большая засада заключается в том, что если Вы купили сегодня фьючерс по 60, а он за день упал до 50, то с Вас спишут 10$ маржи, переведя в рубли по курсу, например, 70 (10*70 = 700 рублей). Завтра фьючерс вырос обратно до 60$. Вы не закрываете позицию, надеясь на дальнейший рост. Если курс на этот день окажется не 70, а 60, то Вам зачислят маржу в размере 600 рублей (10*60). На следующий день, видя, что цена не растет, Вы закрыли позицию по цене 60$. А курс доллара опять вырос до 70. Согласно Вашему примеру на день закрытия позиции Вы должны получить нулевой результат (60$*70 - 60$*70). Но на самом деле Вы окажетесь в убытке на 100 рублей (разница между списанной в первый день и зачисленной во второй день маржой).
Дмитрий пишет: Засада в данном случае лишь в том, что курс этот меняется постоянно.
Поясню в чем именно засада - если Вы продали фьючерс по 100, а купили по 50, то по идее должны заработать 50 долларов. Но так как этот доход зачисляется Вам не единовременно при закрытии позиции, а каждый день небольшими частями, причем пересчитывается при этом в рубли по курсу на день зачисления, то при равномерном росте курса доллара за это время с 30 до 60 средний курс окажется 45. Поэтому к тому моменту когда Вы закроете позицию и решите сконвертировать свою прибыль в доллары, Вы сможете купить лишь 45*50/60 = 37,5 долларов.
Серж, в данном случае не все так просто. Результатом прибыльной продажи фьючерса на нефть является ежедневное зачисление вариационной маржи (грубо говоря, разницы между ценами фьючерса в долларах на начало и на конец сессии), пересчитанной из долларов в рубли по текущему курсу. Поэтому даже при неизменном курсе доллара происходило бы зачисление вар.маржи и, соответственно, росла бы прибыль. Т.е. Вы не оплачиваете стоимость нефти в рублях, покупая фьючерс, так же как и не получаете ее стоимость в рублях, продав его. Вы получаете доход или убыток в виде разницы между ценой покупки и продажи фьючерса, выраженной в долларах, которая умножается на курс доллара к рублю. Засада в данном случае лишь в том, что курс этот меняется постоянно.
sam063rus, вообще согласен с Вами, структура dat-файла весьма проста - можно разобрать за полчаса, особенно с Вашими подсказками ( за которые спасибо :) )
sam063rus пишет: да уж... только ленивый до сих пор не понял формат dat-файлов ))))
Я привык прислушиваться к советам разработчиков:
Цитата
Александр Шумилин пишет: Так или иначе мы не рекомендуем Вам настраиваться на работу с данным файлом напрямую. ... с нашей помощью или без неё можно попробовать его-таки"читать" - но на этом пути могут подстерегать другие неприятности. Как например есть ненулевая вероятность , что внутренний формат dat-файла может быть изменён в очередной версии программы, в целях оптимизации, например. И узнаете Вы об этом в тот момент, когда Ваш алгоритм перестанет работать.
Кстати, на случай изменения внутреннего формата dat-файла можно было бы предусмотреть в его заголовке поле, содержащее номер версии этого формата - чтобы терминал сразу мог обнаружить, если такой файл был сформирован утилитой, рассчитанной на работу со старым форматом (и сообщить об этом).