А как получить тиковые данные?

 

Смотрел функции, в mql5 и нашел там возможность собственно перебирать себе бары. Но вот проблема, не нашел как перебирать Тики, то есть то что я могу получить экспортом данных в программе в виде csv, хотелось бы увидеть тут ...

Второй вопрос, как это сделать экспортно? Т.е. у меня C# на самом то деле, я думал что мог бы и в самой программе все сделать. Т.е. просто не делать в С# и сделать прямо тут ... В целом на распутье я немного, то есть у меня либо mql5 и написать на нем, либо C# если я получу экспорт нормальный (т.е. не в ручную). Выставлять ордера думаю в ручную все равно, по крайней мере значимо еще долго, не шибко доверяют программе автормату не глядя на график самостоятельно. Так что в целом выбор несмотря на судя по всему приемущества mql5 все еще остается... Хотя может и в C# это как то можно. Но вот такая вот у меня теперь проблема...

Как получить тики хоть каким то из способов, но программно не вводя все вечно вручную в экспортере?

 
Справка: функции по работе с тиками: 
 
Vladimir Karputov:
Справка: функции по работе с тиками: 

Вот прямо сразу, сразу вопрос:

>>> [in]  Количество запрашиваемых тиков. Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные последние тики, но не более 2000.

А если вдруг я не знаю (а я не знаю вообще) сколько их там? Ну вдруг их более 2000? Или это просто по минутам их перебирают поступательно?


p.s. И да, если было как то "еще" через API, было бы совсем здоровое.. Может можно терминалу запросы слать например? И получить XML/CSV? По большому счету сделать 

CopyTicksRange


Но только на выходе не массив, а файл с данными ... Ну или еще как, можно и по минутам перебирать, если столько запросов не проблема, чтобы за сутки собрать что было, если я например был без сети и вообще не делал ничего...
 

Есть ещё такой вариант: в терминале в окне "Обзор рынка" правый клик и меню "Символы". Перейти затем во вкладку "Тики".

Справка: Управление символами.

Обзор рынка - Торговые операции - MetaTrader 5
Обзор рынка - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь же можно смотреть спецификации контрактов и совершать торговые операции одним кликом. Просмотр котировок финансовых инструментов При двойном нажатии левой кнопкой мыши на одном из инструментов будет открыто...
 
Vladimir Karputov:

Есть ещё такой вариант: в терминале в окне "Обзор рынка" правый клик и меню "Символы". Перейти затем во вкладку "Тики".

Справка: Управление символами.

Вот вот, я как раз вручную сейчас делаю, потом в C# своем файл подбираю, а хочется чтобы C# сам файл "взял" уже готовый, запрос там какой отправил ...  GET/POST или DLL какой использовал или еще как-то ... А то вручную, конечно можно но немного муторновато оказывается со временем.

Пришла мысль, что можно написать "скрипт", который при запуске MT5 просто генерировал бы мне эти файлы, т.е. собирал их в кучу ну и я потом их получал. Но это тоже так себе вариант, т.к. следить за двумя языками и программами не самая лучшая альтернатива. Хочется все же ограничится одним языком ...

 
sergey087:

Вот вот, я как раз вручную сейчас делаю, потом в C# своем файл подбираю, а хочется чтобы C# сам файл "взял" уже готовый, запрос там какой отправил ...  GET/POST или DLL какой использовал или еще как-то ... А то вручную, конечно можно но немного муторновато оказывается со временем.

Пришла мысль, что можно написать "скрипт", который при запуске MT5 просто генерировал бы мне эти файлы, т.е. собирал их в кучу ну и я потом их получал. Но это тоже так себе вариант, т.к. следить за двумя языками и программами не самая лучшая альтернатива. Хочется все же ограничится одним языком ...

Можно написать класс со статическими методами на C#,  в метатрейдере - создать класс обертку для работы с ним, в таймере проверять команды от C# и возвращать результат через статические методы.
Можно так же сделать pipe соединение на C# и MQL (через импорт методов из WinAPI)
Можно просто в таймере в MQL читать запросы от C# через статические методы и далее формировать требуемый файл... 

 
Andrey Azatskiy:

