приходится делать работу за разрабов - это конечно уродство, когда вот так вносятся правки без какой-либо поддержки и указаний как с этим работать. Как минимум - это неуважение к своим клиентам.
Код тестирования:
-- Глобальные переменные для определения схемы работы
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()
Код тестирования:
-- Глобальные переменные для определения схемы работы
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()