Для изменения размера нажмите или перетащите
S#.MatLab

S#.MatLab предоставляет возможность использовать в своих скриптах .NET классы, в том числе и S#.

Интеграция между S#.MatLab и S# позволяет создавать торговых роботов (или аналитические программы, оперирующие данными напрямую с торговых площадок) в единой среде языка M.

Предварительные условия

Связь MatLab и Quik

  1. В качестве демонстрации в дистрибутиве находится скрипт в папке Samples\MatLab, которой показывает, как можно в S#.MatLab получать данные из терминала Quik, а так же отправлять в него заявки, осуществляя тем самым полный цикл автоматической торговли.

  2. Необходимо создать шлюз IConnector к торговой системе (в данном случае был выбран QuikTrader), и передать его в MatLabConnector. Последний нужен для того, чтобы подписаться на события получения маркет-данных (напрямую к событиям IConnector в S#.MatLab подписаться невозможно):

    trader = StockSharp.MatLab.MatLabConnector(StockSharp.Quik.QuikTrader);
    
    addlistener(trader, 'Connected', @traderConnected);
    addlistener(trader, 'NewSecurities', @newSecurities);
    addlistener(trader, 'SecuritiesChanged', @securitiesChanged);
    addlistener(trader, 'NewPortfolios', @newPortfolios);
    addlistener(trader, 'NewOrders', @newOrders);
    addlistener(trader, 'OrdersChanged', @ordersChanged);
    addlistener(trader, 'NewMyTrades', @newMyTrades);
    addlistener(trader, 'NewPositions', @newPositions);
    addlistener(trader, 'PositionsChanged', @positionsChanged);
    addlistener(trader, 'Error', @processError);
    addlistener(trader, 'ConnectionError', @processError);
  3. Обработка основных событий IConnector:

    function traderConnected(sender, args)
    global trader;
    StartExport(trader.RealTrader);
    
    function processError(sender, args)
    disp(char(args.Error.message))
    
    function newSecurities(sender, args)
    global hGui;
    
    set(hGui.selectSecurityBtn, 'Enable', 'on')
    
    data = cellstr(get(hGui.secListBox, 'String'));
    
    for i = 1 : args.Securities.Length
        data = [data; char(args.Securities(i).Id)];
    end
    
    set(hGui.secListBox, 'string', data);
  4. Запрос получения обновлений (сделки, стаканы) по выбранному инструменту:

    function selectSecurityBtn_Callback(hObject, eventdata, handles)
    securityIds = get(handles.secListBox, 'String');
    selectedSecurityId = securityIds{get(handles.secListBox, 'Value')};
    
    global trader;
    global selectedSecurity;
    
    securities = NET.invokeGenericMethod('System.Linq.Enumerable', 'ToArray', ...
    {'StockSharp.BusinessEntities.Security'}, trader.RealTrader.Securities);
    
    for i = 1 : securities.Length
        security = securities(i);
    
        if (strcmp(char(security.Id), selectedSecurityId) == 1)
            selectedSecurity = security;
            RegisterSecurity(trader.RealTrader, security);
            RegisterTrades(trader.RealTrader, security);
            RegisterMarketDepth(trader.RealTrader, security);
            set(handles.newOrderBtn, 'Enable', 'on')
            break;
        end
    end
  5. Отправка заявки на регистрацию:

    function newOrderBtn_Callback(hObject, eventdata, handles)
    global trader;
    global selectedSecurity;
    
    order = StockSharp.BusinessEntities.Order();
    order.Security = selectedSecurity;
    order.Price = str2double(get(handles.priceTxt, 'String'));
    order.Volume = str2double(get(handles.volumeTxt, 'String'));
    
    if (get(handles.isBuyChBox, 'Value') == 1)
        order.Direction = StockSharp.BusinessEntities.OrderDirections.Buy;
    else
        order.Direction = StockSharp.BusinessEntities.OrderDirections.Sell;
    end
    
    portfolios = NET.invokeGenericMethod('System.Linq.Enumerable', 'ToArray', ...
    {'StockSharp.BusinessEntities.Portfolio'}, trader.RealTrader.Portfolios);
    
    portfolioNames = get(handles.portfoliosCombo, 'String');
    portfolioName = portfolioNames{get(handles.portfoliosCombo, 'Value')};
    
    for i = 1 : portfolios.Length
        portfolio = portfolios(i);
    
        if (strcmp(char(portfolio.Name), portfolioName) == 1)
            order.Portfolio = portfolio;
            break;
        end
    end
    
    RegisterOrder(trader.RealTrader, order);
  6. В итоге должно получиться следующее:

    matlab
См. также

Другие ресурсы