Андрей Мурга написал: У меня слип(120000000000) делает 100 меседжей в секунду
А в документации написано так: NUMBER sleep(NUMBER time)
Параметры:
Параметр
Тип
Описание
time
NUMBER
Время, на которое приостанавливается выполнение, в миллисекундах
Пример: Sleep(1000) -- приостановка выполнения скрипта на одну секунду ------------------------------ Обращаю ваше внимание, что в документации ошибка: В первом случаем написано sleep, а в примере Sleep. А это две большие разницы. Может быть у вас не тот слип. Вот пример сообщение будет отображаться 1 раз в секунду 100 раз.
Скрытый текст
run=true; function main() count=0; while run do if res then message(res) else message("полет нормальный") end count=count+1; if count>100 then run=false end sleep(1000) end message("приземлился") end
проблема решается так: 1) создаем очередь сигналов пересечения 2) в колбеке ТВС каждое новое пересечение запихиваем в очередь 3) в функции main на каждый сигнал из очереди посылаем соответствующую транзакцию и сигнал убираем из очереди --------------------------------- Т е обработка колбеков должна осуществляться с помощью очередей. Я делаю в скриптах именно таким образом.
rozmin написал: Проблема: например, я открываю позицию покупка 5 контрактов по 10 руб, потом покупаю ещё 5 по цене 20 руб, потом продаю 5 контрактов по цене 30 руб. Не понятно, какая из позиций закрылась, первая покупка по 10 руб или вторая покупка по 20 руб?
Предлагаю решение - проводить соединяющие линии между сделками.
Попробую объяснить популярно, в чем ошибка спрашивающего. Так как на бирже совершаются обезличенные сделки по стандартизованным продуктам, то у любого игрока есть лишь одна позиция по каждому инструменту. Т е если мы совершаем сделку (биржа - это место совершения сделок) , то мы изменяем параметры позиции по инструменту ( т е не создаем еще одну, а изменяем существующую позицию по данному инструменту) Может быть много позиций, но по множеству инструментов. ---------------------------------- Теперь о позиции по инструменту. возможны следующие состояния ------------------------ рынок акций или облигаций: открыт лонг на свои деньги открыт лонг на заемные деньги закрыт лонг (продажа своих бумаг ) открыт шорт (продажа заемных бумаг) вне рынка - позиция нейтральная(нулевая) ------------------------------ рынок фьючерсов: открыт лонг открыт шорт вне рынка - позиция нейтральная ------------------ примерно так
local t = { ["CLASSCODE"]="SPBFUT", ["SECCODE"]="RIH6", ["ACTION"]="NEW_ORDER", ["ACCOUNT"]="SPBFUT00b52", ["CLIENT_CODE"]="99883", ["TYPE"]="L", ["OPERATION"]="S", ["QUANTITY"]="1", ["PRICE"]= "70500", ["TRANS_ID"]="1" } run=true; function main() count=0; while run do --res=sendTransaction(t) if res then message(res) else message("полет нормальный") end count=count+1; if count>100 then run=false end sleep(100) end message("приземлился") end
function OnStop(s) run = false end
Если Вы запустите ваш скрипт то Вы никогда не сможете его остановить. так как окно сообщения которое будет выводится будет блокировать ваши попытки что-нибудь сделать ( это прикол разрабочиков квика, чтобы жизнь седом не казалось) ------------------------------- Поэтому я написал вам пример который крутится 100 раз и завершается. отправку транзакции я закоментировал т е этот пример лишь покажет вам сообщение ------------------------ далее если захотите завалить сервер своими транзакциями то уберите -- перед res=sendTransaction(t) и завалите брокера своими заявками -------------------------------- Успехов
дополню ранее сказанное. пропуски срабатываний у Вас будут всегда происходить по следующей причине. --------------------------------- Данные в ТВС приходят пакетами. Т е сделки следующие с малым интервалом друг за другом придут к Вам одновременно. ----------------------------------- При этом колбек будет срабатывать на них последовательно и непрерывно. Т е например две сделки совершены с интервалом 100 мс но пришили в одном пакете. колбек на них отреагирует два раза но с интервалом полагаю менее мс. Т е у Вас произойдет анализ статуса на обе сделки одновременно. Если первая изменит статус а вторая вернет его обратно, то Вы этот сигнал не увидите и заявку не выставите. -------------------------------------- Эту ошибку никаким железом не исправишь - это методическая ошибка (ошибка метода). Ее можно устранить лишь изменив алгоритм работы робота. Теперь вроде все.
могу предположить следующее. Так как Вы пользуетесь колбеками , а они не синхронизируются то у Вас status успевает изменится туда и обратно до того момента, как Вы на него прореагируете
У БКС сервера работают медленно ( возможно так делают специально, чтобы на вип сервер подключались за денюшку, возможно старое железо, возможно клиентов много и сервер не справляется), короче реакция сервера медленная. Сейчас у нового брокера у Вас раз в 5 быстрее реакция сервера. В результате Вы сейчас просто не успеваете обрабатывать status и теряете сигнал. ----------------------------- Чем медленнее будет рынок, тем лучше у Вас будет срабатывание. -------------------------- Короче, проблема у Вас в потере сигналов status. Надо переделывать алгоритм обработки сигналов, либо работать со свечами. О чем уже писал ранее. --------------------------------- Чудес не бывает, но хочется в них верить.
и еще если я правильно понял, у Вас как-то странно проверяется пересечение. Вы используете сделку и заявку Вы именно так хотите? но тогда Ваш алгоритм вообще не соответствует картинке
На картинках у Вас пересечение свечи с линией болинджера а в программе используется тик. ----------------------- свеча - это четыре индикатора вычисляемых по куче тиков. ----------------------------- поэтому то, что у Вас написано это совершенно не то, что Вы хотите (если смотреть на картинки) ------------------------------- Нарисуйте картинку тиков внутри свечи и посмотрите . Если хотите как на картинке то используйте свечи а не ТВС
Хочу обратить Ваше внимание на тот факт, что в ТВС тики, а на графиках у Вас свечи. ------------------------------ Т е то, что вы реализовали это не то , что на графиках.
для этого Вам надо ознакомиться с форматом файлов Excel и написать программу. -------------------------------------------- все в этом мире возможно, вопрос лишь в том, сколько на это надо .... и есть ли у Вас столько.
Полагаю, что в правильной программе выставление заявки по Вашему алгоритму не зависит от задержки общения с брокером. Если у Вас зависит, то ищите ошибки в логике программы. ------------------------ В качестве совета: Ваш алгоритм робота удобно реализовать в индикаторе (без заморочкой с колбеками и ТВС)
попробую объяснить еще раз. ------------------------ На графике цифрами обозначены штрихи (красный цвет) 3 -нормальный штрих 1 и 2 - штрих который изменен приведенным выше кодом. ----------------------------------- собственно это и есть весь код ------------------------- Теперь про ошибку. Ваша функция SetValue изменяет одну точку, но эта точка отображается отрезком линии ( штрих) так как выбран тип штриховой. ------------------ Проблема в том, что в свечном графике используются два места для изображения свечи, или как Вам удобнее - две точки. ------------------------------- Поэтому на свечном графике штрих состоит из двух частей - двух точек, а функция SetValue меняет лишь одну точку (половинку штриха)- последнюю. поэтому штрих на свечах разрывается на две точки (половинки штриха) --------------------- Попробуйте сами нарисовать штриховую линию на свечном графике и изменить любое значение свечи - получите два огрызка штриха.
объяснение Вашей ошибки следующее. У Вас штрих рисуется двум отрезками. функция SetValue корректирует лишь последний, поэтому первый остается без изменения.
Добрый день, вот такая ошибочка выходит: В данном случае применяется функция SetValue(i-1,m+2,GetValue(i-2, m+2)) где m+2 -номер индикатора, i - текущая свеча. алгоритм: Предыдущее значение заменяется на препердыдущее. В результате линия индикатора на свече делится пополам (1 и 2) Половинка 1 остается на старом уровне а половинка 2 переходит на новый.
диспетчером задач посмотрите 1) сколько занято памяти и сколько в пике 2) какая загрузка процессора когда тормозится 3) закройте все, что не нужно для торговли.
попробуйте из дома сделать пинг на ip брокера. Если сервер брокера не ответит то на московскую биржу и сравните с временем задержки ответа сервера В приведенной Вами картинки это 31 mc. если пинг у Вас будет меньше, то переход на свой комп будет работать также как сервером, иначе будет хуже.
Похоже что в киеве. С первого взгляда выгоды от виртуалки почти нет. Я такие параметры получаю на своем компе(но не у всякого брокера). Есть брокеры у которых сервера тормозятся сильно. А где будет комп?
возможно Вы неправильно указываете цену (точность либо формат) кроме того, res содержит сообщение об ошибке. Надо его (res) вывести на экран либо в файл либо посмотреть в отладке.
нашел у финама: до 30 транзакций в секунду примерно 5 т р в месяц + 5 т р установка + еще что-то для моего места нахождения обещают уменьшение задержки в 6 раз.
Я пользуюсь таким алгоритмом для отличия первого колбека от последующих Создаем таблицу событий по которым следим за колбеками (активным событиям) при поступлении колбека по событию изменяем его состояние в таблице событий. Если событие стало неактивным, то удаляем его из таблицы состояний. Проблем с кучей колбеков на одно и тоже событие у меня нет.
еще замечу автору вопроса: если обратитесь к литературе, то обнаружите, что EMA это простейший цифровой фильтр с бесконечной импульсной характеристикой. Так как фильтрацию делаем на конечном интервале, то вне 3000 значений мы как бы придумываем Есть различные варианты продления данных за интервал наблюдения. Это тоже есть в книжках. Если интересно, что там за горизонтом, можно прочитать в книжках перед изобретением колеса.
выкладываю модуль расчета индикаторов EMA написал очень давно, результаты должны быть как в квике
Код
local modname = ...
--автор Николай Камынин kamnik@mail.ru www.kamynin.ru
local M = {}
_G[modname] = M
package.loaded[modname] = M
local _G=_G -- глобальная таблица
setfenv(1, M)
function EMAt(y,x,m,i,n) --x- таблица
if m>=i then local s=0; for j=0,i-1 do s=s+x[i-j] end y[i]=s/i;
else if n==nil then y[i]=(y[i-1]*(m-1)+2*x[i])/(m+1); else y[i]=y[i-1] -(x[i-m] -x[i])/m; end
end
end
function EMAf(y,x,m,i,n) --x- функция
if m>=i then local s=0; for j=0,i-1 do s=s+x(i-j) end y[i]=s/i;
else if n==nil then y[i]=(y[i-1]*(m-1)+2*x(i))/(m+1); else y[i]=y[i-1]-(x(i-m)-x(i))/m; end
end
end
function sEMA(y,x,m,i)
local s=y;
if m>=i then s=((m-1)*s+x)/m; else s=(s*(m-1)+2*x)/(m+1); end
return s;
end --скользящее среднее x период m n если не задано то ехпонента или простое сглаживание