awkozlov (Все сообщения пользователя)

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

Страницы: 1
Перестал работать getCandlesByIndex у всех брокеров, getCandlesByIndex
 
Версия 10.1.0.26 на Windows 7
Улучшил наглядность в скрипте, но результат такой же - нолики в ценах.
Индикатор #test
Идентификатор графику ставим 111
В папке рабочей папке QUIK появляется файл check1.txt
Код
Settings=
{
   Name = '#test'
}
function writeToFile(filename, content)
  local file_handle = io.open(filename, 'w')
  if file_handle then
    file_handle:write(content)
    file_handle:close()
    return true
  else
    return false
  end
end

function Init()
  return 1
end

function OnCalculate(index)
  id_chart = '111'
  local need_right_candles_count = 10
  local line_number = 0
  local candles_count = getNumCandles(id_chart)
  local candles_from = candles_count - need_right_candles_count
  local info = getDataSourceInfo()
  check1 =  tostring(id_chart)..'\n'..tostring(line_number)..'\n'..tostring(candles_from)..'\n'..tostring(need_right_candles_count)..'\n'..tostring(candles_count)..'\n'..tostring(info.class_code)..'\n'..tostring(info.sec_code)..'\n'

  local result_table, result_candles_count, result_chart_name = getCandlesByIndex(id_chart, line_number, candles_from, need_right_candles_count)

  if result_table == nil or #result_table == 0 then
    return "Empty result_table"
  end

  local fieldNames = {}
  for field, _ in pairs(result_table[1]) do
    table.insert(fieldNames, field)
  end

  check1 = check1..'fieldNames:\n'..table.concat(fieldNames, '\n') .. '\n'

  for i = #result_table, 1, -1 do
    if result_table[i].datetime == nil or 
       result_table[i].datetime.day == nil or 
       result_table[i].datetime.month == nil or 
       result_table[i].datetime.year == nil or 
       result_table[i].datetime.hour == nil or 
       result_table[i].datetime.min == nil or 
       result_table[i].datetime.sec == nil then
          return nil 
    end

    local candle_datetime = string.format("%02d.%02d.%04d %02d:%02d:%02d", 
        result_table[i].datetime.day, 
        result_table[i].datetime.month, 
        result_table[i].datetime.year, 
        result_table[i].datetime.hour, 
        result_table[i].datetime.min, 
        result_table[i].datetime.sec)
    
    local formattedFields = {
      candle_datetime
    }
    for j, fieldName in ipairs(fieldNames) do
      local fieldValue = result_table[i][fieldName]
      table.insert(formattedFields, fieldName..'='..tostring(fieldValue))
    end

    check1 = check1 .. tostring(i)..'\t'..table.concat(formattedFields, '\t')..'\n'
  end

  local filename_w = getWorkingFolder()..'\\check1.txt'
  if writeToFile(filename_w, check1) then
    return
  else
    return "Failed to write to file"
  end
end

Результат в файле check1.txt

Код
111
0
6041
10
6051
TQBR
ROSN
fieldNames:
close
doesExist
high
datetime
volume
open
low
9   19.12.2023 18:10:00   close=0.0   doesExist=0   high=0.0   datetime=table: 000000001147F030   volume=0.0   open=0.0   low=0.0
8   19.12.2023 18:00:00   close=0.0   doesExist=0   high=0.0   datetime=table: 0000000011468C70   volume=0.0   open=0.0   low=0.0
7   19.12.2023 17:50:00   close=0.0   doesExist=0   high=0.0   datetime=table: 000000001146C630   volume=0.0   open=0.0   low=0.0
6   19.12.2023 17:40:00   close=0.0   doesExist=0   high=0.0   datetime=table: 000000001147EFF0   volume=0.0   open=0.0   low=0.0
5   19.12.2023 17:30:00   close=0.0   doesExist=0   high=0.0   datetime=table: 0000000011470030   volume=0.0   open=0.0   low=0.0
4   19.12.2023 17:20:00   close=0.0   doesExist=0   high=0.0   datetime=table: 000000001146E570   volume=0.0   open=0.0   low=0.0
3   19.12.2023 17:10:00   close=0.0   doesExist=0   high=0.0   datetime=table: 000000001147D270   volume=0.0   open=0.0   low=0.0
2   19.12.2023 17:00:00   close=0.0   doesExist=0   high=0.0   datetime=table: 0000000011475E70   volume=0.0   open=0.0   low=0.0
1   19.12.2023 16:50:00   close=0.0   doesExist=0   high=0.0   datetime=table: 0000000011461DF0   volume=0.0   open=0.0   low=0.0
Вначале перечислены исходные данные, затем список полей, который скрипт установил из списка, потом значения свечей. В первом поле идет расшифровка даты свечи из поля datetime
Перестал работать getCandlesByIndex у всех брокеров, getCandlesByIndex
 
