<commit_before>﻿// Copyright (C) 2015 <NAME>

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using QuikSharp.DataStructures;
using QuikSharp.DataStructures.Transaction;

namespace QuikSharp {

    /// <summary>
    /// Функции взаимодействия скрипта Lua и Рабочего места QUIK
    /// getDepo - функция для получения информации по бумажным лимитам 
    /// getMoney - функция для получения информации по денежным лимитам 
    /// getMoneyEx - функция для получения информации по денежным лимитам указанного типа 
    /// getFuturesLimit - функция для получения информации по фьючерсным лимитам 
    /// getFuturesHolding - функция для получения информации по фьючерсным позициям 
    /// getParamEx - функция для получения значений Таблицы текущих значений параметров 
    /// getTradeDate - функция для получения даты торговой сессии 
    /// sendTransaction - функция для работы с заявками 
    /// CulcBuySell - функция для расчета максимально возможного количества лотов в заявке 
    /// getPortfolioInfo - функция для получения значений параметров таблицы «Клиентский портфель» 
    /// getPortfolioInfoEx - функция для получения значений параметров таблицы «Клиентский портфель» с учетом вида лимита 
    /// getBuySellInfo - функция для получения параметров таблицы «Купить/Продать» 
    /// getBuySellInfoEx - функция для получения параметров (включая вид лимита) таблицы «Купить/Продать» 
    /// </summary>
    public interface ITradingFunctions : IQuikService {

        /// <summary>
        /// Функция для получения информации по бумажным лимитам
        /// </summary>
        Task<DepoLimit> GetDepo(string clientCode, string firmId, string secCode, string account);

        /// <summary>
        /// Возвращает список записей из таблицы 'Лимиты по бумагам'.
        /// </summary>
        Task<List<DepoLimitEx>> GetDepoLimits();

        /// <summary>
        /// Возвращает список записей из таблицы 'Лимиты по бумагам', отфильтрованных по коду инструмента.
        /// </summary>
        /// <param name="secCode">Код инструментаю</param>
        /// <returns></returns>
        Task<List<DepoLimitEx>> GetDepoLimits(string secCode);

        /// <summary>
        /// Функция для получения информации по денежным лимитам
        /// </summary>
        /// 
        Task<MoneyLimit> GetMoney(string clientCode, string firmId, string tag, string currCode);
        /// <summary>
        ///  функция для получения информации по денежным лимитам указанного типа
        /// </summary>
        Task<MoneyLimitEx> GetMoneyEx(string firmId, string clientCode, string tag, string currCode, int limitKind);
        ///// <summary>
        /////  функция для получения информации по фьючерсным лимитам
        ///// </summary>
        //Task<string> getFuturesLimit();
        ///// <summary>
        /////  функция для получения информации по фьючерсным позициям
        ///// </summary>
        Task<FuturesClientHolding> GetFuturesHolding(string firmId, string accId,string secCode,int posType);
       
        /// <summary>
        /// функция для получения значений Таблицы текущих значений параметров
        /// </summary>
        /// <param name="classCode"></param>
        /// <param name="secCode"></param>
        /// <param name="paramName"></param>
        /// <returns></returns>
        Task<ParamTable> GetParamEx(string classCode, string secCode, string paramName);

        ///// <summary>
        /////  функция для получения информации по инструменту
        ///// </summary>
        //Task<string> getSecurityInfo();
        ///// <summary>
        /////  функция для получения даты торговой сессии
        ///// </summary>
        //Task<string> getTradeDate();

        /// <summary>
        /// Функция отправляет транзакцию на сервер QUIK и сохраняет ее в словаре транзакций
        /// с идентификатором trans_id. Возвращает идентификатор
        /// транзакции trans_id (позитивное число) в случае успеха или индентификатор,
        /// умноженный на -1 (-trans_id) (негативное число) в случае ошибки. Также в случае 
        /// ошибки функция созраняет текст ошибки в свойтво ErrorMessage транзакции.
        /// </summary>
        Task<long> SendTransaction(Transaction transaction);

