Снятие всех заявок в Lua

Страницы: 1
RSS
Снятие всех заявок в Lua, Какой брать параметр trans_id?
 
В руководстве пользователя QUIK в разделе «Формат .tri-файла с параметрами транзакций» написано, что для снятия всех заявок обязательные параметры - «CLASSCODE», «TRANS_ID», «ACTION»,  «ACCOUNT».
Непонятно, как задавать TRANS_ID. Брать его для любой активной заявки? А если TRANS_ID будет соответствовать заявке, которая превратилась в сделку, то тогда функция снятия  всех заявок  не сработает? Правильно ли вообще написана у меня  эта функция?

function Close_all_order()
local Transaction={
ACCOUNT="L01-00000F00",
TRANS_ID=tostring(trans_id),
CLASSCODE="EQOB",
ACTION="KILL_ALL_ORDERS"}
local Res = sendTransaction(Transaction)
end

Идентификатор транзакции  trans_id  задается в основной программе и при открытии каждой заявки  увеличивается на 1:  trans_id=trans_id+1.
 
Здравствуйте,
Команды «KILL_ALL_ORDERS», «KILL_ALL_STOP_ORDERS», «KILL_ALL_NEG_DEALS» не поддерживаются в QLUA.

Цитата
Виктор Столетов написал:
Непонятно, как задавать TRANS_ID.

TRANS_ID - это произвольный номер Вашей транзакции, "снятие заявки" - это тоже транзакция и ей надо придумать номер. Номер может быть любым в диапазоне от «1» до «2 147 483 647»
 
Цитата
Sergey Gorokhov написал:
Команды «KILL_ALL_ORDERS», «KILL_ALL_STOP_ORDERS», «KILL_ALL_NEG_DEALS» не поддерживаются в QLUA.
Нашел, что на этом форуме данная тема уже обсуждалась – см. ссылку https://forum.quik.ru/forum10/topic996/
Я взят оттуда за образец функцию снятия всех заявок и немного ее упростил.  
Она снимает все заявки для данного класса по всем инструментам – код см. ниже /не знаю как вставить скрин кода (jpg-файл), поэтому вставил просто текст программы/.
Судя по всему функция myFind ищет все активные заявки, а SearchItems выбирает их из таблицы заявок.  И все же я не совсем понимаю, как  работает  функция снятия всех заявок . Почему например в операторе local ord = "orders" стоит "orders", а не "order"? Ведь по идее таблица заявок  называется "order"  (см. описание функции OnOrder).  Но если написать local ord = "order" , то не работает.

function Close_all_order()
function myFind(F)
 return (bit.band(F, 0x1) ~= 0)