Перестал работать getCandlesByIndex
причем время свечек видно в datetime, а остальные параметры open, high, low, close, volume и doesExist - нулевые.
Написал код для тестирования, индикатор ставим на график с идентификатором SBER_Chart:
Код
Settings=
{
   Name = '#test'
}
function writeToFile(filename, content)
  local file_handle = io.open(filename, 'w')
  if file_handle then
    file_handle:write(content)
    file_handle:close()
    return true
  else
    return false
  end
end

function Init()
  return 1
end

function OnCalculate(index)
  id_chart = 'SBER_Chart'
  local need_right_candles_count = 10
  local line_number = 0
  local candles_count = getNumCandles(id_chart)
  local candles_from = candles_count - need_right_candles_count
  check1 =  tostring(id_chart)..'\n'..tostring(line_number)..'\n'..tostring(candles_from)..'\n'..tostring(need_right_candles_count)..'\n'..tostring(candles_count)..'\n'

  local result_table, result_candles_count, result_chart_name = getCandlesByIndex(id_chart, line_number, candles_from, need_right_candles_count)


  if result_table == nil or #result_table == 0 then
    return "Empty result_table"
  end

  local fieldNames = {}
  for field, _ in pairs(result_table[1]) do
    table.insert(fieldNames, field)
  end

  check1 = check1..'My_Time\t'..table.concat(fieldNames, '\t') .. '\n'

  for i = #result_table, 1, -1 do
    if result_table[i].datetime == nil or 
       result_table[i].datetime.day == nil or 
       result_table[i].datetime.month == nil or 
       result_table[i].datetime.year == nil or 
       result_table[i].datetime.hour == nil or 
       result_table[i].datetime.min == nil or 
       result_table[i].datetime.sec == nil then
          return nil 
    end

    local candle_datetime = string.format("%02d.%02d.%04d %02d:%02d:%02d", 
        result_table[i].datetime.day, 
        result_table[i].datetime.month, 
        result_table[i].datetime.year, 
        result_table[i].datetime.hour, 
        result_table[i].datetime.min, 
        result_table[i].datetime.sec)
    
    local formattedFields = {
      candle_datetime
    }
    for j, fieldName in ipairs(fieldNames) do
      local fieldValue = result_table[i][fieldName]
      table.insert(formattedFields, tostring(fieldValue))
    end

    check1 = check1 .. table.concat(formattedFields, '\t')..'\n'
  end

  local filename_w = getWorkingFolder()..'\\check1.txt'
  if writeToFile(filename_w, check1) then
    return
  else
    return "Failed to write to file"
  end
end