        ///// <summary>
        /////  функция для расчета максимально возможного количества лотов в заявке
        ///// </summary>
        //Task<string> CulcBuySell();
        ///// <summary>
        /////  функция для получения значений параметров таблицы «Клиентский портфель»
        ///// </summary>
        //Task<string> getPortfolioInfo();
        ///// <summary>
        /////  функция для получения значений параметров таблицы «Клиентский портфель» с учетом вида лимита
        ///// </summary>
        //Task<string> getPortfolioInfoEx();
        ///// <summary>
        /////  функция для получения параметров таблицы «Купить/Продать»
        ///// </summary>
        //Task<string> getBuySellInfo();
        ///// <summary>
        /////  функция для получения параметров (включая вид лимита) таблицы «Купить/Продать»
        ///// </summary>
        //Task<string> getBuySellInfoEx();


    }

    /// <summary>
    /// Функции взаимодействия скрипта Lua и Рабочего места QUIK
    /// </summary>
    public class TradingFunctions : ITradingFunctions {
        public TradingFunctions(int port) { QuikService = QuikService.Create(port); }

        public QuikService QuikService { get; private set; }


        //public async Task<string[]> GetClassesList() {
        //    var response = await QuikService.Send<Message<string>>(
        //        (new Message<string>("", "getClassesList")));
        //    return response.Data == null
        //        ? new string[0]
        //        : response.Data.TrimEnd(',').Split(new[] { "," }, StringSplitOptions.None);
        //}

        //public async Task<ClassInfo> GetClassInfo(string classID) {
        //    var response = await QuikService.Send<Message<ClassInfo>>(
        //        (new Message<string>(classID, "getClassInfo")));
        //    return response.Data;
        //}

        //public async Task<SecurityInfo> GetSecurityInfo(string classCode, string secCode) {
        //    var response = await QuikService.Send<Message<SecurityInfo>>(
        //        (new Message<string>(classCode + "|" + secCode, "getSecurityInfo")));
        //    return response.Data;
        //}

        //public async Task<SecurityInfo> GetSecurityInfo(ISecurity security) {
        //    return await GetSecurityInfo(security.ClassCode, security.SecCode);
        //}

        //public async Task<string[]> GetClassSecurities(string classID) {
        //    var response = await QuikService.Send<Message<string>>(
        //        (new Message<string>(classID, "getClassSecurities")));
        //    return response.Data == null
        //        ? new string[0]
        //        : response.Data.TrimEnd(',').Split(new[] { "," }, StringSplitOptions.None);
        //}
        public async Task<DepoLimit> GetDepo(string clientCode, string firmId, string secCode, string account) 
        {
            var response = await QuikService.Send<Message<DepoLimit>>(
                    (new Message<string>(clientCode + "|" + firmId + "|" + secCode + "|" + account, "getDepo"))).ConfigureAwait (false);
            return response.Data;
        }

        /// <summary>
        /// Возвращает список всех записей из таблицы 'Лимиты по бумагам'.
        /// </summary>
        public async Task<List<DepoLimitEx>> GetDepoLimits()
        {
            var message = new Message<string>("", "get_depo_limits");
            Message<List<DepoLimitEx>> response = await QuikService.Send<Message<List<DepoLimitEx>>>(message).ConfigureAwait (false);
            return response.Data;
        }

        /// <summary>
        /// Возвращает список записей из таблицы 'Лимиты по бумагам', отфильтрованных по коду инструмента.
        /// </summary>
        public async Task<List<DepoLimitEx>> GetDepoLimits(string secCode)
        {
            var message = new Message<string>(secCode, "get_depo_limits");
            Message<List<DepoLimitEx>> response = await QuikService.Send<Message<List<DepoLimitEx>>>(message).ConfigureAwait (false);
            return response.Data;
        }

        public Task<MoneyLimit> GetMoney(string clientCode, string firmId, string tag, string currCode) { throw new NotImplementedException(); }
        public Task<MoneyLimitEx> GetMoneyEx(string firmId, string clientCode, string tag, string currCode, int limitKind) { throw new NotImplementedException(); }
      
        
        public async Task<ParamTable> GetParamEx(string classCode, string secCode, string paramName) 
        {
            var response = await QuikService.Send<Message<ParamTable>>(
                    (new Message<string>(classCode + "|" + secCode + "|" + paramName, "getParamEx"))).ConfigureAwait (false);
                return response.Data;            
        }

