суббота, 27 июня 2015 г.

Получаем данные из Excell для использования в Wealth-lab, Ninjatrader и так далее.


Есть задачи, когда необходимо читать внешние данные для работы роботов или индикаторов. Например, можно в Excel лист занести уровни, от которых будет торговать робот. Либо список тикеров, по которым необходимо собирать информацию.



Для чтения данных из Excel нам потребуется библиотека Microsoft.Office.Interop.Excel.dll. В моей Windows7 она расположилась в папке:

C:\Program Files (x86)\Microsoft Office\Office15\DCF

В проект необходимо добавить ссылку на эту библиотеку. Код чтения данных простой:


//Читаем их Excel данные в массив
List getParamsFromExcel(string filePath)
{
    //С какой строки начинаем читать данные
    int start_from_row = 2;
    //Индекс колонки с Тикером
    int symbol_index = 1;
    //Индекс колонки с типом ордера
    int order_type_index = 2;
    //Индекс колонки с ценой входа
    int entry_price_index = 4;
    //Индекс колонки с ценой стопа
    int stop_price_index = 5;
    //Индекс колонки с временем входа
    int entry_time_index = 7;
    int current_index = start_from_row;

    //Текущий символ графика
    string read_symbol = Bars.Symbol;
    //Текущий считанный из Excel символ
    string current_symbol;

    //Список параметров считанный из Excell
    List result;
    result = new List();

    //Переменная Excel приложение
    Excel.Application xlApp;
    //Переменная рабочая книга
    Excel.Workbook xlWorkBook;
    //Переменная рабочий лист
    Excel.Worksheet xlWorkSheet;
    //Переменная диапазон
    Excel.Range range;

    //Инициализируем переменные
    xlApp = new Excel.Application();
    xlWorkBook = xlApp.Workbooks.Open(filePath);
    xlWorkSheet = xlWorkBook.Worksheets.get_Item(1);

    range = xlWorkSheet.UsedRange;

    //Считываем тикер из Excel
    current_symbol = (string)(range.Cells[current_index, symbol_index] as Excel.Range).Value2;
    //Читаем тикеры, пока не наткнемся на пустую строку
    while(current_symbol != null)
    {
        //Если считанный тикер совпадает с тикером графика, на котором запустили робота
        if(read_symbol == current_symbol)
        {
            //Читаем и добавляем параметры ордера
            result.Add(new OrderParams
            {
                ePrice = Convert.ToDouble((range.Cells[current_index, entry_price_index] as Excel.Range).Value2),
                sPrice = Convert.ToDouble((range.Cells[current_index, stop_price_index] as Excel.Range).Value2),
                eTime = DateTime.FromOADate((range.Cells[current_index, entry_time_index] as Excel.Range).Value2),
                pType = ((string)(range.Cells[current_index, order_type_index] as Excel.Range).Value2 == "Short" ? PositionType.Short : PositionType.Long)
            });
        }

        current_index++;
        //Считываем очередной тикер
        current_symbol = (string)(range.Cells[current_index, symbol_index] as Excel.Range).Value2;                
    }

    //Закрываем рабочую книгу
    xlWorkBook.Close(true, null, null);
    //Выходим из приложения
    xlApp.Quit();

    //Уничтожаем созданные объекты
    releaseObject(xlWorkSheet);
    releaseObject(xlWorkBook);
    releaseObject(xlApp);

    return result;
}

//Уничтожаем переданный объект
private void releaseObject(object obj)
{
    try
    {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
        obj = null;
    }
    catch (Exception ex)
    {
        obj = null;                
    }
    finally
    {
        GC.Collect();
    }
} 

Все банально и просто. И можно использовать для различных целей

2 комментария:

  1. Артем Харченко10 октября 2017 г., 1:22

    Доброго времени суток. Подскажите будьте добры, расчеты уровней и зон для торговли фьючерсами я произвожу в екселе, возможно ли их переносить в нинзю посредством Вашего кода?

    ОтветитьУдалить
  2. Добрый день.
    Конечно можете. Обратите внимание, в примере показано как считать данные и записать их в переменные. ePrice, например, sPrice и так далее. Далее полученные значения вы можете использовать для выставления ордеров.

    ОтветитьУдалить