На выходе получаем, нулевые данные (кроме времени свечей)
Код
SBER_Chart
0
5595
10
5605
My_Time   open   close   volume   datetime   doesExist   low   high
08.12.2023 15:00:00   0.0   0.0   0.0   table: 000000002BD45650   0   0.0   0.0
08.12.2023 14:50:00   0.0   0.0   0.0   table: 000000002BD455D0   0   0.0   0.0
08.12.2023 14:40:00   0.0   0.0   0.0   table: 000000002BD45550   0   0.0   0.0
08.12.2023 14:30:00   0.0   0.0   0.0   table: 000000002BD454D0   0   0.0   0.0
08.12.2023 14:20:00   0.0   0.0   0.0   table: 000000002BD45450   0   0.0   0.0
08.12.2023 14:10:00   0.0   0.0   0.0   table: 000000002BD453D0   0   0.0   0.0
08.12.2023 14:00:00   0.0   0.0   0.0   table: 000000002BD45350   0   0.0   0.0
08.12.2023 13:50:00   0.0   0.0   0.0   table: 000000002BD452D0   0   0.0   0.0
08.12.2023 13:40:00   0.0   0.0   0.0   table: 000000002BD45250   0   0.0   0.0
и так у разных брокеров (реальный счет) на споте и на фьюче.
Смена инструмента на графике из кода, из Lua
 
Цитата
Anton Belonogov написал:
Изменение инструмента на графике при помощи Lua-скрипта не предусмотрено.
А чисто теоретически, можно ли написать на другом языке или сделать какую-нибудь библиотеку, чтобы предоставить такую функциональность?

Чтобы потом вызывать это из Lua и это работало. Как теоретически Вы это видите?
Смена инструмента на графике из кода, из Lua
 
У меня есть график с идентификатором.

Если руками, то в разделе "Диаграмма" на закладке "Свойства диаграммы" есть кнопка Изменить. Там я могу поменять инструмент на графике руками.

Мне необходимо из Lua менять этот инструмент (не руками).

Как это сделать?
Расчет денег в лоты и обратно., Lot2Money и Money2Lot
 
Дело в чем-то другом.

Просто откройте скриншот в первом сообщении, там внизу комментарий.

Думаю либо в формуле, что-то явно не хватает, либо Мосбиржа вносит кривые данные в статичную информацию об инструменте.

А баг с ноликом, который не нужен и опасен, у меня исправлен.
Код
function Get_gLast_Price_gr(zCLASSCODE,zSECCODE)
if zCLASSCODE==nil or zSECCODE==nil then return nil end
local Last_Price=getParamEx(zCLASSCODE,zSECCODE,'LAST').param_value
if Last_Price==0 then return nil end
return tostring_comma(Last_Price,nil,'.')
end
Расчет денег в лоты и обратно., Lot2Money и Money2Lot
 
Написал 2 программы Lot2Money и Money2Lot

Однако есть проблема, что иногда код неправильно считает.
т.е. Money2Lot выдаёт иногда 0, потому что Мосбиржа ставит большой LOTSIZE, но обычно правильно.

Наверно я что-то упустил в алгоритме. Подскажите где я ошибся.

Код
function Lot2Money(zCLASSCODE,zSECCODE,Lot)
local Price=tonumber(Get_gLast_Price_gr(zCLASSCODE,zSECCODE))
if Price==nil or Price==0 then return nil end
local LOTSIZE=getParamEx(zCLASSCODE,zSECCODE,"LOTSIZE").param_value
if LOTSIZE==nil then return nil end
message('Lot2Money'
..'\n'..'zCLASSCODE= '..tostring(zCLASSCODE)
..'\n'..'zSECCODE= '..tostring(zSECCODE)
..'\n'..'Lot= '..tostring(Lot)
..'\n'..'Price= '..tostring(Price)
..'\n'..'LOTSIZE= '..tostring(LOTSIZE)
..'\n'..'Lot*Price*LOTSIZE= '..tostring(Lot*Price*LOTSIZE)
)
return Lot*Price*LOTSIZE
end
Здесь я поставил заплатку, что не есть хорошо.
Код
function Money2Lot(zCLASSCODE, zSECCODE, Money)
if Money==nil then return 0 end
local Price=tonumber(Get_gLast_Price_gr(zCLASSCODE,zSECCODE))
if Price==nil or Price==0 then return nil end
local LOTSIZE=getParamEx(zCLASSCODE,zSECCODE,"LOTSIZE").param_value
if LOTSIZE==nil then return nil end
message('Money2Lot'
..'\n'..'zCLASSCODE= '..tostring(zCLASSCODE)
..'\n'..'zSECCODE= '..tostring(zSECCODE)
..'\n'..'Money= '..tostring(Money)
..'\n'..'Price= '..tostring(Price)
..'\n'..'LOTSIZE= '..tostring(LOTSIZE)
..'\n'..'Money/(Price * LOTSIZE= '..tostring(Money/(Price * LOTSIZE))
)
local RetLot=math.floor(Money/(Price * LOTSIZE))
if RetLot==0 then -- ЗАПЛАТКА: если брокер поставил избыточный LOTSIZE
    RetLot=math.floor(Money/Price)
