Владимир Ишанин (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Функция обратного вызова OnFuturesClientHolding
 
Я понял, каждую минуту начисляется Вариационная Маржа и поэтому вызывается данная функция обратного вызова еще раз. Поэтому просто при условии, если не изменяется позиция, а функция вызывается, мы выходим return'ом;)
Функция обратного вызова OnFuturesClientHolding
 
Функция обратного вызова OnFuturesClientHolding
 
Еще 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 секунд еще срабатывает функция еще раз, что дает ложный вызов при изменении позиции в данный момент времени.
Функция обратного вызова OnFuturesClientHolding
 
Скорее я не понимаю, как работает данная функция обратного вызова. Скрипт я пишу сам, поэтому в нем я разбираюсь.
Нашел на форуме подобный ответ на мой вопрос.

Можно спросить совета программистов, как лучше реализовать данный алгоритм.
Необходимо после 5 изменений позиции по срочному рынку в течение 1 минуты выключить quik и закрыть все позиции.
Как я понимаю, здесь необходимо использовать функцию обратного вызова изменения позиции по срочному рынку OnFuturesClientHolding, при каждому обращении увеличивать счетчик на 1 и при равном 5 получать объем позиции и закрыть квик.
Все это у меня получается за исключением срабатываний функции обратного вызова. Можете подсказать пожалуйста, как можно решить данную проблему. Спасибо
Цитата
* Этот колбек срабатывает не на сделку, на какие-то изменения в портфеле срочного рынка. Эти изменения могут быть вам видны глазом в экранной таблице квика, а могут быть и не видны.

Нет никакой гарантии, что сделка по инструменту вызовет только один колбек, и точно также нет никакой гарантии, что этот колбек будет срабатывать только про исполнению сделок (причин для изменений в таблице позиций срочного рынка много разных)

Для установления факта сделки существует колбек onTrade. *
Функция обратного вызова OnFuturesClientHolding
 
* Функция вызывается терминалом QUIK при изменении позиции по срочному рынку. *

Кто-нибудь сталкивался с проблемой, когда данная функция срабатывает несколько раз подряд при 1 изменение позиции. Грубо говоря у меня счетчик изменения позиций (1,2,3,4), на 4 раз должен сработать весь готовый код, но бывает такое, что я изменяю позицию, счетчик перескакивает на 3, а потом через секунд 5-10, случайным образом, снова срабатывает функция обратного вызова без изменения мною позиции и счетчик доходит до 4 и получается полная ересь. С чем это может быть связано?
Спасибо.
Сравнение 2 переменных
 
В роботе-скрипте необходимо сравнить 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
Как обрезать число типа float до 2х знаков после запятой
 
string.sub(Название переменной,1,3) 1 - с первого символа и до 3 т.к. 2 знака после запятой..
Не выставляет заявку на продажу\покупку
 
Люди, спасибо вам огромное, что помогли мне с моей неопытностью, глупостью.. Я шел из магазина и меня осенило, что выставлял заявку на продажу, по цене выше, по которой люди хотят купить контракт.. Т.е. я в очередь грубо говоря становлюсь и жду, пока цена покупки не повысится до моей.. А мне надо было ставить цену, по которой люди хотят купить и тогда сразу заявка исполнялась.. Как же я до этого сразу не дошел.. И вот, спустя несколько дней я, с вашей помощью, это понял.. Я даже побежал быстрее домой, чтобы проверить и все получилось.. Я рад) Спасибо вам огромное)
Не выставляет заявку на продажу\покупку
 
Цитата
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"
   }
Скриншот
Не выставляет заявку на продажу\покупку
 
Скриншот
Не выставляет заявку на продажу\покупку
 
Цитата
Imersio Arrigo пишет:
Цитата
Владимир Ишанин пишет:
Т.е. я так понял, чтобы полностью закрыть свою позицию, скрипт должен проверить объем контрактов по лучшей цене и если мне их не хватит, он должен проверить следующую цену и купить контрактов по этой цене и если снова не закроется делать эту последовательность дальше, пока не закроется? Или можно где-то прописать, чтобы он покупал всё, начинаю от лучшей цены и так далее пока не закроется одной функцией или параметром?
Ну, в общем случае, для уверенности что заявка будет непременно исполнена - да.
Но для этой цели существует понятие g:Исполнение по рынку

Кроме того у заявки есть разные флаги. Типа "исполнить или отклонить".
Тут надо для себя решить, что важнее: цена исполнения или объем или сам факт исполнения заявки.
Вот у меня есть исполнение по рынку в моей транзакции, но он все равно не исполняет его. Моя заявка снимается.. Можешь подсказать пожалуйста, почему.. Я стараюсь эту проблему найти в гугле, но пока безуспешно.. вроде бы всё так просто, выставить заявку и увеличить\уменьшить позицию свою, даже написано всё правильно, по-моему.. но не работает или очень редко..
Код
Скриншот таблиц
 
