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

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

Страницы: 1
limit_kind в таблице depo_limit
 
приходится делать работу за разрабов - это конечно уродство, когда вот так вносятся правки без какой-либо поддержки и указаний как с этим работать. Как минимум - это неуважение к своим клиентам.

Код тестирования:

-- Глобальные переменные для определения схемы работы
IS_NEW_DATE_SCHEME = nil  -- Флаг новой схемы с датами
CURRENT_TRADE_DATE = nil  -- Текущая дата торгов
TEST_RESULTS = {}         -- Таблица для хранения результатов тестирования

-- Константы (должны быть настроены под конкретного брокера)
STOCK_ACCOUNT = "NL001***"  -- счет для акций
CLIENT_CODE = "10***"           -- код клиента
FIRM_ID = "NC00***"        -- код фирмы

-- Функция записи в лог-файл
function WriteToLog(message)
   local log_file = io.open(getScriptPath().."\\quik_scheme_test.txt", "a")
   if log_file then
       local timestamp = os.date("%Y-%m-%d %H:%M:%S")
       log_file:write(timestamp .. " - " .. message .. "\n")
       log_file:close()
   else
       message("Ошибка открытия файла для записи!")
   end
end

-- Функция определения типа схемы (новая с датами или старая)
function detect_scheme_type()
   WriteToLog("=== Начало определения типа схемы ===")
   
   local num = getNumberOf('money_limits')
   WriteToLog("Найдено записей в money_limits: " .. tostring(num))
   
   if num > 0 then
       for i = 0, num - 1 do
           local limit = getItem('money_limits', i)
           WriteToLog(string.format("Запись %d: limit_kind = %s, firmid = %s, client_code = %s",
               i, tostring(limit.limit_kind), tostring(limit.firmid), tostring(limit.client_code)))
           
           if limit.limit_kind > 365 then  -- Если значение больше 365, это новая схема с датами
               IS_NEW_DATE_SCHEME = true
               CURRENT_TRADE_DATE = tonumber(os.date("%Y%m%d"))
               WriteToLog("Обнаружена НОВАЯ схема с датами. limit_kind = " .. tostring(limit.limit_kind))
               WriteToLog("Текущая дата: " .. tostring(CURRENT_TRADE_DATE))
               return
           end
       end
   end
   
   IS_NEW_DATE_SCHEME = false
   WriteToLog("Обнаружена СТАРАЯ схема с T0, T1, T2")
end

-- Функция получения даты для T0, T1, T2
function get_settlement_date(offset)
   if not IS_NEW_DATE_SCHEME then
       WriteToLog("get_settlement_date: старая схема, возвращаем offset = " .. tostring(offset))
       return offset
   end
   
   local trade_date = CURRENT_TRADE_DATE
   if not trade_date then
       trade_date = tonumber(os.date("%Y%m%d"))
   end
   
   local result_date = trade_date + offset
   WriteToLog(string.format("get_settlement_date: новая схема, offset=%d, результат=%d", offset, result_date))
   return result_date
end

-- Функция поиска позиции с учетом схемы
function find_limit_position(limits_table, criteria)
   WriteToLog("Поиск в таблице: " .. limits_table)
   WriteToLog("Критерии поиска: " .. tostring(criteria.firmid) .. ", " .. tostring(criteria.client_code))
   
   local num = getNumberOf(limits_table)
   WriteToLog("Количество записей в таблице: " .. tostring(num))
   
   if num <= 0 then
       WriteToLog("Таблица пуста")
       return nil
   end
   
   if IS_NEW_DATE_SCHEME then
       WriteToLog("Поиск в НОВОЙ схеме (по максимальной дате)")
       local best_match = nil
       local max_date = 0
       
       for i = 0, num - 1 do
           local item = getItem(limits_table, i)
           local matches = true
           
           for key, value in pairs(criteria) do
               if key ~= 'limit_kind' and item[key] ~= value then
                   matches = false
                   break
               end
           end
           
           if matches then
               WriteToLog(string.format("Найдена подходящая запись: limit_kind=%d, currentbal=%s",
                   item.limit_kind, tostring(item.currentbal)))
               if item.limit_kind > max_date then
                   max_date = item.limit_kind
                   best_match = item
               end
           end
       end
       
       if best_match then
           WriteToLog("Выбрана запись с максимальной датой: " .. tostring(max_date))
       else
           WriteToLog("Подходящих записей не найдено")
       end
       
       return best_match
   else
       WriteToLog("Поиск в СТАРОЙ схеме (точное соответствие)")
       for i = 0, num - 1 do
           local item = getItem(limits_table, i)
           local matches = true
           
           for key, value in pairs(criteria) do
               if item[key] ~= value then
                   matches = false
                   break
               end
           end
           
           if matches then
               WriteToLog("Найдена точная запись: limit_kind=" .. tostring(item.limit_kind))
               return item
           end
       end
   end
   
   WriteToLog("Запись не найдена")
   return nil
