...
function main()
while is_run do
sleep(1000)
end
end
можно переписать так,
Код
DefaultSleepTimeout = 1000
...
function main()
while is_run do
sleep(DefaultSleepTimeout)
end
end
Вот уже отделили, когда потом захотим изменить не придется искать где там нужное число в 10000 строк программы, вот оно в самом начале с понятным обозначением. Это разумеется не для быстродействия или чего-то еще связаного с работой программы а чтобы самому не запутаться в большом тексте, только и всего.
Алексей Орешкин написал: в 4 разделе "Структуры данных" есть пункт 4.24 который называется Транзакции и там есть некоторое описание таблицы транзакций
Здравствуйте, а где взять полное описание таблицы транзакций, что бы написать код отправки условной заявки "тейк профит и стоп-лимит"? С последующим чтением статуса отправленной транзакции?
Алексей Орешкин написал: в 4 разделе "Структуры данных" есть пункт 4.24 который называется Транзакции и там есть некоторое описание таблицы транзакций
Здравствуйте, а где взять полное описание таблицы транзакций, что бы написать код отправки условной заявки "тейк профит и стоп-лимит"? С последующим чтением статуса отправленной транзакции?
Текст для транзакций можно взять из справки QUIK. Раздел 6. Совместная работа с другими приложениями/Импорт транзакций/Примеры строк, которые могут содержаться в файле
Обязательно ли в рыночной заявке на покупку указывать цену? В примере указано, что надо устанавливать нулевую цену заявки, но если тип стоит, что заявка на покупку рыночная TYPE=M, то вроде как цена не нужна PRICE=0? Или нужно обязательно цену указывать?
здравствуйте, где можно взять документацию или пример по установке метки на график, над текущей свечкой по номеру индекса, просто в виде любой картинки?
Settings=
{ Name = "Example4",
period = 5,
line = {
{ Name = "MA1",
Color = RGB(255, 0, 0),
Type = TYPE_LINE,
Width = 1
},
{ Name = "MA2",
Color = RGB(255, 0, 0),
Type = TYPE_LINE,
Width = 1
}
}
}
function Init()
period1=14
period2=7
return 2
end
function OnCalculate(index)
if index < Settings.period then
return nil
else
local sum = 0
local sum1 = 0
for i = index-period1+1, index do
sum = sum +C(i);
end
for i = index-period2+1, index do
sum1 = sum1 +C(i);
end
return sum/period1,sum1/period2
end
end
Вывожу номер свечи по порядку и цены закрытия двух МА на момент пересечения кривых и на 1 индекс вперед в лог файл для анализа срабатывания и данные получаются с очень большой точностью, что информация читается визуально очень плохо, можно ли как то привести разрядность после запятой до 3х знаков или 2х. Функции пробовал разные , но что-то не получается()
p = 14.593333333333; price = tostring(p); pointplace = string.find(price,". "); --нашли поз. точки (если разделитель - точка) if pointplace then price = string.sub(price,1,pointplace + 2); -- для двух знаков end;
Сохранил изменения через notepad++ с помощью-" сохранить как". Выбрал *.lua. В итоге русские буквы сохранились как то так- -- "‘ункци¤ ¬џ«џ¬ј?“—я “?–ћ»ЌјЋќћ остановки скрипта" Все перекодировки и преобразования не исправляют изменения. Может что надо подгрузить? На работу не повлияло так как код исполнения не тронут.
Подскажите пожалуйста, что значит функция майн работает в отдельном потоке и не нагружает терминал? Никакого отдельного процесса для этой функции нет в диспетчере задач, а вся нагрузка как раз ложится на процесс info
Дмитрий написал: Подскажите пожалуйста, что значит функция майн работает в отдельном потоке и не нагружает терминал? Никакого отдельного процесса для этой функции нет в диспетчере задач, а вся нагрузка как раз ложится на процесс info
На самом деле это значит буквально то что написано. Обьектами выполнения в винде являются потоки а не процессы. В документации микрософта они называются thread. Процесс можно считать просто контейнером в котором содержится один или более потоков.
Так вот для выполнения функции мэйн создается такой отдельный поток, который будет работать параллельно с остальными. На отдельном процессорном ядре если такое доступно. И в этом смысле он "не нагружает" терминал. В отличие от коллбэков которые вызываются в одном из "основных" потоков терминала. Если у вас ядер достаточно он будет работать на отдельном ядре. А если недостаточно то может таки и терминалу мешать. Диспетчер задач показывает именно процессы, чтобы увидеть потоки придется использовать что-нибудь попродвинутее.
Скажите пожалуйста как сделать чтобы в простом скрипте. Который выводит сообщение. Когда цена вышла за границы индикатора. Условие сработало один раз на последней свече. Получается цена вышла. Видим сообщение. Цена вернулась и снова вышло еще сообщение. Надо использовать ds:size(). Но не понимаю как без сделок то. Как то находил информацию про это, но сейчас вот не нашел пока.
Скрытый текст
if tP[1].close>tP1[0].close then message('Сообщение 1') end
Здравствуйте. Возник вопрос с приведением типов: из типа DOUBLE (цена, в формате 113300.000000) требуется привести в строковый формат без нулей после точки (113300), чтобы использовать в таблице транзакции (стоп-ордера). Пробовал использовать mathfloor; по декоде выглядит, как будто нули убрались, на деле - по-прежнему выводит ошибку. Подскажите, каким образом выполнить эту задачу? Цена в формате DOUBLE у меня в виде переменной
Олег, Понятно, на самом деле число у Вас не 113300.000000 а 113300.0000000001 (или как то так) Это особенность чисел с плавающей точкой (в википедии есть целая статья на тему) Для решения, Вам надо округлять число с заданной точностью
Открыта сделка (допустим, в бай), и выставлен стоп-ордер (стоп-лосс) в селл. Условие выставления стоп-ордера по роботу - "если PosNow>0 и нет стоп-ордеров, то выставляется стоп-ордер по определённой цене". Столкнулся с проблемой: когда цена доходит до стопа, между моментом отправки приказа на сервер и моментом закрытия сделки в бай проходит какое-то время, т.е. есть момент, когда стоп-ордера уже нет, а сделка ещё открыта. И в этот момент робот выставляет новый стоп-ордер, и сразу же его открывает, т.е. вместо одного стоп-ордера срабатывают два, и получается разворот позиции. А нужно - просто закрыть сделку в бай. Подскажите, как этот вопрос решить? Поможет ли, если я заменю стоп-ордер на обычную заявку (то есть, при открытой сделке стоп-лосс не будет выставляться, а просто будет открываться заявка в противоположную сторону, если цена доходит до определённого уровня)? Период сна sleep -1000 мс.
Олег, К сожалению без кода не ясно что и как у Вас происходит, следовательно и рекомендовать что либо затруднительно. Просьба предоставить исходный код скрипта.
Олег, Скорее всего у Вас отсутствует кусок, отвечающий за контроль исполнения стопа. После
Цитата
моментом отправки приказа на сервер
необходимо убедиться, что заявка выставлена и исполнена. И только потом все остальное, что у Вас написано в коде. Этот контроль можно организовать по-разному. (таблица заявок, таблица сделок, соответствующие им функции обратного вызова, флаги ...). Сколько людей столько и будет алгоритмов. Лучше разобраться и написать самому.
Цитата
Поможет ли, если я заменю стоп-ордер на обычную заявку
Поможет, если проскальзывание будет достаточным для исполнения всех контрактов сразу. Если будет остаток, возникнет та же проблема, но в меньшем объеме. Т.е. опять возвращаемся к блоку скрипта, который контролирует исполнения сделки, о котором я писал выше.
Подскажите, пожалуйста. Пытаюсь получить данные из тестового QUIK
local Limit = getFuturesLimit("SPBFUT", "SPBFUT00a43", 0, "SUR").cbplplanned
выдает nil. Значение SPBFUT00a43 проверил несколько раз. Если этот же код запускаю на реальном счете (естественно меняя SPBFUT00a43 на другой счет), то значение на выходе получаю. В чем может быть проблема?
Pavel написал: Подскажите, пожалуйста. Пытаюсь получить данные из тестового QUIK
local Limit = getFuturesLimit("SPBFUT", "SPBFUT00a43", 0, "SUR").cbplplanned
выдает nil. Значение SPBFUT00a43 проверил несколько раз. Если этот же код запускаю на реальном счете (естественно меняя SPBFUT00a43 на другой счет), то значение на выходе получаю. В чем может быть проблема?
Всех приветствую, ребята подскажите в чем может быть проблема - вообщем только начал изучать Qlua и создание скриптов на нем для квика, создал для начала пробный скрипт по простой схеме -
IsRun = true; function main() while is_run do sleep(50) end;
end;
function ontrade (trade_data)
file = io.open("res_ontrade.txt", "a")
for key,v in pairs(trade_data) do file:write(key .. " = " ..tostring(v).. "\n") end file:close()
end function OnStop() IsRun = false; end;
в тело функции ontrade прописал простенький скрипт для записи результата выполненной сделки в текстовый файл но тут происходит странное - в случае совершения сделки, т.е. одной сделки любой сделки, покупка продажа - запись результатов происходит трижды, много раз перепробовал все одно и то же - сделка одна и три одинаковых записи подряд о ней, почему так?
Sergey Gorokhov написал: Здравствуйте,Это нормально, т.к. сервер может обновлять некоторые параметры сделки, он присылает ее несколько раз.Тоже самое с заявками.
И как же мне отфильтровать дублирующиеся мне ответы от сервера? Можно это делать вручную сидя за компом но тогда и смысла скрипты писать нет, я ведь пишу скрипт как раз для того чтобы автоматизировать различные действия и не сидеть для этого за компом, уже перепробовал много раз - Ontrade все время выполняется три раза, для интереса даже переписал скрипт для изучения происходящего, примерно вот в такой вид
IsRun = true; function main() while is_run do sleep(50) end;
Далее делаю следующее - формирую завку на покупку одного лота некоторых акций по рыночной цене, чтобы заявка быстро была выполнена, и отправляю ее и вижу следующий результат: функция OnTrade выполняется первой, причем три раза, в файле res_ontrade.txt я увидел 1 2 3 Затем выполняется два раза функция OnOrder, два раза - в res_onorder.txt я увидел 4 5 Функция OnTransReply вообще не была выполнена ни разу - в файле res_ontransreply.txt пусто
Sergey Gorokhov написал: Просто добавить условие фильтрации. Если сделка с таким номером по данному классу уже была то игнорировать.
Извините за глупый вопрос - как это сделать? Для этого есть какие то функции qlua? или же обычными средствами lua Во втором случае примерно понятно как это сделать