Я понял, каждую минуту начисляется Вариационная Маржа и поэтому вызывается данная функция обратного вызова еще раз. Поэтому просто при условии, если не изменяется позиция, а функция вызывается, мы выходим return'ом;)
Еще 1 замечание по поводу функции обратного вызова, кто может на это ответить. Код самый простой
Код
Run = true;
function main()
while Run do
sleep(10);
end;
end;
function OnStop()
Run = false;
end;
function OnFuturesClientHolding(fut_pos)
message("Текущие чистые позиции "..tostring(fut_pos.totalnet));-- NUMBER
end
Функция обратного вызова срабатывает как надо, но, почему-то, каждую минуту в 18 секунд еще срабатывает функция еще раз, что дает ложный вызов при изменении позиции в данный момент времени.
Скорее я не понимаю, как работает данная функция обратного вызова. Скрипт я пишу сам, поэтому в нем я разбираюсь. Нашел на форуме подобный ответ на мой вопрос.
Можно спросить совета программистов, как лучше реализовать данный алгоритм. Необходимо после 5 изменений позиции по срочному рынку в течение 1 минуты выключить quik и закрыть все позиции. Как я понимаю, здесь необходимо использовать функцию обратного вызова изменения позиции по срочному рынку OnFuturesClientHolding, при каждому обращении увеличивать счетчик на 1 и при равном 5 получать объем позиции и закрыть квик. Все это у меня получается за исключением срабатываний функции обратного вызова. Можете подсказать пожалуйста, как можно решить данную проблему. Спасибо
Цитата
* Этот колбек срабатывает не на сделку, на какие-то изменения в портфеле срочного рынка. Эти изменения могут быть вам видны глазом в экранной таблице квика, а могут быть и не видны.
Нет никакой гарантии, что сделка по инструменту вызовет только один колбек, и точно также нет никакой гарантии, что этот колбек будет срабатывать только про исполнению сделок (причин для изменений в таблице позиций срочного рынка много разных)
Для установления факта сделки существует колбек onTrade. *
* Функция вызывается терминалом QUIK при изменении позиции по срочному рынку. *
Кто-нибудь сталкивался с проблемой, когда данная функция срабатывает несколько раз подряд при 1 изменение позиции. Грубо говоря у меня счетчик изменения позиций (1,2,3,4), на 4 раз должен сработать весь готовый код, но бывает такое, что я изменяю позицию, счетчик перескакивает на 3, а потом через секунд 5-10, случайным образом, снова срабатывает функция обратного вызова без изменения мною позиции и счетчик доходит до 4 и получается полная ересь. С чем это может быть связано? Спасибо.
В роботе-скрипте необходимо сравнить 2 переменные. В действительности они равны, но вот скрипт говорит обратное. В файле z было только число 02. Если сравнивать длину обоих переменных, она будет равна 2. Если распечатать их, получится тоже одинаковый результат 02, 02.. Есть у кого-нибудь идеи?
Код
z = io.open(getScriptPath().."\\Date.txt","r+");
zDate = z:read("*all")
cur = os.date("%d");
if zdate == cur then
......
else
......
end
Люди, спасибо вам огромное, что помогли мне с моей неопытностью, глупостью.. Я шел из магазина и меня осенило, что выставлял заявку на продажу, по цене выше, по которой люди хотят купить контракт.. Т.е. я в очередь грубо говоря становлюсь и жду, пока цена покупки не повысится до моей.. А мне надо было ставить цену, по которой люди хотят купить и тогда сразу заявка исполнялась.. Как же я до этого сразу не дошел.. И вот, спустя несколько дней я, с вашей помощью, это понял.. Я даже побежал быстрее домой, чтобы проверить и все получилось.. Я рад) Спасибо вам огромное)
Imersio Arrigo пишет: Если вы торгуете на площадке фортс, то ставить признак "М" и цену = 0 не получится. Нужно выставлять обычную лимитную заявку, но с ценой заведомо хуже текущих цен в стакане но не выходя за планку.
В примере выше, где заявка по 65607 на два лота отбилась - возможно стоял признак "немедленно или отклонить". В таком случае заявка на продажу по цене выше рынка не могла быть исполнена немедленно, и поэтому была отклонена.
Как вы можете видеть со своего же скрина, предыдущая заявка "по рынку" (а на самом деле по верхней планке) была удовлетворена, и вы купили один лот. А вот продать не смогли.
Разбирайтесь с режимами подачи заявок. Нельзя просто так взять и смешать все в кучу и надеяться что "авось как-то сработает"
Спасибо огромное, дело в том, что я всегда ставил признак M и ничего не происходило.. Поставил L и всё заработало) Но теперь бывает, что цены уходят и моя заявка не срабатывает. Ну, это логично) Есть несколько мыслей: 1. После каждого изменения стакана перетаскивать мою заявку на самую границу и до тех пор пока не погасится вся позиция. Допустим у меня позиция из 20 контрактов и я так по 1 контракту продаю у самой границе 20 раз, пока не закончатся они. 2. Вот если выбрать стакан в quik'e, там есть функция закрыть позицию.. Там ведь мы не выбираем ничего, она сама погашается. Можно ли как-то этим воспользоваться и использовать данную функцию, но уже в скрипте? Не заморачиваясь ;)
Старатель пишет: Это "недокументированные возможности" У вас в одной транзакции указывается и признак рыночной заявки (["TYPE"] = "M") и цена (["PRICE"] = tostring(bid1+5*bid3)). Видимо, с такими параметрами заявка выставляется с условием "Немедленно или отклонить", и если не находит встречного предложения, то сразу отклоняется. Надо задавать либо лимитированную заявку с ценой, либо маркет-заявку с нулевой ценой.
Извините, видимо, я совсем глупый.. Я понял, что мне нужна не лимитированная заявка, а маркет-заявка, по рыночной цене, пока не закроюсь. Вы сказали, с нулевой ценой, я поставил.. Теперь вылазит всегда ошибка - Ошибка создания заявки. [FORTS][32] "Цена сделки вне лимита". Я прошарил весь форум с такой ошибкой, в некоторых местах пишут, что может быть из-за брокера такое, некоторые пишут, что нужно покупать по максимальной\минимальной цене..
Код
local Transaction={
["TRANS_ID"] = tostring(trans_id_FUT),
["CLASSCODE"]= "SPBFUT",
["SECCODE"]= "SiZ5",
["ACTION"] = "NEW_ORDER",
["OPERATION"] = "S", -- покупка (BUY)
["TYPE"] = "M", -- по рынку (MARKET)
["QUANTITY"] = "3", -- количество
["ACCOUNT"] = TRADE_ACC,
["PRICE"] = "0"
}
Владимир Ишанин пишет: Т.е. я так понял, чтобы полностью закрыть свою позицию, скрипт должен проверить объем контрактов по лучшей цене и если мне их не хватит, он должен проверить следующую цену и купить контрактов по этой цене и если снова не закроется делать эту последовательность дальше, пока не закроется? Или можно где-то прописать, чтобы он покупал всё, начинаю от лучшей цены и так далее пока не закроется одной функцией или параметром?
Ну, в общем случае, для уверенности что заявка будет непременно исполнена - да. Но для этой цели существует понятие g:Исполнение по рынку
Кроме того у заявки есть разные флаги. Типа "исполнить или отклонить". Тут надо для себя решить, что важнее: цена исполнения или объем или сам факт исполнения заявки.
Вот у меня есть исполнение по рынку в моей транзакции, но он все равно не исполняет его. Моя заявка снимается.. Можешь подсказать пожалуйста, почему.. Я стараюсь эту проблему найти в гугле, но пока безуспешно.. вроде бы всё так просто, выставить заявку и увеличить\уменьшить позицию свою, даже написано всё правильно, по-моему.. но не работает или очень редко..
Т.е. я так понял, чтобы полностью закрыть свою позицию, скрипт должен проверить объем контрактов по лучшей цене и если мне их не хватит, он должен проверить следующую цену и купить контрактов по этой цене и если снова не закроется делать эту последовательность дальше, пока не закроется? Или можно где-то прописать, чтобы он покупал всё, начинаю от лучшей цены и так далее пока не закроется одной функцией или параметром?
Владимир Ишанин пишет: У меня в таблице транзакций заявки регистрируются, но моя позиция при этом никак не изменяется, что может быть не так?
Позиция изменяется при исполнении заявки, т.е. после сделки .
Т.е. у меня не проходит сделка, получается, хотя заявка регистрируется. Есть ли какой-то способ узнать, почему сделка не проходит? Или по данной цене нету такого количества, которое я запрашиваю.. Тогда как из этого выходить
Владимир Ишанин пишет: А если пишу через переменную - количество лотов в позиции, то не ничего не происходит. BuyVol = getItem("FUTURES_CLIENT_HOLDING",i).totalnet; -- Количество лотов в позиции BUY lenght = string.len(BuyVol) vol = string.sub(BuyVol,1,length) + 1 .... ["QUANTITY"] = tostring(vol)
Проблема в количестве лотов. Если я в транзакции сам прописываю количество, то всё хорошо ["QUANTITY"] = "3" А если пишу через переменную - количество лотов в позиции, то не ничего не происходит. BuyVol = getItem("FUTURES_CLIENT_HOLDING",i).totalnet; -- Количество лотов в позиции BUY lenght = string.len(BuyVol) vol = string.sub(BuyVol,1,length) + 1 .... ["QUANTITY"] = tostring(vol)
Если вывести переменную через Message, то она содержит правильное количество лотов в позиции ( 13, 12 и т п )
Написал я всё же скрипт по ограничению выставления заявок. У программиста самое неприятное, когда всё работает, но не так) Вообщем у меня всё аналогично. После 3 заявкой в течении минуты, скрипт должен заблокировать клавиатуру и мышь, включить таймер на время этой блокировки и погасить всю позицию по заданному инструменту ( SiZ5 ) Всё отлично, но в окне Котировки позиция не закрывается, с ней ничего не происходит. Знающие люди, можете объяснить почему, пожалуйста) Весь интернет облазил с этим скриптом) Скрипт блокировки пока не вставлял. Заранее спасибо) Скрипт
Суть в том, что функция os.execute вызывает командную строку и затем открывает файл. Целесообразно было бы спрятать\скрыть это окно, чтобы не портило общую картину. Кто-нибудь сталкивался с этой проблемой? Как ее можно решить? В гугле решение проблемы не нашел.
Мне понравилось идея с блокировкой клавиатуры. Я гуглил, но не нашел функции связанные с подключаемыми устройствами в Lua. Поэтому я так понял, при вызове события OnTrade я указываю путь для открытия сторонней программы для блокировки соответствующих устройств, и затем их отключения. 2 программ, таймера и блокиратора устройств. Спасибо за помощь) Идея создания программы исключительно ради интереса, как ограничить возможности во время тильта.
Логику программы я понимаю.. Событие на установку позиции, затем переменная с датой и пока не пройдет 5 минут, нажимать на поставить заявку нельзя, но как это сделать программно, можете подсказать пожалуйста) С lua я еще дело не имел. Спасибо
Подскажите пожалуйста, можно ли с помощью языка Lua создать скрипт, который будет в реальном времени отслеживать мои действия в Quik и запрещать мне выставлять заявки более 1 раза в 5 минут? Заранее спасибо