Можно написать класс со статическими методами на C#,  в метатрейдере - создать класс обертку для работы с ним, в таймере проверять команды от C# и возвращать результат через статические методы.
Можно так же сделать pipe соединение на C# и MQL (через импорт методов из WinAPI)
Можно просто в таймере в MQL читать запросы от C# через статические методы и далее формировать требуемый файл... 

Спасибо, судя по всему решение вполне есть, хотя я правда понял самый минимум из того, что вы написали и буду пока разбираться ...

 
sergey087:

Спасибо, судя по всему решение вполне есть, хотя я правда понял самый минимум из того, что вы написали и буду пока разбираться ...

Там 3 возможных решения пришедших мне в голову. 

MQL5 - умеет импортировать статические методы публичных классов C# из указанной dll. по этому:

  • Сделать dll C# внутри dll создать статическое свойство к примеру 

static bool IsLoadTicks { get; private set; }

далее его можно будет вызвать в таймере из MQL5 как статический метод и в другой статический метод (только уже метод - который принимает параметры) - передать тиковые данные

  • Если C# - дельный процесс то можно воспользоваться pipe - как межпроцессное взаимодействие где то на форуме видел что кто то реализовывал подобную стыковку.
  • Можно как в первом способе просто передавать данные из C# в MQL5 - и в итоге средствами MQL5 - формировать файл с запрашиваемыми данными
 
    // Обработка каждого бара по отдельности
    for (int i = BarsTotalInput - 1; i >= 0; i--) {
        datetime barTime = iTime(Pair, Period_TF, i);
        datetime barTimeStart = barTime; Print(i," barTimeStart", barTimeStart);
        datetime barTimeEnd = barTime + PeriodSeconds(); Print(i," barTimeEnd", barTimeEnd);// Определение конца бара

        MqlTick ticks[];
        long ticksCopied = CopyTicksRange(Pair,ticks,COPY_TICKS_ALL,barTimeStart,barTimeEnd); // Копируем тики для диапазона времени

        if (ticksCopied < 0) {
            int errorCode = GetLastError();
            Print("Ошибка при копировании тиков для бара с временем ", TimeToString(barTime), ". Код ошибки: ", errorCode);
            ResetLastError();
            continue; // Переход к следующему бару
        } else if (ticksCopied == 0) {
            Print("Нет доступных тиков для бара с временем ", TimeToString(barTime));
            continue; // Переход к следующему бару
        }

а ведь есть же функции позволяющие копировать все тики заданного бара но почему то у меня не получается 

2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) 2 barTimeStart2024.08.30 15:00:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) 2 barTimeEnd2024.08.30 16:00:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) Нет доступных тиков для бара с временем 2024.08.30 15:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) 1 barTimeStart2024.08.30 16:00:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) 1 barTimeEnd2024.08.30 17:00:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) Нет доступных тиков для бара с временем 2024.08.30 16:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) 0 barTimeStart2024.08.30 17:00:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) 0 barTimeEnd2024.08.30 18:00:00
2024.08.30 17:20:22.360 O_v2 (EURUSD,H1) Нет доступных тиков для бара с временем 2024.08.30 17:00

Может кто то подсказать почему нельзя скопировать все тики хотя бы 3 последних баров и почему они не копируются? 
 
int  CopyTicks(
   string           symbol_name,           // имя символа
   MqlTick&         ticks_array[],         // массив для приёма тиков
   uint             flags=COPY_TICKS_ALL,  // флаг, определяющий тип получаемых тиков
   ulong            from=0,                // дата, начиная с которой запрашиваются тики
   uint             count=0                // количество тиков, которые необходимо получить
   );

и как все получить тики одного бара если у меня есть только дата открытия бара и дата закрытия бара)) а вот тиков и их количество я не знаю как указать в требуемом баре?

long ticksCopied = CopyTicksRange(Pair, ticks, COPY_TICKS_ALL, barTimeStart, barTimeEnd);

так что ли  - оно не работает