end
return RetLot
end
Как получить данные из Нижней панели стакана цен?, Как получить данные из Нижней панели стакана цен?
 
Неужели такие важные данные как суммарный спрос невозможно получить из QICK через Lua?
Как получить данные из Нижней панели стакана цен?, Как получить данные из Нижней панели стакана цен?
 
В стакане цен есть настройка, которая вызывается по Ctrl+E.
Там можно поставить галочку "Нижняя панель".
После этого внизу стакана будет видна панель лотов.

Вопрос: как мне получить программно эти цифры стакана цен.

Примечание: простое складывание объёмов в стакане (а там их всего 20 строк) всегда меньше цифр в Нижней панели)
Как получить наименование Вкладки, на которой открыт График?, Вкладка
 
В QUIK есть "Менеджер окон", в котором есть привязка по Названию окна графика к Вкладке, на которой открыто это окно.  

Робот хочет понимать на какой вкладке, открыт график.

Есть ли способ обращения из qlua к табличке Менеджера окон?
Как подключиться к таблице состояние счета LUA, QUIK
 
Всё же хотелось бы получать информацию об открытых позициях из терминала. При этом не из табличек orders, trades, а из состояния счёта. Как минимум надо банально знать какие инструменты открыты, ведь orders и traders однодневные таблички, и после их зачищения робот с утра становится слепым.  
Как подключиться к таблице состояние счета LUA, QUIK
 
Цитата
Alexey Danin написал:
Средствами QLUA данную таблицу не получить.
Именно с этого надо начинать знакомство с QUIK.
Как подавить вывод командного окна при запуске exe-файла из Lua?, popen execute
 
pcall, вроде поглощает командное окно.
На простенькой функции у меня поглотил окно.
Надо будет другие потестить.
Код
local ok, err = pcall(os.remove, 'C:\\test.txt')
if not ok then
    message('Error deleting file:', err)
end
Как подавить вывод командного окна при запуске exe-файла из Lua?, popen execute
 
Как подавить вывод командного окна при запуске exe-файла из Lua?

Я придумал запускать в процессе, но всё равно окно выводится.

Экзэшник откомпилирован в режиме --noconsole. Т.е. при обычном запусе из винды вообще ничего не происходит в отношении окон.

Однако при его запуске из Lua всё равно появляется коммандное окно на долю секунды:
Код
while true do

command = 'Z:\\#EXE\\test.exe'
local process = io.popen("start /B " .. command)
process:close()

    sleep(10000)
end

с os.execute та же история.

Также был проработан вариант через комманду io.popen("wscript Z:\\#EXE\\run_hidden.vbs Z:\\#EXE\\test.exe")
Код
If WScript.Arguments.Count > 0 Then
    exe_path = WScript.Arguments(0)
    Set WshShell = CreateObject("WScript.Shell")
    WshShell.Run "cmd /c start /B " & Chr(34) & exe_path & Chr(34), 0, False
Else
    WScript.Echo "Не указан путь к исполняемому файлу."
End If
тоже командное окно появляется.

Как от него избавиться?  
Как получить графу Прибыль/Убыток из getPortfolioInfoEx, часть возвращаемой таблицы пустая, хотя в визуальной таблице QUIK данные есть.
 