Не выставляет заявку на продажу\покупку
 
Т.е. я так понял, чтобы полностью закрыть свою позицию, скрипт должен проверить объем контрактов по лучшей цене и если мне их не хватит, он должен проверить следующую цену и купить контрактов по этой цене и если снова не закроется делать эту последовательность дальше, пока не закроется? Или можно где-то прописать, чтобы он покупал всё, начинаю от лучшей цены и так далее пока не закроется одной функцией или параметром?
Не выставляет заявку на продажу\покупку
 
Цитата
Старатель пишет:
Цитата
Владимир Ишанин пишет:
У меня в таблице транзакций заявки регистрируются, но моя позиция при этом никак не изменяется, что может быть не так?
Позиция изменяется при исполнении заявки, т.е. после сделки .
Т.е. у меня не проходит сделка, получается, хотя заявка регистрируется.
Есть ли какой-то способ узнать, почему сделка не проходит?
Или по данной цене нету такого количества, которое я запрашиваю.. Тогда как из этого выходить
Не выставляет заявку на продажу\покупку
 
У меня в таблице транзакций заявки регистрируются, но моя позиция при этом никак не изменяется, что может быть не так?
Скриншот

Я уже в недоумении от этого)


Код
bid= getParamEx("SPBFUT","SiZ5","OFFER").param_value -- Определяем цену 
bid1 = string.sub(bid,1,5) - убираем нули после точки
bid2 = getParamEx("SPBFUT","SiZ5","SEC_PRICE_STEP").param_value - Определяем шаг
bid3 = string.sub(bid2,1,5) 
local Transaction={
      ["TRANS_ID"]   = tostring(trans_id_FUT),
      ["CLASSCODE"]=   "SPBFUT",
      ["SECCODE"]=   "SiZ5",
      ["ACTION"]     = "NEW_ORDER",
      ["OPERATION"]  = "S", -- покупка (BUY)
      ["TYPE"]       = "M", -- по рынку (MARKET)
      ["QUANTITY"]   = "10", -- количество
      ["ACCOUNT"]    = TRADE_ACC,
      ["PRICE"]      = tostring(bid1+5*bid3) -- Выставляем цену + 5 пунктов
   }
Не выставляет заявку на продажу\покупку
 
Цитата
Старатель пишет:
Цитата
Владимир Ишанин пишет:
А если пишу через переменную - количество лотов в позиции, то не ничего не происходит.
BuyVol = getItem("FUTURES_CLIENT_HOLDING",i).totalnet; -- Количество лотов в позиции BUY
lenght = string.len(BuyVol)
vol = string.sub(BuyVol,1,length) + 1
....
["QUANTITY"] = tostring(vol)
А что здесь? Вот так не проще?
Код
  [ "QUANTITY" ]  =  tostring( getItem ( "FUTURES_CLIENT_HOLDING" ,i).totalnet  +   1 )  
У меня может быть заявка и на покупку, если я в шорте, а там позиция отрицательная и через Math.abs делается..  
Не выставляет заявку на продажу\покупку
 
Проблема в количестве лотов. Если я в транзакции сам прописываю количество, то всё хорошо
["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 без показа окна windows cmd
 
Суть в том, что функция os.execute вызывает командную строку и затем открывает файл. Целесообразно было бы спрятать\скрыть это окно, чтобы не портило общую картину. Кто-нибудь сталкивался с этой проблемой? Как ее можно решить? В гугле решение проблемы не нашел.
Можно ли сделать скрипт, который будет запрещать устанавливать более 1 заявки в 5 минут
 
Мне понравилось идея с блокировкой клавиатуры. Я гуглил, но не нашел функции связанные с подключаемыми устройствами в Lua. Поэтому я так понял, при вызове события OnTrade я указываю путь для открытия сторонней программы для блокировки соответствующих устройств, и затем их отключения. 2 программ, таймера и блокиратора устройств. Спасибо за помощь) Идея создания программы исключительно ради интереса, как ограничить возможности во время тильта.
Можно ли сделать скрипт, который будет запрещать устанавливать более 1 заявки в 5 минут
 
Цитата
Валентин пишет:
как оно будет запрещать пользователю выставлять заявки? отключать кнопку новая заявка?
Думаю, что-то в этом роде
Можно ли сделать скрипт, который будет запрещать устанавливать более 1 заявки в 5 минут
 
Логику программы я понимаю.. Событие на установку позиции, затем переменная с датой и пока не пройдет 5 минут, нажимать на поставить заявку нельзя, но как это сделать программно, можете подсказать пожалуйста) С lua я еще дело не имел. Спасибо
Можно ли сделать скрипт, который будет запрещать устанавливать более 1 заявки в 5 минут
 
Подскажите пожалуйста, можно ли с помощью языка Lua создать скрипт, который будет в реальном времени отслеживать мои действия в Quik и запрещать мне выставлять заявки более 1 раза в 5 минут? Заранее спасибо
Страницы: 1
Наверх