Раз уж я взялся отвечать, то попробую до конца помочь)) Снизу полный рабочий пример =)
Код
function main()
S = "Hello,World";
res = S:split(",");
message(res[1]);
message(res[2]);
end;
function string:split(delimiter)
local result = { }
local from = 1
local delim_from, delim_to = string.find( self, delimiter, from )
while delim_from do
table.insert( result, string.sub( self, from , delim_from-1 ) )
from = delim_to + 1
delim_from, delim_to = string.find( self, delimiter, from )
end
table.insert( result, string.sub( self, from ) )
return result
end
Вот так вот, правильнее вставить будет: (в прошлом сообщении один лишний перенос строки был)
Код
function string:split(delimiter)
local result = { }
local from = 1
local delim_from, delim_to = string.find( self, delimiter, from )
while delim_from do
table.insert( result, string.sub( self, from , delim_from-1 ) )
from = delim_to + 1
delim_from, delim_to = string.find( self, delimiter, from )
end
table.insert( result, string.sub( self, from ) )
return result
end
Андрей написал: ругается, похоже на то, что lua никто не объяснил, что он должен понимать этот метод
Его и нету в луа. Но я сверху добавил ссылку на аккаунт какого то парня на Гихабе, кто сделал жто дополнение. ниже привожу код с его аккаунта. Этот код нужно просто вставить в луа скрипт и тогда все заработает.
Код
function string:split(delimiter)
local result = { }
local from = 1
local delim_from,
delim_to = string.find( self, delimiter, from )
while delim_from do
table.insert( result, string.sub( self, from , delim_from-1 ) )
from = delim_to + 1
delim_from, delim_to = string.find( self, delimiter, from )
end
table.insert( result, string.sub( self, from ) )
return result
end
Подскажите пожалуйста еще, как можно добавить пользовательский комментарий к заявке ? Мне нужно будет его программно считывать. К сожалению комментарий который я ввожу в поле "COMMENT", не отображается после выставления заявки...
Sergey Gorokhov написал: Уточните еще по какому инструменту Вы смотрите данные.
Однако жто как я понял на всех акциях так получается (повторюсь, что я на демке смотрел). и повторюсь что для того что бы описанная проблемма имела место, нужно убрать в функции умножение на 100.
Код работает верно сейчас, но если убрать умножение на 100 (там где у меня стоит комментарий " -- Уточнить нужно ли умножать на 100") и попробовать достучаться до цены открытия позиции по акциям, то тогда описанная мною проблема как раз и всплывает (без этого умножения у меня цена возвращается деленная на 100).
Код
select_CurrentDeals = function(account,class_code,sec_code,limit_kind)
isPosition = false;
T_position={};
T_position.class_code = class_code;
T_position.sec_code = sec_code;
T_position.account = account;
close_price = getParamEx(class_code,sec_code,"last").param_value;
if class_code == "SPBFUT" then
T_position.position_type = 0;
for i = getNumberOf("futures_client_holding")-1,0,-1 do
T = getItem("futures_client_holding",i);
if T.sec_code == sec_code and
T.totalnet ~= 0 then
if T.totalnet > 0 then
T_position.position_type = 1;
else
T_position.position_type = -1;
end;
T_position.qty = math.abs(T.totalnet);
T_position.price = T.avrposnprice;
if T_position.position_type > 0 then
T_position.current_PL = close_price - T_position.price;
else
T_position.current_PL = T_position.price - close_price;
end;
break;
end;
end;
else
T_shares = {};
for i = getNumberOf("depo_limits")-1,0,-1 do
T = getItem("depo_limits",i);
if T.sec_code == sec_code and
T.limit_kind == limit_kind and
T.trdaccid == account and
T.currentbal ~= 0 then
isPosition = true;
T_shares = T;
break;
end;
end;
if isPosition then
lotSize = 1;
for i = getNumberOf("securities")-1,0,-1 do
T = getItem("securities",i);
if T.code == sec_code and T.class_code == class_code then
lotSize = T.lot_size;
break;
end;
end;
T_position.price = (T_shares.awg_position_price*100); -- Уточнить нужно ли умножать на 100
T_position.qty = math.abs(T_shares.currentbal/lotSize);
if T_shares.currentbal > 0 then
T_position.position_type = 1;
else
T_position.position_type = -1;
end;
if T_position.position_type > 0 then
T_position.current_PL = close_price - T_position.price;
else
T_position.current_PL = T_position.price - close_price;
end;
else
T_position.position_type = 0;
end;
end;
return T_position;
end;
Доброго времени суток. Хотелось бы узнать из за чего происходит следущее:
я стараюсь узнать цену открытия по акциям, но вместо этого получаю в ответ цену деленную на 100. То есть, 1621,5 = 16,215. Это был тест на демке Арки, на реале не проверял. Это только с демо счетом актуально ? или же на реале так же будет ?
Egor Zaytsev написал: В этом плане не планируются доработки.
Однако не только для меня это актуальная задача, спрос есть. Да и в квике многие давно не только интрадеем занимаются... Я вот сейчас задался задачей демона писать который в базу данных цены открытия сохраняет и удаляет после того как позы закрыты... Так что есть еще одна просьба зарегистрировать это пожелание на доработку системы.
Здравствуйте, можно ли как нибудь сделать следующее: 1) Если существует уже открытая позиция, прицепить к ней стоп и тейк одновременно (или же что то одно) с условием если эта позиция была закрыта (либо по рынку, либо по стопу или тейку или же еще как нибудь...) то тогда выставленные стоп лосс и тейк профит снимались бы автоматически ?
2) Открываю заявку по лимитному ордеру (или же по стоп ордеру) и после срабатывания заявки, автоматически ставятся стоп лосс и тейк профит с тем же условием, (что после закрытия позиции или же отмены выставленной заявки и стоп и тейк снимались бы)
Как я понимаю, стоит копать в направлении Связанных заявок, однако я не совсем пойму какие полы нужно заполнять в структуре для достижения требуемого результата...
Алексей написал: В принципе, да. Но в очень специфических случаях, например, когда во время клиринга происходит перевыставление долгосрочных заявок. Правда, сделки собственно во время клиринга не заключаются, поэтому OnTrade не придет со временем datetime внутри клиринга.
Благодарю Вас за ответ.
Как я понял, фильтровать события пришедшие из за клиринга и события пришедшие из за совершения сделки нужно только по полю времени совершения сделки, верно ? или же есть еще какие либо отличия ?
s_mike@rambler.ru написал: вы хотите то, чего не может быть в природе.
Ну во первых не правда. это вполне есть в природе. Лично для меня - это средневзвешанная цена на момент открытия (несколько выходов, цены - усредняем, веса - объемы входа) Либо на крайний случай подойдет и цена самой первой сделки.
Цитата
s_mike@rambler.ru написал: поэтому берите стамеску и строгайте "костыль"
Касательно костылей, хранится ли в квике история всех сделок ? или же только сделки за день (ну или с момента запуска терминала) ? И из какой из таблиц их можно достать ?
Доброго времени суток. Хотелось бы узнать, как получитьреальнуюцену открытия позиции, а не цену открытия позиции после клиринга ?
Т.е. что бы допустим, я запустил робота, прошел клиринг, а он смог бы узнать реальную цену открытия. или же вдруг на сервере произошла перезагрузка, терминал был выключен после запускаю все заново и робот смог бы опять подхватить реальную цену открытия. (интересует как срочный рынок, так и фондовый) и желательно без костылей вроде сохранения цены открытия в базе данных и прочего...
Доброго времени суток. У меня тут вопрос, от куда (кроме таблицы всех сделок) можно получить информацию о направлении прошлой сделки (за последний тик) т.е. мне нужно знать была ли покупка или же продажа на прошлом тике. Таблица всех сделок вроде дает эту информацию, однако мне нужно сделать так, что бы не нужно было в квике открывать не какие таблицы. т.е. запустил робота, и он сам тягает эту информацию.
Проще всего написать программу думаю которая будет реализовывать все функции Lua - к примеру берет файл с котировкой банально в цикле прогоняет и дергает события Lua (приход нового тика, совершение сделки и прочие...)
Мне кажется, нет я уверен, что хороший все сторонний тестер под Lua не написать (как мин без подключения доп. библиотек на языках типа плюсов и С#) Однако лучше да и правильнее скрипты Lua тестить а не в скриптах тестить) Тот же МТ5 для тестов намного лучше будет (там практически все что нужно есть для оптимизации и прочего...) Но в квике больше возможностей для торговли (опционы к примеру...) Если же использовать MT5 для тестов, то нужно будет переписывать робота на Mql и затем там тестить, оптимизировав уже можно торговать (останется только график нужного Вам инструмента в Мт загрузить там есть такая возможность.).
Андрей написал: Похоже понял, однако уточните единственный ли это способ ? Хочется все варианты перебрать.
Код
L_ptr = lua_newthread(L);
Так же скажите пожалуйста где бы взять список всех функций Луа и прочего которые в новом потоке запускаются, и какие в основном? Иначе говоря пренадлежность функция - поток (с точки зрения квика)
Ну ябы выбрал этот вариант. А все варианты... я незнаю для чего вам много потоков) принадлежность к потоку можно проверить GetCurrentThread() все колбеки - основной поток квика. мэин - вам создали дополнительный, делайте там всю обработку. у меня там крутиться очередь libuv, вполне удобно.
В итоге сделал так: 1) Выделил L под main и поместил его в класс с мьютексом. 2) L приходящую при инициализации поместил во второй класс с мьютексом.
Все функции внутри main используют класс № 1 Все коллбеки используют L которая у них в параметре приходит, парсят таблицы и передают моим коллбекам как параметр, второй параметр это класс с мьютексом № 2 - его используют все функции внутри других коллбеков.
В итоге получается что если я внутри любого из коллбеков буду организовывать свои потоки то все будет защещино. и с main не как не перекликается.
(я просто заготовку себе делаю что бы ботов не писать на lua)
lergen написал: Возникла необходимость ускорить обработку данных в написанном тестере стратегий
А как тестер писали ? он на Луа у Вас ?
По теме, можно на С++ он запускает Луа скрипты спокойно, только нужно будет источники данных делать думаю и скрипты квика переписывать под тестер. По сути программа - тестер. (первое что в голову пришло)
Андрей написал: А как мне ассоциировать второй созданный луа стек с квиком ? когда я создаю второй стек, то у меня получается так что соощения которые я в него посылаю ("message") в квике не видны уже. Я могу насоздовать сколько угодно стеков путем
Однако это же будут локальные копии внутри библиотеки. И я не смогу через них подписаться на события квика...
Похоже понял, однако уточните единственный ли это способ ? Хочется все варианты перебрать.
Код
L_ptr = lua_newthread(L);
Так же скажите пожалуйста где бы взять список всех функций Луа и прочего которые в новом потоке запускаются, и какие в основном? Иначе говоря пренадлежность функция - поток (с точки зрения квика)
А как мне ассоциировать второй созданный луа стек с квиком ? когда я создаю второй стек, то у меня получается так что соощения которые я в него посылаю ("message") в квике не видны уже. Я могу насоздовать сколько угодно стеков путем
Доброго времени суток. У меня следующий вопрос: Использую Lua_Api для плюсов. Lua 5.1.
1) Запускаю квик.
2) Квик вызывает скрипт луа и определяет несколько функций запускащихся в разных потоках. допустим это коллбеки прихода котировок и основной поток - main, Либо поток main и еще какой либо коллбек из квика работающий в другом потоке
3) Сам скрипт Lua выглядит как вызов Dll, написанной на C++.
require("My dll");
Внутри Dll я подписываюсь на эти 2 функции (т.е. коллбека от квика) и получается что вызов из терминала, отправляется в Dll и вызываются функции из моей Dll.
3.1) Внутри Dll переменная Lua вынесена в глобальную и к ней подключаются еще нескольку функций, которые могут выполняться, как в каком либо из двух потоков запускаемых квиком, так и в каком либо своем потоке...
----------
Собственно из всего описанного вытек вопрос, нужно ли мне в каждой из функций (включая те что запускаются как коллбеки с программы № 1) делать луа как разделяемый ресурс ? Или же стек сам поймет что его вызывают из другого потока и не будет глючить не чего?
Доброго времени суток, у меня вопрос касательно коллбеков языка Qlua. Точнее все те коллбеки что в руководстве пользователя занесены в раздел "Функции обратного вызова" и принимающее в качестве параметра - таблицу. Подскажите, может ли так случиться, что данная таблица будет являться массивом таблиц ? (Речь не о специфики Lua, я помню что все таблицы предоставляются как ключ значение и массивов так таковых нет) Меня интересует каким из следующих вариантов может быть принимаемая таблица:
1) Таблица содержит озаглавленные поля в руководстве и каждому из полей (столбцы) присуще только одно значение в таблице (иначе говоря в таблице есть ТОЛЬКО ОДИН РЯД). 2) Таблица содержит озаглавленные поля в руководстве и каждому из полей (столбцы) присуще более одного значения в таблице (иначе говоря в таблице есть МОЖЕТ СОДЕРЖАТЬ БОЛЕЕ ОДНОГО РЯДА). 3) ВМЕСТО таблицы, передается МАССИВ, содержащий таблицу с озаглавленными столбцами и ТОЛЬКО ЛИШЬ ОДНИМ рядом.
Приветствую собравшихся. Помогите решить проблему. У меня есть 2 скрипта по созданию таблиц OHLC данных. один для минутного графика, другой для часовика. Проблема в том, что скрипт для часовика не работает (а точнее не создает требуемую таблицу).
Смотрел пошагово, котировки получаются, таблица формируется, однако не хочет заполняться... Причем код обоих скриптов один и тот же, он отличается лишь в способе расчета времени, Котировки приходят и на часовом и на минутном скрипте, но вот часовой только не хочет отображать их в таблице... Буду признателен Вам за помощь, заранее благодарю. По этой ссылке, можно скачать оба скрипта: https://cloud.mail.ru/public/HHF1/7SDzKVRjx
Скрипт работает так "Quick 7.14.1.7" : 1) Строится график цен или же индикатора (к примеру Open Interest) 2) Задается Tag (для минутного RTS_M1, для часового RTS_H1) - Дважды кликнуть по графику, затем вкладка "Дополительно" и в поле идентификатор вставляем требуемый Tag 2) Создается таблица стандартным способом открытия скрипта