Цитата
Владимир написал:
а код совершенно одинаковый.
А как Вы определяете максимально возможный лот на спотовом рынке при условии, что can_buy для цены не у всех брокеров заполняется ?
Как получить графу Прибыль/Убыток из getPortfolioInfoEx, часть возвращаемой таблицы пустая, хотя в визуальной таблице QUIK данные есть.
 
Цитата
Владимир написал:
он знает в миллион раз лучще любого getPortfolioInfoEx
Я про это и говорю. Я тоже теперь считаю и храню данные за пределами QUIK.
QUIK - это только для открытия ордеров, остальную же функциональность надо затачивать за пределами QUIK.
Такое как хранение истории ордеров, расчет лотности, can_buy, плечо, информацию о портфеле: просто надо брать и смело переписывать getPortfolioInfoEx в свою фунцию.

Сейчас у меня констаны подгружаются в зависимости от того на каком компе (виртуальной машине) запущено.
Т.е. каждой машинке своего брокера, со своими причудливыми брокерскими настройками в константах. Очень удобно в моём случае.
Код
local function get_Comp_Name()
    os.execute('echo %computername% > C:\\Comp_Name.txt')
    local file=io.open('C:\\Comp_Name.txt','r')
    local Comp_Name=file:read("*all"):gsub("%s+","")
    file:close()
    message('[' .. Comp_Name .. ']')
    file=io.open('C:\\Comp_Name.txt','w')
    file:write(Comp_Name)
    file:close()
    return Comp_Name
end
Как получить графу Прибыль/Убыток из getPortfolioInfoEx, часть возвращаемой таблицы пустая, хотя в визуальной таблице QUIK данные есть.
 
В общем это не работает.
При таком коде:
Код
local Tab=getPortfolioInfoEx (gFIRMID, gCLIENT_CODE, 2, gBOARD_TAG, gCURRENCY) -- https://luaq.ru/getPortfolioInfoEx.html
local Tab=getPortfolioInfoEx (gFIRMID, gCLIENT_CODE, 2) -- https://luaq.ru/getPortfolioInfoEx.html
local zPortfolio_value=Tab.portfolio_value -- Стоимость портфеля
local zCash_leverage=Tab.cash_leverage -- Плечо
local zProfit_loss=Tab.profit_loss -- Прибыль/Убытки
message('zPortfolio_value= '..tostring(zPortfolio_value)..'\nzCash_leverage= '..tostring(zCash_leverage)..'\nzProfit_loss= '..tostring(zProfit_loss))
Результат:
Код
zPortfolio_value= 45643.370000 -- это правильно
zCash_leverage= 0.000000
zProfit_loss= 0.000000
А при таком коде:
Код
local Tab=getPortfolioInfo (gFIRMID, gCLIENT_CODE) -- https://luaq.ru/getPortfolioInfo.html
local zLeverage=Tab.leverage -- Плечо
local zCur_leverage=Tab.cur_leverage -- Тек.плечо
message('zLeverage= '..tostring(zLeverage)..'\nzCur_leverage= '..tostring(zCur_leverage)) 
Результат:
Код
zLeverage= 101000.000000
zCur_leverage= 0.000000
Эта цифра котрую удалось выудить zLeverage
принимае у разных брокеров такие значения,
Код
1501,00 -- это наверно надо делить на 100000
101000,00 -- это наверно надо делить на 100000
2,00 -- а это не надо делить, ибо похоже на правду

т.е. каждый кто-во что горазд Смысл этого абсурда примерно ясен: бороться с ветрянными мельницами себе дороже.Вывел плечо в константу gLVG.
Я уже ржу над тем, что разработчики позиционируют QUIK как профессиональную систему, из профессионального там только ядро.
Вот теперь моя коллекция констант для настройки счета. Сразу с их жесткого прописывайте и не тратьте впустую время.
Код
 gFIRMID='';gACCOUNT='';gCLIENT_CODE='';gCLASSCODE='';gBOARD_TAG='';gCURRENCY='';gLIMIT_KIND=nil;gLVG=nil;