        public async Task<FuturesClientHolding> GetFuturesHolding(string firmId, string accId, string secCode, int posType)
        {
            var response = await QuikService.Send<Message<FuturesClientHolding>>(
                    (new Message<string>(firmId + "|" + accId + "|" + secCode + "|" + posType, "getFuturesHolding"))).ConfigureAwait (false);
            
            return response.Data;
        }




        /*public async Task<ClassInfo> GetClassInfo(string classID) {
            var response = await QuikService.Send<Message<ClassInfo>>(
                (new Message<string>(classID, "getClassInfo")));
            return response.Data;
        }*/


        /// <summary>
        /// Send a single transaction to Quik server
        /// </summary>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public async Task<long> SendTransaction(Transaction transaction) {
            Trace.Assert(!transaction.TRANS_ID.HasValue, "TRANS_ID should be assigned automatically in SendTransaction functions");

            transaction.TRANS_ID = QuikService.GetNewUniqueId();

            //    Console.WriteLine("Trans Id from function = {0}", transaction.TRANS_ID);

            Trace.Assert(transaction.CLIENT_CODE == null,
                "Currently we use Comment to store correlation id for a transaction, " +<commit_msg>Add OptionBoard Function<commit_after>﻿// Copyright (C) 2015 <NAME>

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using QuikSharp.DataStructures;
using QuikSharp.DataStructures.Transaction;

namespace QuikSharp {

    /// <summary>
    /// Функции взаимодействия скрипта Lua и Рабочего места QUIK
    /// getDepo - функция для получения информации по бумажным лимитам 
    /// getMoney - функция для получения информации по денежным лимитам 
    /// getMoneyEx - функция для получения информации по денежным лимитам указанного типа 
    /// getFuturesLimit - функция для получения информации по фьючерсным лимитам 
    /// getFuturesHolding - функция для получения информации по фьючерсным позициям 
    /// getParamEx - функция для получения значений Таблицы текущих значений параметров 
    /// getTradeDate - функция для получения даты торговой сессии 
    /// sendTransaction - функция для работы с заявками 
    /// CulcBuySell - функция для расчета максимально возможного количества лотов в заявке 
    /// getPortfolioInfo - функция для получения значений параметров таблицы «Клиентский портфель» 
    /// getPortfolioInfoEx - функция для получения значений параметров таблицы «Клиентский портфель» с учетом вида лимита 
    /// getBuySellInfo - функция для получения параметров таблицы «Купить/Продать» 
    /// getBuySellInfoEx - функция для получения параметров (включая вид лимита) таблицы «Купить/Продать» 
    /// </summary>
    public interface ITradingFunctions : IQuikService {

        /// <summary>
        /// Функция для получения информации по бумажным лимитам
        /// </summary>
        Task<DepoLimit> GetDepo(string clientCode, string firmId, string secCode, string account);

        /// <summary>
        /// Возвращает список записей из таблицы 'Лимиты по бумагам'.
        /// </summary>
        Task<List<DepoLimitEx>> GetDepoLimits();

        /// <summary>
        /// Возвращает список записей из таблицы 'Лимиты по бумагам', отфильтрованных по коду инструмента.
        /// </summary>
        /// <param name="secCode">Код инструментаю</param>
        /// <returns></returns>
        Task<List<DepoLimitEx>> GetDepoLimits(string secCode);

        /// <summary>
        /// Функция для получения информации по денежным лимитам
        /// </summary>
        /// 
        Task<MoneyLimit> GetMoney(string clientCode, string firmId, string tag, string currCode);
        /// <summary>
        ///  функция для получения информации по денежным лимитам указанного типа
        /// </summary>
        Task<MoneyLimitEx> GetMoneyEx(string firmId, string clientCode, string tag, string currCode, int limitKind);
        ///// <summary>
        /////  функция для получения информации по фьючерсным лимитам
        ///// </summary>
        //Task<string> getFuturesLimit();
        ///// <summary>
        /////  функция для получения информации по фьючерсным позициям
        ///// </summary>
        Task<FuturesClientHolding> GetFuturesHolding(string firmId, string accId,string secCode,int posType);
       
         /// <summary>
        /// Функция получения доски опционов
        /// </summary>
        /// <param name="classCode"></param>
        /// <param name="secCode"></param>
        /// <returns></returns>
        Task<List<OptionBoard>> GetOptionBoard(string classCode, string secCode);
        /// <summary>
        /// функция для получения значений Таблицы текущих значений параметров
        /// </summary>
        /// <param name="classCode"></param>
        /// <param name="secCode"></param>
        /// <param name="paramName"></param>
        /// <returns></returns>
        Task<ParamTable> GetParamEx(string classCode, string secCode, string paramName);

        ///// <summary>
        /////  функция для получения информации по инструменту
        ///// </summary>
        //Task<string> getSecurityInfo();
        ///// <summary>
        /////  функция для получения даты торговой сессии
        ///// </summary>
        //Task<string> getTradeDate();

        /// <summary>
        /// Функция отправляет транзакцию на сервер QUIK и сохраняет ее в словаре транзакций
        /// с идентификатором trans_id. Возвращает идентификатор
        /// транзакции trans_id (позитивное число) в случае успеха или индентификатор,
        /// умноженный на -1 (-trans_id) (негативное число) в случае ошибки. Также в случае 
        /// ошибки функция созраняет текст ошибки в свойтво ErrorMessage транзакции.
        /// </summary>
        Task<long> SendTransaction(Transaction transaction);

        ///// <summary>
        /////  функция для расчета максимально возможного количества лотов в заявке
        ///// </summary>
        //Task<string> CulcBuySell();
        ///// <summary>
        /////  функция для получения значений параметров таблицы «Клиентский портфель»
        ///// </summary>
        //Task<string> getPortfolioInfo();
        ///// <summary>
        /////  функция для получения значений параметров таблицы «Клиентский портфель» с учетом вида лимита
        ///// </summary>
        //Task<string> getPortfolioInfoEx();
        ///// <summary>
        /////  функция для получения параметров таблицы «Купить/Продать»
        ///// </summary>
        //Task<string> getBuySellInfo();
        ///// <summary>
        /////  функция для получения параметров (включая вид лимита) таблицы «Купить/Продать»
        ///// </summary>
        //Task<string> getBuySellInfoEx();


    }

    /// <summary>
    /// Функции взаимодействия скрипта Lua и Рабочего места QUIK
    /// </summary>
    public class TradingFunctions : ITradingFunctions {
        public TradingFunctions(int port) { QuikService = QuikService.Create(port); }

        public QuikService QuikService { get; private set; }


        //public async Task<string[]> GetClassesList() {
        //    var response = await QuikService.Send<Message<string>>(
        //        (new Message<string>("", "getClassesList")));
        //    return response.Data == null
        //        ? new string[0]
        //        : response.Data.TrimEnd(',').Split(new[] { "," }, StringSplitOptions.None);
        //}

        //public async Task<ClassInfo> GetClassInfo(string classID) {
        //    var response = await QuikService.Send<Message<ClassInfo>>(
        //        (new Message<string>(classID, "getClassInfo")));
        //    return response.Data;
        //}

        //public async Task<SecurityInfo> GetSecurityInfo(string classCode, string secCode) {
        //    var response = await QuikService.Send<Message<SecurityInfo>>(
        //        (new Message<string>(classCode + "|" + secCode, "getSecurityInfo")));
        //    return response.Data;
        //}

        //public async Task<SecurityInfo> GetSecurityInfo(ISecurity security) {
        //    return await GetSecurityInfo(security.ClassCode, security.SecCode);
        //}

        //public async Task<string[]> GetClassSecurities(string classID) {
        //    var response = await QuikService.Send<Message<string>>(
        //        (new Message<string>(classID, "getClassSecurities")));
        //    return response.Data == null
        //        ? new string[0]
        //        : response.Data.TrimEnd(',').Split(new[] { "," }, StringSplitOptions.None);
        //}
        public async Task<DepoLimit> GetDepo(string clientCode, string firmId, string secCode, string account) 
        {
            var response = await QuikService.Send<Message<DepoLimit>>(
                    (new Message<string>(clientCode + "|" + firmId + "|" + secCode + "|" + account, "getDepo"))).ConfigureAwait (false);
            return response.Data;
        }

        /// <summary>
        /// Возвращает список всех записей из таблицы 'Лимиты по бумагам'.
        /// </summary>
        public async Task<List<DepoLimitEx>> GetDepoLimits()
        {
            var message = new Message<string>("", "get_depo_limits");
            Message<List<DepoLimitEx>> response = await QuikService.Send<Message<List<DepoLimitEx>>>(message).ConfigureAwait (false);
            return response.Data;
        }

        /// <summary>
        /// Возвращает список записей из таблицы 'Лимиты по бумагам', отфильтрованных по коду инструмента.
        /// </summary>
        public async Task<List<DepoLimitEx>> GetDepoLimits(string secCode)
        {
            var message = new Message<string>(secCode, "get_depo_limits");
            Message<List<DepoLimitEx>> response = await QuikService.Send<Message<List<DepoLimitEx>>>(message).ConfigureAwait (false);
            return response.Data;
        }

        public Task<MoneyLimit> GetMoney(string clientCode, string firmId, string tag, string currCode) { throw new NotImplementedException(); }
        public Task<MoneyLimitEx> GetMoneyEx(string firmId, string clientCode, string tag, string currCode, int limitKind) { throw new NotImplementedException(); }
      
        
        public async Task<ParamTable> GetParamEx(string classCode, string secCode, string paramName) 
        {
            var response = await QuikService.Send<Message<ParamTable>>(
                    (new Message<string>(classCode + "|" + secCode + "|" + paramName, "getParamEx"))).ConfigureAwait (false);
                return response.Data;            
        }

        public async Task<FuturesClientHolding> GetFuturesHolding(string firmId, string accId, string secCode, int posType)
        {
            var response = await QuikService.Send<Message<FuturesClientHolding>>(
                    (new Message<string>(firmId + "|" + accId + "|" + secCode + "|" + posType, "getFuturesHolding"))).ConfigureAwait (false);
            
            return response.Data;
        }
        public async Task<List<OptionBoard>> GetOptionBoard(string classCode,  string secCode)
        {
            var message = new Message<string>(classCode + "|" + secCode, "getOptionBoard");
            Message<List<OptionBoard>> response =
                await QuikService.Send<Message<List<OptionBoard>>>(message).ConfigureAwait(false);
            return response.Data;
        
        }




        /*public async Task<ClassInfo> GetClassInfo(string classID) {
            var response = await QuikService.Send<Message<ClassInfo>>(
                (new Message<string>(classID, "getClassInfo")));
            return response.Data;
        }*/


        /// <summary>
        /// Send a single transaction to Quik server
        /// </summary>
        /// <param name="transaction"></param>
        /// <returns></returns>
        public async Task<long> SendTransaction(Transaction transaction) {
            Trace.Assert(!transaction.TRANS_ID.HasValue, "TRANS_ID should be assigned automatically in SendTransaction functions");

            transaction.TRANS_ID = QuikService.GetNewUniqueId();

            //    Console.WriteLine("Trans Id from function = {0}", transaction.TRANS_ID);

            Trace.Assert(transaction.CLIENT_CODE == null,
                "Currently we use Comment to store correlation id for a transaction, " +
{'fraction_non_alphanumeric': 0.12014512302897809, 'fraction_numerical': 0.0007442206614261129, 'mean_word_length': 2.3132994298042844, 'pattern_counts': {'":': 0, '<': 279, '<?xml version=': 0, '>': 279, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2007270', 'n_tokens_mistral': 6465, 'n_tokens_neox': 6878, 'n_words': 1553}