end
local ord = "orders"
local orders = SearchItems(ord, 0, getNumberOf(ord)-1, myFind, "flags")
if (orders ~= nil) and (#orders > 0) then
 for i=1,#orders do
  local transaction={
  TRANS_ID=tostring(1000*os.clock()),
  ACTION="KILL_ORDER",
  CLASSCODE=c_code,
  SECCODE=getItem(ord,orders[i]).sec_code,
  ORDER_KEY=tostring(getItem(ord,orders[i]).order_num)
  }
  local res=sendTransaction(transaction)
 end
end
end
 
Цитата
Виктор Столетов написал:
И все же я не совсем понимаю, как  работает  функция снятия всех заявок
Что именно не понятно?

Цитата
Виктор Столетов написал:
Почему например в операторе local ord = "orders" стоит "orders", а не "order"?

При обращении к данным таблицы используются константы которые приведены в документации
-Функции для обращения к строкам произвольных таблиц QUIK
--Таблицы, используемые в функциях «getItem», «getNumberOf» и «SearchItems»

и там таблица заявок называется "orders".
 
Цитата
Sergey Gorokhov написал:
Что именно не понятно?
Спасибо, теперь после объяснения все понятно. Разобрался, как вставлять jpg-файлы и привожу функцию снятия всех заявок для данного класса по всем инструментам в более читаемом  виде:



Еще не могу разобраться, почему функция  getMoney выдает одни и же значения до выставления  заявок  и после превращения одной из них в сделку:  money_current_balance, money_limit_available и money_limit_locked не меняются.  Хотя в таблице лимитов по денежным средствам Квика они ("текущий остаток", "заблокировано" и "доступно") меняются .  
 
Виктор Столетов,
Просьба больше никогда не выкладывать код в виде JPEG.
Для кода в панели есть специальная кнопка
Например:
Код
function Close_all_order()
 function myFind(F)
  return (bit.band(F, 0x1) ~= 0) 
 end
 local ord = "orders"
 local orders = SearchItems(ord, 0, getNumberOf(ord)-1, myFind, "flags")
 if (orders ~= nil) and (#orders > 0) then
  for i=1,#orders do
   local transaction={
   TRANS_ID=tostring(1000*os.clock()),
   ACTION="KILL_ORDER",
   CLASSCODE=c_code,
   SECCODE=getItem(ord,orders[i]).sec_code,
   ORDER_KEY=tostring(getItem(ord,orders[i]).order_num)
   }
   local res=sendTransaction(transaction) 
  end
 end
end


Цитата
Виктор Столетов написал:
getMoney выдает одни и же значения

getMoney возвращает только лимит вида Т0
Вам же нужен другой вид лимита. Посмотрите в таблице лимитов, в колонке "Вид лимита" что на самом деле Вам нужно.
Для остальных видов лимитов, существует отдельная функция getMoneyEx.
 
Цитата
Sergey Gorokhov написал:
TRANS_ID - это произвольный номер Вашей транзакции, "снятие заявки" - это тоже транзакция и ей надо придумать номер. Номер может быть любым в диапазоне от «1» до «2 147 483 647»
А номер транзакции должен быть уникальным или не обязательно? Если, например, запускаются несколько роботов и они нумеруют свои транзакции с единицы.
 
Цитата
Constantin написал:
А номер транзакции должен быть уникальным или не обязательно? Если, например, запускаются несколько роботов и они нумеруют свои транзакции с единицы.

TRANS_ID может быть любым. уникальным или нет, всё равно, решать Вам.
Можете во всех транзакциях указывать 123 и оно будет работать.
Для удобства может в разных роботах указать разное значение. Чтобы определять какой робот подал транзакцию.
 
Цитата
Sergey Gorokhov написал:
«KILL_ALL_ORDERS»,
А чем поддерживается?
 
Александр С., добрый день.

KILL_ALL_ORDERS может использоваться при импорте транзакций из tri-файла (см. Руководство пользователя QUIK, Раздел 6. Совместная работа с другими приложениями / Импорт транзакций).
 
Спасибо
 
Запоминание номера заявки не устраняет проблему задвоения заявок при перегрузке терминала. Написал код для сканирования активных заявок по определенному инструменту, если есть активные заявки, то запускается функция снятия. Количество активных заявок и их номера неважны:
Код
function scanoforder(whatsorder) - функция сканирования активных заявок по определенному инструменту
   local transaction,bs,res={},{},""
   local iTorF=0
   local iSorB=""
   for i=0,(tonumber(getNumberOf("orders"))-1) do   
      bs=getItem("orders",i)
   if whatsorder=="TorF" then
      if bit.band(bs["flags"],1)~=0 and bs["sec_code"]==p_seccode then
         iTorF=iTorF+1
      end
   elseif whatsorder=="SorB" then
      if bit.band(bs["flags"],1)~=0 and bs["sec_code"]==p_seccode then
         if bit.band(bs["flags"],4)>0 then
            iSorB="S" --break
         else
            iSorB="B"
         end
      elseif bit.band(bs["flags"],1)==0 then
         iSorB="nil"
      end
   end
   end
   if whatsorder=="TorF" then
      if iTorF>0 then
         return true
      else 
         return false
      end
   end
   if whatsorder=="SorB" then
      return iSorB
   end
end
Функция снятия всех активных заявок по определенному инструменту:
Код
function delete_order()
   local transaction,bs,res={},{},""
   for i=0,(tonumber(getNumberOf("orders"))-1) do   
      bs=getItem("orders",i)
      if bit.band(bs["flags"],1)~=0 and bs["sec_code"]==p_seccode then
         local tr={
      ["CLASSCODE"]=p_classcode,
      ["SECCODE"]=p_seccode,
      ["ACTION"]="KILL_ORDER",
      ["ACCOUNT"]=p_account,
      ["CLIENT_CODE"]=p_client_code,
      ["TYPE"]="L",
      ["OPERATION"]=l_oper,
      ["TRANS_ID"]=p_trans_ID,
      ["ORDER_KEY"]=tostring(bs["order_num"])
   }
   -- ЕСЛИ функция вернула строку диагностики ошибки, ТО значит транзакция не прошла   
         Result = sendTransaction(tr)
      end
   end
end
То же самое сделано по заявкам тейк-профит, выложу, если будет нужно
Страницы: 1
Читают тему
Наверх