Как получить графу Прибыль/Убыток из getPortfolioInfoEx, часть возвращаемой таблицы пустая, хотя в визуальной таблице QUIK данные есть.
 

Пытаюсь получить из таблицы "Клиентский портфель [SUR]" данные из графы << Плечо >> по строке Т2

Использую для этого код:

Код
local PortfolioInfoExTable=getPortfolioInfoEx (gFIRMID, gCLIENT_CODE, 2) -- https://luaq.ru/getPortfolioInfoEx.html
local zPortfolio_value=PortfolioInfoExTable.portfolio_value -- Стоимость портфеля
local zCash_leverage=PortfolioInfoExTable.cash_leverage -- Плечо
message(tostring(zPortfolio_value)..'\n\n'..tostring(zCash_leverage)) 

Но значение плеча zCash_leverage нулевое, хотя я вижу этот размер плеча явно в таблице "Клиентский портфель [SUR]" в строке Т2.

При этом мне успешно показывается стоимость портфеля - zPortfolio_value.

У меня такое ощущение, что в синтаксисе команды getPortfolioInfoEx должно быть ещё указание на валюту т.к. она указана в титуле окна.

На самом деле мне нужна графа <<Прибыль/Убытки>>, но для упрощения вопроса спрашиваю про графу <<Плечо>>.

Как мне получить размер Плеча или Прибыль/Убыток с начала дня по спотовому рынку?

can_buy из подтаблицы "Купить/Продать" таблицы "Клиентский портфель", Как мне получить can_buy при для фондового рынка?
 
В десктопном терминале QUIK на языке lua я даю команду buy_sell_info=getBuySellInfo('MC0002500000','404JNEF','TQBR','RUAL',0) -- https://luaq.ru/getBuySellInfo.html
Мне возвращается таблица: table: 000000000A9B9750
Из таблицы я беру значение buy_sell_info.can_buy и оно равно nil (не определено)
У других брокеров всё работает.

Техническая поддержка моего брокера порекомендовала брать данные о количестве доступных лотов для покупки из подтаблицы "Купить/Продать" таблицы "Клиентский портфель".
Как обратиться к "Клиентскому портфелю" мне понятно portfolio = getPortfolioInfoEx ('MC0002500000','404JNEF', 2)
и даже успешно оттуда вызывается плечо portfolio.leverage

Однако надо получить доступ именно к той таблице "Купить/Продать", котрая вызывается из таблицы "Клиентского портфеля" (а не из таблицы "Состояние счета")
Как мне получить can_buy при для фондового рынка?
Как получить код клиента если известна Фирма и Счёт?, Как получить код клиента если известна FIRMID и ACCOUNT?
 
