local tradelist = {};
for i = 0,getNumberOf("trades") - 1 do
tradelist[i] = "" ..
getItem("trades",i).datetime.day.."."..getItem("trades",i).datetime.month.."."..getItem("trades",i).datetime.year..";"..
getItem("trades",i).datetime.hour..":"..getItem("trades",i).datetime.min..":"..getItem("trades",i).datetime.sec..";"..
tonumber(string.format("%0.17g", getItem("trades",i).trade_num))..";"..
tonumber(getItem("trades",i).order_num)..";"..
tonumber(getItem("trades",i).trans_id)..";"..
getItem("trades",i).sec_code..";"..
getItem("trades",i).brokerref..";"..
getItem("trades",i).price..";"..
getItem("trades",i).qty..";";
Но при попытке получить номер заявки (order_num, trade_num) - длинное число (19 символов) превращается в число вида 1.2929169375034e+018 Как можно получить обычный номер заявки без e+?
Есть какие-то рекомендации для увеличения скорости работы (быстродействия) квика? Сегодня нашел в папке квика лог в корневой директории (вес 1 ГБ+). Удалил его и квик вроде как быстрее стал работать раза в 3.
Подскажите пожалуйста рекомендации что еще можно сделать? Версия квика 7.
На каждом окне в Квике в верхнем правом углу есть иконки свернуть окно, уменьшить размер, закрыть окно. А также есть иконка якоря позволяет позволяет переключить инструмент.
Можно ли как-то этот якорь аналогичным образом использовать для lua скриптов?
Подскажите пожалуйста столкнулся с проблемой - номера заявок очень длинные и когда в функцию
function OnTrade(trade) local trade_num = trade.trade_num; local trans_id = trade.trans_id;
приходит trade_num вместо обычного числа из 18 символов приходит что то типа: 1.952337642788e+018. В результате пишет не возможно создать заявку (стоп-ордер).
Как преобразовать такое число с "e+018" в обычное число сколько бы там не было символов?
Опубликовал сегодня первую версию торгового привода Enter Trade 0.1 для терминала Quik на Smart-Lab.
Привод умеет: открывать длинную позицию, открывать короткую позицию с заданным объемом, закрывать позицию частично либо полностью, автоматически выставлять защитные стоп-ордера (тип стоп и тейк №9).
Дополнительно умеет: генерировать журнал сделок, рассчитывать максимальный объем контрактов для входа в позицию, максимально допустимый размер стоп-лосса при заданных параметрах риск-менеджмента, также имеется возможность создавать оповещения с звуковым сигналом по различным событиям.
В рабочем окне привода отображается основная повседневная информация для трейдера о текущих открытых позициях, о количестве стоп-заявок по инструменту, о текущем состоянии счета, об изменении счета за день, о текущем состоянии сессии.
Комментарии и замечания по исходному коду приветствуются.
Просмотрел практически все демо-счета которые есть у брокеров для Quik для срочного рынка и не могу понять почему они так сильно отличаются от реала? а именно по времени сессии. Есть ли демо приближенное к реальным торгам?
Сегодня наткнулся на интересный пост на смарт-лабе:
Цитата
https://smart-lab.ru/blog/472380.php 1. Впервые слышу про то, что колбэки в очередь встают. На сколько мне известно — такого никогда не было. Если Вы выполняете вычисления непосредственно внутри функции OnTrade, и не успели их завершить до прихода следующего колбэка, то пришедший колбэк теряется.
Неужели это действительно так? Что не успел отработать коллбэк и вернуть результат, тут приходит новый и затирает собой предыдущий?
Как при использовании функции t, n, l = getCandlesByIndex(tag, line, first_candle, getNumCandles(tag)); понять что последняя свеча уже закрылась или последнее значение индикатора уже рассчитано?
На данном форуме вычитал что многие дают роботу идентификатор в поле комментарий при открытии/закрытии позиций. Не совсем понимаю как несколько роботов могут торговать на 1 инструменте? Ведь все равно сколько бы роботов не было - они будут опираться на общие данные а не анализ своих операций.
5 купились по цене 103100 3 купились по цене 103101 2 купились по цене 103102
Проходит время мы сделали докупку на 5 контрактов. 4 купились по цене 103250 1 купился по цене 103251
Проходит время мы решили закрыть часть позиций (а именно 10 контрактов). 5 было закрыто по цене 103500 5 было закрыто по цене 103501
Проходит еще время и мы решили закрыть все. 1 был закрыт по цене 103602 1 был закрыт по цене 103603 1 был закрыт по цене 103604 1 был закрыт по цене 103605 1 был закрыт по цене 103606
Как посчитать результат сделки?
Если бы это был открыт 1 контракт, либо было открыто 10 контрактов по одной и той же цене, и аналогично если бы было закрыто все по 1 цене - здесь вопросов нет...
Возможно ли для добавленной метки задать идентификатор? Либо сделать такой индикатор 2 линии которого можно будет двигать на графике? Просто двигать как передвигается стоп-лосс мышкой.
Если мы нанесем на график индикатор MA то при переключении между таймфреймами м5, ч1, и д1 он каждый раз перересуетс в зависимости от таймфрейма. Возможно ли сделать так что бы индикатор рисовал различные уровни для трех таймфреймов? Желтые для м5, синие для ч1, и красные для д1. Т.е. на каком бы таймфрейме мы не были из этих трех все равно бы нарисовались три типа уровней...?
Пересмотрел все виды стопов в Quik и не совсем понимаю как реализуется скользящий стоп на Lua? Это простое и банальное удаление и перевыставление стопа на Lua?
-- Функция создает таблицу
function CreateTable()
-- Получает доступный id для создания
t_id = AllocTable();
-- Создаем колонки
AddColumn(t_id, 0, "", true, QTABLE_STRING_TYPE, 5);
AddColumn(t_id, 1, "", true, QTABLE_STRING_TYPE, 20);
AddColumn(t_id, 2, "", true, QTABLE_STRING_TYPE, 5);
AddColumn(t_id, 3, "", true, QTABLE_STRING_TYPE, 5);
t = CreateWindow(t_id);-- Создает таблицу
SetWindowCaption(t_id, "Enter trade 0.1"); -- Устанавливает заголовок
SetWindowPos(t_id, 100, 100, 252, 532); -- Задает положение и размеры окна таблицы
-- Дальше пошли строки и колонки...
end;
Оставляю окошко таблицы скрипта работающим - закрываю Quik. После запускаю Quik и вижу что это созданное окошко-таблицы почему-то становиться сквозным при переключении между вкладками. Что может быть не так сделано?
Хотелось бы понимать возможно ли запустить несколько экземпляров скрипта по 1 на каждой вкладке.
Каждый раз когда в скрипте случается ошибка, приходится останавливать скрипт через сервисы, и по новому его запускать. Возможно ли как-то сделать так, что бы выпала ошибка - обычно ее смотрю в окне "Доступные скрипты", отредактировал скрипт и он перезапустился или продолжил работу дальше?
Возможно ли средствами LUA получить список всех зарегистрированных идентификаторов графиков, индикаторов, которые есть на данный момент. Просто список.
Есть файл №2 со скриптом Lua подключаемый в основной скрипт Lua №1 через dofile(). Можно как-то создать исключение если в этом файле №2 есть ошибка - проигнорировать его и не прерывать работу скрипта №1. Проводимые вычисления и операции в скрипте №2 никак не затрагивают работу скрипта №1.
При разработке скрипта на LUA, который запускается через "Сервис > Lua-скрипты..." используется следующая конструкция:
Код
IsRun = true; -- Флаг поддержания работы скрипта
function OnInit()
-- настройки
end;
function main()
-- Цикл будет выполнятся, пока IsRun == true
while IsRun do
if IsWindowClosed(t_id) then --закрываем скрипт, когда окно закрыто
OnStop();
end;
sleep(2000);
end;
end;
Когда создается индикатор используется следующая конструкция:
Код
Settings =
{ ["Name"] = "NAMEINDICATOR",
line =
{ { Name = "NAMEINDICATOR",
Color = 0xff0000,
Type = TYPE_HISTOGRAM,
Width = 2
},
}
};
function Init()
return #Settings.line;
end;
Возможно ли в создаваемых индикаторах делать создание окон таблиц и сделать такой же цикл function main() sleep(2000). Или индикаторы затачиваются только на работу и изменение значений графика?
Функция как получаю текущее число открытых позиций:
Код
-- QUIK Получить: текущее кол-во открытх позиций
function _QuikGetTotalnetByIndex(code)
for i = 0,getNumberOf("futures_client_holding") - 1 do
if getItem("futures_client_holding",i).sec_code == code then
return getItem("futures_client_holding",i).totalnet;
end;
end;
return 0;
end;
Сейчас 0 контрактов. Купили 2 контракта. Приходит ответ в функции в OnTrade() что куплено 2 контракта. Но если внутри данной функции сделать запрос на кол-во контрактов _QuikGetTotalnetByIndex() - то будет 0.
Если купить еще 3 контракта, и сделать запрос в OnTrade() - то он выведет значение 2. Складывается впечатление что таблица ограничений по клиентским счетам "futures_client_holding" обновляется после таблицы сделок, либо чего-то не понимаю?
Можно создать стоп ордер - NEW_STOP_ORDER Можно удалить стоп ордер - KILL_STOP_ORDER
Каждое из действий является 1 транзакцией и 1 событием.
Как грамотно написать функцию изменения текущего ордера, что-то вроде MODIFY_STOP_ORDER? Не нашел в сети материалов на данную тему. На форуме есть несколько не развернутых примеров. Хотелось бы больше информации.
Обычно выставление стоп-лосса затачивается на то какой объем был куплен или продан. Продали 100 контрактов = 1 стоп на 100 контрактов Учитывая то что продажа 100 контрактов может происходить частями по 45 по 5 и по 50 контрактов, то соответственно можно и стопы также выставить по 45 по 5 и по 50. И здесь при закрытии позиции начинаются сложности - закрытие также может произойти частями по 30, по 20 и по 50. И сложно пересчитать каждый из ордеров.
Другое дело если каждый ордер это 1 контракт. Продалось 30 контрактов - сняли 30 стопов. Продалось еще 20 - сняли 20 и т.д. Насколько вообще в принципе жизнеспособна идея купив к примеру 100 контрактов выставить не 1 стоп, а 100 стопов по 1 контракту.
При торговле на 10 контрактов по инструменту допускаю что все это допустимо 10 продано = 10 ордеров. А вот когда число контрактов 100, 500?
Подскажите пожалуйста, есть ли возможность выбирать отфильтрованные, отсортированные данные из таблиц хотя би примитивными способами на уровне SEL ECT * FR OM table SORT sec_code WHERE sec_code = Si. А то получается при запросе данных нужно каждый раз обходить таблицу.
Но звук будет проигран не в фоновом режиме. Обычно воспроизведение звука занимает 5-10 секунд, что останавливает основную работу скрипта. Можно ли как-то проиграть данную команду в фоновом режиме. Либо как-то запустить проигрыватель VLC.exe для проигрывания звука в фоновом режиме?
function LogWrite(name, log_type, log_array)
local content = "";
local i = 1;
for key, value in pairs(log_array) do
content = content.."\t"..value..";";
content = string.gsub(content,"([.]+)",",");
i = i + 1;
end;
message(tostring(content));
end;
Массив считывается через цикл, но почему-то у него получается иная последовательность. На выходе ожидаю строку: 100; Si; -10; 10000; 1; По факту последовательность другая: Si; 1; 100; -10; 10000;