end

-- Обновленная функция получения доступных средств
function GetFreeMoney()
   WriteToLog("=== Вызов GetFreeMoney() ===")
   WriteToLog("CLASS_CODE: " .. tostring(CLASS_CODE))
   
   -- Определяем схему при первом вызове
   if IS_NEW_DATE_SCHEME == nil then
       detect_scheme_type()
   end
   
   if CLASS_CODE == 'SPBFUT' or CLASS_CODE == 'SPBOPT' then
       WriteToLog("Обработка срочного рынка")
       local num = getNumberOf('futures_client_limits')
       WriteToLog("Записей в futures_client_limits: " .. tostring(num))
       
       if num > 0 then
           for i = 0, num - 1 do
               local limit = getItem('futures_client_limits', i)
               if limit.firmid == FIRM_ID and limit.trdaccid == STOCK_ACCOUNT and limit.limit_type == 0 then
                   WriteToLog("Найдены средства срочного рынка: " .. tostring(limit.cbplplanned))
                   return limit.cbplplanned
               end
           end
       end
   elseif CLASS_CODE == 'TQBR' or CLASS_CODE == 'QJSIM' or CLASS_CODE == 'CETS' then
       WriteToLog("Обработка фондового рынка")
       local criteria = {
           currcode = 'SUR',
           firmid = FIRM_ID,
           client_code = CLIENT_CODE
       }
       
       if IS_NEW_DATE_SCHEME then
           WriteToLog("Поиск в НОВОЙ схеме")
           criteria.limit_kind = 0
           local limit = find_limit_position('money_limits', criteria)
           if limit then
               WriteToLog("Найдены средства: " .. tostring(limit.currentbal))
               return limit.currentbal
           end
       else
           WriteToLog("Поиск в СТАРОЙ схеме")
           criteria.limit_kind = 0
           local limit = find_limit_position('money_limits', criteria)
           if limit then
               WriteToLog("Найдены средства: " .. tostring(limit.currentbal))
               return limit.currentbal
           end
       end
   else
       WriteToLog("Неизвестный CLASS_CODE: " .. tostring(CLASS_CODE))
   end
   
   WriteToLog("Средства не найдены, возвращаем 0")
   return 0
end

-- Функция тестирования различных CLASS_CODE
function TestDifferentMarkets()
   WriteToLog("\n=== Тестирование различных рынков ===")
   
   -- Тестируем фондовый рынок
   CLASS_CODE = 'TQBR'
   local stock_money = GetFreeMoney()
   table.insert(TEST_RESULTS, {market = "Фондовый рынок (TQBR)", money = stock_money})
   
   -- Тестируем срочный рынок
   CLASS_CODE = 'SPBFUT'
   local futures_money = GetFreeMoney()
   table.insert(TEST_RESULTS, {market = "Срочный рынок (SPBFUT)", money = futures_money})
   
   -- Тестируем валютный рынок
   CLASS_CODE = 'CETS'
   local currency_money = GetFreeMoney()
   table.insert(TEST_RESULTS, {market = "Валютный рынок (CETS)", money = currency_money})