По причине того, что каждый брокер делает настройки, кто во что горазд, то код нерабочий.
Наверно проще делать свой файл настроек для каждого брокера, где ручками прописывать три ключевых параметра торговли FIRMID, ACCOUNT, CLIENT_CODE
Код
function set_ACCOUNT_FIRMID_Spot()
  if gACCOUNT == '' then
    return gACCOUNT
  end
  
  if gSpot then
    local TableName = 'trade_accounts'
    local rows_total = getNumberOf(TableName)
    
    for r = rows_total - 1, 0, -1 do
      local table_row = getItem(TableName, r)
      
      if tonumber(table_row.firmuse) == 1 and tonumber(table_row.trdacc_type) == 4 then
        gFIRMID = table_row.firmid
        gACCOUNT = table_row.trdaccid
        
        if gCLIENT_CODE == '' then 
          local TableName2 = 'client_codes' --функция getNumberOf(«client_codes») возвращает количество доступных кодов клиента в терминале, 
          local rows_total2 = getNumberOf(TableName2)
          
          for i = 0, rows_total2 - 1 do
            local str_CLIENT_CODE = getItem(TableName2, i) --, а функция getItem(«client_codes», i) –строку, содержащую клиентский код с индексом i, где i может принимать значения от 0 до getNumberOf(«client_codes») -1
                  --Срок расчётов. Возможные значения:положительные целые числа, начиная с «0», 
         --соответствующие срокам расчётовиз таблицы «Позиции по деньгам»: «0» –T0, «1» –T1, «2» –T2 и т.д.;
         --отрицательные целые числа –технологические лимиты(используются для внутренней работы системы QUIK)
            MoneyExTable = getMoneyEx(gFIRMID, str_CLIENT_CODE, 'EQTV', 'SUR', 2)
            
            if MoneyExTable ~= nil then
              if tonumber(MoneyExTable.currentbal) > 0 and tonumber(MoneyExTable.leverage) > 0 then
                gCLIENT_CODE = str_CLIENT_CODE
              end
            end
          end
          
          if gCLIENT_CODE == '' then 
            gCLIENT_CODE = gACCOUNT 
          end
        end
        
        message(gCLIENT_CODE)
        if gACCOUNT ~= '' then 
          return 
        end
      end
    end
    
    return
  end
end
Последнюю версию кода прилагаю, может у кого возникнет мысль как автоматизировать получение ключевых параметров для торговли.
Как получить код клиента если известна Фирма и Счёт?, Как получить код клиента если известна FIRMID и ACCOUNT?
 
Разобрался. Действительно строка возвращается.

Код клиента получен.
Как получить код клиента если известна Фирма и Счёт?, Как получить код клиента если известна FIRMID и ACCOUNT?
 
В документации ошибка: сказано, что возвращается строка, а на самом деле таблица.
https://euvgub.github.io/QLua/?page=22
Код
function set_ACCOUNT_FIRMID()
if gACCOUNT~='' then return gACCOUNT end
if gSpot==true then
   local TableName='trade_accounts' -- https://luaq.ru/getItem.html#param_table_26
   local rows_total=getNumberOf(TableName);
   for r=rows_total-1, 0, -1  do
      local table_row=getItem(TableName,r);
      if tonumber(table_row.firmuse)==1 and tonumber(table_row.trdacc_type)==4 then
         gFIRMID=table_row.firmid
         gACCOUNT=table_row.trdaccid
         --if gCLIENT_CODE=='' then gCLIENT_CODE=gACCOUNT end         
         local TableName=getNumberOf('client_codes') --функция getNumberOf(«client_codes») возвращает количество доступных кодов клиента в терминале, 
         for i=rows_total-1, 0, -1  do
            local string_row=getItem(TableName,i) -- а функция getItem(«client_codes», i) –строку, содержащую клиентский код с индексом i, где i может принимать значения от 0 до getNumberOf(«client_codes») -1

            message(tostring(i)..'client_code1= '..tostring(string_row)) -- результат table: 000000001A1F2C10

            message(tostring(i)..'client_code2= '..tostring(string_row[i])) -- результат nil

            message(tostring(i)..'client_code3= '..tostring(string_row.client_code)) -- результат nil

         end
         stop();
         if gACCOUNT~='' then return; end
      end
   end
   stop();
end
Как понять, что за структура этой таблицы клиентов?
Как получить код клиента если известна Фирма и Счёт?, Как получить код клиента если известна FIRMID и ACCOUNT?
 
FIRMID и ACCOUNT для спотового рынка мне получить удалось из таблички фьючерсов
Код
function set_ACCOUNT_FIRMID()
if gACCOUNT~='' then return gACCOUNT end
if gSpot==true then
   local TableName='trade_accounts' -- https://luaq.ru/getItem.html#param_table_26
   local rows_total=getNumberOf(TableName);
   for r=rows_total-1, 0, -1  do
      local table_row=getItem(TableName,r);
      if tonumber(table_row.firmuse)==1 and tonumber(table_row.trdacc_type)==4 then
         gFIRMID=table_row.firmid
         gACCOUNT=table_row.trdaccid
         if gCLIENT_CODE=='' then gCLIENT_CODE=gACCOUNT end         
         if gACCOUNT~='' then return; end
      end
   end
   stop();
