Блог им. Dzam

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

    • 27 июня 2015, 14:43
    • |
    • Dzam
  • Еще
Получаем данные из 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();
    }
} 

Все банально и просто. И можно использовать для различных целей
Оригинал статьи. 
★30
19 комментариев
Копипаст. Сто пудов.
Вестников, это код из моей недавней работы.
avatar
Dzam, вы сможете написать приблуду к квику чтобы можно было с чарта из ниндзи в него заявки отправлять?
А стакан квиковский в ниндзю трнслировать сможете?

avatar
Growex, Можно. Свяжитесь со мной через контакты, указанные в профиле. Обсудим.
avatar
TRADERS GLOBUS, Ничего не прошу. Совершенно бесплатно делюсь информацией. Нужно — берем, не нужно — мимо идем. :)
avatar
Dzam, да ладно. Не обижайся. Молодец.
TRADERS GLOBUS, Я сам долго искал эту информацию. А тут и для меня будет доступна всегда и может еще кому понадобится.
avatar
Dzam, Спасибо тебе огромное, есть немного забытый проект для которого все расчеты ведутся в Excel, теперь благодаря твоему посту смогу соединить C# и Excel:-)
Твой пост сэкономил мне кучу времени!
avatar
Как это поможет в работе?
avatar
margin, Была задача: брать данные из Excel и по этим данным открывать сделки.
avatar
Dzam, любое действие должно иметь цель и смысл. С какой целью это делать и каков результат?
avatar
Dzam, спасибо за работу — уверен, многим пригодится! Вроде понятно, ещё и с комментариями к коду.
Правда сам перешёл на LibreOffice, поэтому как руки дойдут, придётся изобретать код для Либры. Из-за лени приходится переводить в текстовый файл, и читать из него.
avatar
Yuri, на неделе поищу информацию и выложу описание и код, как читать ods файлы. Самому интересно стало. Так как тоже в основном на OpenOffice
avatar
Если ваш робот требует данных о каких-то там уровнях из экселя то это плохой робот
avatar
Если ваш робот не выдает сигналы в режиме online для скальпинга и требует данные из Excel, нет ничего плохого. Подумываю использовать встроенный в Excel редактор Visual Basic для простых расчетов.
Если кроме Wealth-lab, Ninjatrader понадобятся платформы, можно взять их спокойно здесь: http://getanyplatform.com

теги блога Dzam

....все тэги



UPDONW
Новый дизайн