end

-- Функция анализа таблиц лимитов
function AnalyzeLimitTables()
   WriteToLog("\n=== Анализ таблиц лимитов ===")
   
   -- Анализ money_limits
   local money_limits_count = getNumberOf('money_limits')
   WriteToLog("money_limits записей: " .. tostring(money_limits_count))
   
   if money_limits_count > 0 then
       for i = 0, math.min(money_limits_count-1, 10) do  -- Ограничим вывод первыми 10 записями
           local limit = getItem('money_limits', i)
           WriteToLog(string.format("money_limits[%d]: firmid=%s, client_code=%s, limit_kind=%s, currentbal=%s",
               i, tostring(limit.firmid), tostring(limit.client_code),
               tostring(limit.limit_kind), tostring(limit.currentbal)))
       end
   end
   
   -- Анализ depo_limits
   local depo_limits_count = getNumberOf('depo_limits')
   WriteToLog("depo_limits записей: " .. tostring(depo_limits_count))
   
   if depo_limits_count > 0 then
       for i = 0, math.min(depo_limits_count-1, 5) do  -- Ограничим вывод первыми 5 записями
           local limit = getItem('depo_limits', i)
           WriteToLog(string.format("depo_limits[%d]: firmid=%s, client_code=%s, sec_code=%s, limit_kind=%s, currentbal=%s",
               i, tostring(limit.firmid), tostring(limit.client_code),
               tostring(limit.sec_code), tostring(limit.limit_kind), tostring(limit.currentbal)))
       end
   end
end

-- Основная функция
function main()
   WriteToLog("====== ЗАПУСК ТЕСТИРОВАНИЯ СХЕМЫ QUIK ======")
   WriteToLog("Версия скрипта: 1.0")
   WriteToLog("Дата тестирования: " .. os.date("%Y-%m-%d %H:%M:%S"))
   
   -- Инициализация
   detect_scheme_type()
   
   -- Анализ таблиц
   AnalyzeLimitTables()
   
   -- Тестирование различных рынков
   TestDifferentMarkets()
   
   -- Вывод результатов
   WriteToLog("\n=== ИТОГОВЫЕ РЕЗУЛЬТАТЫ ===")
   WriteToLog("Тип схемы: " .. (IS_NEW_DATE_SCHEME and "НОВАЯ (по датам)" or "СТАРАЯ (T0,T1,T2)"))
   
   for _, result in ipairs(TEST_RESULTS) do
       WriteToLog(string.format("%s: %s", result.market, tostring(result.money)))
   end
   
   WriteToLog("\n=== РЕКОМЕНДАЦИИ ===")
   if IS_NEW_DATE_SCHEME then
       WriteToLog("1. Используйте функции поиска по максимальной дате")
       WriteToLog("2. Обновите все скрипты для работы с новой схемой")
       WriteToLog("3. Тестируйте на QUIK Junior для адаптации")
   else
       WriteToLog("1. Брокер использует классическую схему")
       WriteToLog("2. Готовьтесь к возможному переходу на новую схему")
       WriteToLog("3. Протестируйте скрипты на QUIK Junior")
   end
   
   WriteToLog("====== ТЕСТИРОВАНИЕ ЗАВЕРШЕНО ======\n")
   
   message("Тестирование завершено. Результаты в файле quik_scheme_test.txt")
end

-- Очистка файла при каждом запуске
local init_file = io.open(getScriptPath().."\\quik_scheme_test.txt", "w")
if init_file then
   init_file:write("")
   init_file:close()
end

-- Запуск основной функции
main()
limit_kind в таблице depo_limit
 
Цитата
Андрей написал:
Цитата
Андрей, если не сложно, поделитесь скриптом, а то уже кучу времени убил на правки и высказал кучу матов в адрес разрабов, а толку пока нет.
Спасибо!
Скрипт написал, тестирую, но тут опять незадача...Почему в демократии QUIK запрещен short акций? Всех!  
Страницы: 1
Наверх