end
end
Как получить CLIENT_CODE?
В какой таблице он лежит?
Как определить доступна ли торговля по инструменту до открытия позиции., При отправке транзакции появляется ошибка брокера "Вам запрещена работа по данному инструменту".
 
При отправке транзакции появляется ошибка брокера "Вам запрещена работа по данному инструменту".

Как выяснилось брокер работает с ограниченным списком фьючерсных контрактов (и отправлят смотреть список доступных для торговли фьючерсов в эксель файл на своём сайте).

Однако котировки по всем фьючерсам брокер транслирует, но доступны для торговли только инструменты из их эксель-файла на сайте.

Потому при отправе транзакции появляется вышеназванная ошибка.

Какой командой мне определить, что инструмент доступен для торговли?  
Максимальный лот для фьючерса., Подскажите формулу расчета максимального лота для фьючерсов.
 

Я не стремлюсь к  хирургической точности цифры, мне хотя бы порядок сделки определить.

Поэтому я сделал костыль:

1.покупаю для начала один лот,

2.записываю в файл, сколько он отъел свободной маржи после открытия позиции,

3.при следующем открытии свободные средства делю на это записанное в файл, и получаю максимальный лот.

Теперь можно хоть как-то ориентироваться в размерности ценовых координат.

Файлик обновляю при следующих сделках (на всякий случай).

Но я крайне удивлен отсутствием базовой информации о торговле в торговом терминале.

Может где-то есть стоимость лота в валюте депозита? Где это лежит?

Максимальный лот для фьючерса., Подскажите формулу расчета максимального лота для фьючерсов.
 

В окне "Фьючерсы FORTS Ввод заявки" есть кнопка [Max], которая позволяет автоматически подставить максимальное количество лотов в форму ручного ввода заявки.

По какой формуле идёт расчёт максимального количества лотов для фьючерсов в этом окне?

Как работать с битовыми флагами?, Как получить бит из битогового флага?
 
Код
function CntTradesSellPosition(zCLASSCODE,zSECCODE)
cnt=0
   local TableName='trades'
   local rows_total = getNumberOf(TableName)
   for r=rows_total-1, 0, -1  do
      local table_row=getItem(TableName,r)
      --message(tostring(table_row.flags));stop()
      if table_row.class_code==zCLASSCODE and table_row.sec_code==zSECCODE and table_row.flags==36 then -- сделка продажа
         cnt=cnt+1
      end
   end
return cnt
end

Пишу как самоучка, но мне как-то сложно (невозможно) вытаскивать из битовых флагов эти нужные значения, которые там закодированы в двоичной системе.
В частности мне нужно определить только тип заявки ордера Buy или Sell.

Я так и не нашёл нигде пример алгоритма получения этих битовых значений, поэтому беру 10-тичные числа, но это кривовато, ибо по причине изменения других свойств и числа будут другие.
Вот я методом научного тыка определил коды для продаж  и второй флаг (бит) принимает разные значения:
64 = 1000000
36 = 100100
28 = 11100
1048604 = 100000000000000011100 - Продажа от стоплосса

Прошу, измените мой код, чтобы он нормально обрабатывал эти битовые флаги.
Как получить любой SECCODE по BASE_CONTRACT ?, В какой таблице идёт привязка между текущим фьючерсным инструментом и базовым активом?
 
1.фьюченые инструменты постоянно меняются, но базовый актив - постоянный.
2.как я установил одному базовому активу может быть присвоено несколько фьючерсов по срокам истечения, например: BR = BRH3, BRG3, BRF3


Вопросы:
1.в какой таблице лежит список базовых активов?
2.какая таблица привязывает базовый актив к фьючерсам?

Хотелось бы получить Любой фьючерс по базовосу активу.
Страницы: 1
Наверх