Определение размера денежных средств на торговом счете, Как определить размер доступных денежных средств для открытия сделки на фондовом и срочном рынке при использовании как выделенного, так и единого торгового счета?
Возникла следующая проблема: Открыл у брокера "Единый торговый счет" (то есть счет, с которого можно одновременно совершать сделки как на фондовом, так и на срочном рынке). При этом, при совершении сделок на фондовом рынке используется "Код торгового счета 1" и "Код клиента 1", а для сделок на срочном рынке используется "Код торгового счета 2" и "Код клиента 2".
До этого у меня было два отдельных счета для работы на фондовом и срочном рынке, и для определения состояния счета на срочном рынке я использовал данные из таблицы "futures_client_limits", где "trdaccid" - это код моего торгового счета на срочном рынке, а для определения состояния счета на фондовом рынке я использовал данные из таблицы "money_limits", где "client_code" - это мой код клиента на фондовом рынке.
После открытия "Единого торгового счета" в таблице "futures_client_limits" есть одна единственная запись с кодом торгового счета "Код торгового счета 2" (это код счета для торговли на срочном рынке), в которой все показатели равны НУЛЮ, а в таблице "money_limits" есть четыре записи с кодом клиента "Код клиента 1" (это код клиента для торговли на фондовом рынке), в которых я вижу состояние своего счета в РУБЛЯХ и $USA для режимов Т0 и Т2 соответственно.
ВОПРОСЫ:
1. Как определить входящие остатки и текущий размер свободных денежных средств для совершения сделок на фондовом рынке, при условии, что используется: "Код торгового счета 1" и "Код клиента 1"? 2. Как определить входящие остатки и текущий размер свободных денежных средств для совершения сделок на срочном рынке, при условии, что используется: "Код торгового счета 2" и "Код клиента 2"?
Подскажите, пожалуйста, как можно получить ЦЕНУ входящей позиции на начало торговой сессии?
В QLUA можно получить данные о текущих позициях:
- по инструментам срочного рынка (фьючерсам) из таблицы "futures_client_holding". В ней есть поле "startnet" - "Входящие чистые позиции", в котором, как я понимаю, указано КОЛИЧЕСТВО лотов по входящей чистой позиции
- по инструментам фондового рынка (акциям) из таблицы "depo_limits". В ней есть поле "openbal" - "Входящий остаток", в котором, как я понимаю, указано КОЛИЧЕСТВО лотов по входящей позиции.
А как получить ЦЕНУ входящей позиции на начало торговой сессии по инструментам срочного и фондового рынка?
В описаниях торгового терминала QUIK и языка QLUA используются два термина "Торговый счет" и "Код клиента". При этом в разных таблицах QUIK могут присутствовать как оба этих значения, так и только одно из них, например:
- в таблице "orders": account STRING Торговый счет client_code STRING Код клиента
- в таблице "depo_limits": trdaccid STRING Счет депо client_code STRING Код клиента
- в таблице "money_limits": client_code STRING Код клиента
- в таблице "futures_client_holding": trdaccid STRING Торговый счет
А есть еще таблица " transaction", которая передается в виде параметра в функцию sendTransaction(transaction). Так в этой таблице также есть эти два параметра: ['ACCOUNT'] - InputTradeAccount ['CLIENT_CODE'] - InputClientCode При этом, если послать транзакцию на создание новой заявки по фьючерсу и при этом не указывать 'CLIENT_CODE', то все нормально срабатывает и заявка выставляется.
Как видно из приведенных примеров в таблицах, которые имеют отношение к фьючерсам, везде обязательно присутствует "Торговый счет", а в таблицах, которые имеют отношение к фондовому рынку, везде обязательно присутствует "Код клиента", а в некоторых присутствуют оба.
Таким образом:
Насколько я понимаю "Торговый счет" - это код торгового счета, открытого у брокера. Если это так, то тогда: что такое "Код клиента", где его взять и в каких случаях его необходимо использовать?
DLL для LUA: Ошибка при получении индексированного массива из DLL, В LUA-скрипте при получении индексированного массива из DLL-библиотеки возникает ошибка и QUIK "падает"
Здравствуйте. Помогите, пожалуйста, разобраться. Очень странная ситуация.
При тестировании взаимодействия LUA-скрипта и DLL-библиотеки была обнаружена ошибка, когда из DLL-библиотеки в LUA-скрипт передается простой индексированный массив.
Тест был простой: из LUA-скрипта вызывается функция DDL-библиотеки, которая просто возвращает сформированный массив.
Код из DDL-библиотеки на C++:
Код
// luaTest.cpp: определяет экспортированные функции для приложения DLL.
#include "stdafx.h"
// ----------------------------------------------------------------------------
// Заголовок Lua
// ----------------------------------------------------------------------------
#ifndef LUA_LIB
// Необходимые для Lua константы
#define LUA_LIB
#define LUA_BUILD_AS_DLL
// Заголовочные файлы LUA из дистрибутива LUA
extern "C" {
#include "./lauxlib.h"
#include "./lua.h"
}
#endif
// -------------------------------------------
// Выбор режима формирования элементов массива
// -------------------------------------------
#define TEST_INDEX_INTEGER
//#define TEST_INDEX_STRING
//#define TEST_INDEX_INTEGER_STRING
// --------------------------------------------------
// Наша единственная функция.
// Формирует и возвращает LUA-скрипту простой массив.
// --------------------------------------------------
static int GetValue(lua_State *L)
{
lua_newtable(L);
for (int i = 1; i <= 15; i++)
{
char strIndex[20] = "";
sprintf_s(strIndex, 10, "%d", i);
// Добавим в стек ключ элемента
#ifdef TEST_INDEX_INTEGER_STRING
// Вот так работает идеально
if (i == 3)
{
// Добавим всего один элемент массива со строковым индексом
lua_pushstring(L, strIndex);
}
else
{
// Все остальные индексы числовые
lua_pushinteger(L, i);
}
#else
#ifdef TEST_INDEX_STRING
// Вот так работает идеально
lua_pushstring(L, strIndex);
#else
// Вот так возникает ошибка (когда все элементы массива имеют целочисленные индексы)
lua_pushinteger(L, i);
#endif
#endif
// Добавим в стек значение элемента
lua_pushinteger(L, i);
// Вставим в стек итератор
lua_settable(L, -3);
}
// Даем lua знать, какое количество значений возвращается нашей функцией
return (1);
}
// ----------------------------------------------------
// Структура "Регистрация реализованных в dll функций",
// что бы те стали доступны из lua.
// ----------------------------------------------------
static struct luaL_reg ls_lib[] =
{
{ "GetValue", GetValue },
{ NULL, NULL }
};
// ------------------------------------------------------------
// Эту функцию lua будет искать при подключении dll,
// ее название заканчиваться названием dll, luaopen_ИмяНашейDLL
// ------------------------------------------------------------
extern "C" LUALIB_API int luaopen_luaTest(lua_State *L)
{
luaL_openlib(L, "luaTest", ls_lib, 0);
return 0;
}
Код LUA-скрипта:
Код
-- Добавим в переменную окружения путь расположения нашего скрипта для подключения *.lua скриптов
package.path = package.path..";"..getScriptPath().."\\?.lua";
-- Добавим в переменную окружения путь расположения нашего скрипта для подключения *.dll библиотек
package.cpath = package.cpath..";"..getScriptPath().."\\?.dll";
-- Загружаем DLL
require('luaTest');
-- Признак работы скрипта
local IsRun = false;
-- Функция инициализации вызывается до запуска скрипта,
-- перед началом работы функции main()
function OnInit()
end
-- Функция вызывается, когда пользователь нажимает кнопку "Остановить" или закрывает терминал.
function OnStop(s)
IsRun = false;
end
function main()
IsRun = true;
while IsRun do
-- Вызываем функцию из DLL
local value = luaTest.GetValue();
-- Если в полученном массиве есть хотя-бы один элемент со строковым индексом,
-- то все работает идеально.
-- Если же в полученном массиве все элементы имеют целочисленные индексы,
-- то возникает следующее:
-- Если оставить указанный ниже код, то через 1-2 секунды QUIK падает
if (type(value) == 'table') then
end
-- Если этого кода нет, то все работает, но при остановке скрипта в QUIK
-- (в поле "Ошибки выполнения скрипта") появляется сообщение "LuaVM closed with error"
--if (type(value) == 'table') then
--end
-- пауза
sleep(10)
end
end
Весь фокус заключается в том, что ошибка возникает не сразу (не при первом вызове функции из DLL-библиотеки), а после нескольких итераций. Кроме того, ошибка возникает именно в том случае, когда в полученном из DLL массиве все элементы имеют целочисленные индексы. Если же в полученном массиве есть хотя бы один элемент со строковым индексом, никакой ошибки не возникает.
При всем этом не понятно, где ошибка. Я, конечно, не исключаю, что это может быть ошибка в программном коде, который я привел. А если это не так, то в чем тогда дело? Может быть дело в "lua5.1.dll", которая поставляется вместе с торговым терминалом QUIK или в самом QUIK-е?
Самое обидное заключается в том, что эта ошибка проявилась, когда вся DLL-библиотека (для хранения и обмена данными между разными LUA-скриптами: простые типы, строки, любые вложенные массивы) была полностью написана и показала неплохие результаты с точки зрения производительности и потоко-безопасности.
Когда ошибка проявилась, для проведения теста и исключения возможной ошибки в коде DLL-библиотеки был создан самый простой проект в "Visual Studio 2015", а LUA-скрипт запускался из торгового термина QUIK без подключения к серверу.
Ссылка на архив с исходниками для тестирования: https://yadi.sk/d/4_WNa6WWWBpMbQ DLL-библиотека компилировалась в "Visual Studio 2015". LUA-скрипт запускался из торгового терминала QUIK.