Обсуждение статьи "Применение OpenCL для тестирования свечных моделей"

 

Опубликована статья Применение OpenCL для тестирования свечных моделей:

В данной статье мы рассмотрим алгоритм реализации тестера свечных моделей на языке OpenCL в режиме "OHLC на M1". А также сравним его быстродействие cо встроенным тестером стратегий, запущенным в режиме быстрой и медленной оптимизации.

Для того, чтобы убедиться, что реализация тестера на OpenCL работает правильно, нужно на что-то опираться. Поэтому, для начала мы напишем эксперт на MQL5, а затем будем сравнивать результаты его тестирования и оптимизации штатным тестером с соответствующими результатами тестера, реализованного на OpenCL.

Объектом тестирования будет простой эксперт, который торгует по следующим свечным моделям (далее по тексту - паттернам).
  • Медвежий пин бар
  • Бычий пин бар
  • Медвежье поглощение
  • Бычье поглощение

Стратегия будет простая:

  • Медвежий пин бар или медвежье поглощение  — продажа
  • Бычий пин бар или бычье поглощение  — покупка
  • Количество одновременно открытых позиций  — не ограничено
  • Максимальное время удержания открытой позиции  — ограничено, задаётся пользователем
  • Уровни Take Profit и Stop Loss фиксированные, задаются пользователем

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

Условия обнаружения паттернов будут следующие:

Пин бар

Автор: Serhii Shevchuk

 

Автор, Спасибо за статью! Думаю, Вы неслучайно выбрали именно такую ТС для демонстрации, т.к. она параллелится великолепно. Однако, это очень узкая ниша.

В статье Вы очень сильно отошли от универсальности в сторону частности. Понятно, что цель продемонстрировать потенциальные возможности. Но применить под себя мало что получится.

Хотелось бы видеть примеры перевода разного MQL-кода в OpenCL-код. Возможно, это содержится в статьях, ссылки на которые Вы привели в начале своей статьи. 

 
Кастомные символы могут помочь избавиться от свопов и комиссий при сравнительном анализе результатов тестеров.
 
А файл OCLDefines.mqh отсутствует только у меня? :-)
 
Denis Kirichenko:
А файл OCLDefines.mqh отсутствует только у меня? :-)

Спасибо за внимательность) Исправим, но я так понимаю, уже с понедельника. Привожу исходник:

//+------------------------------------------------------------------+
//| defines                                                          |
//+------------------------------------------------------------------+
//--- установка ошибки выполнения
#define SET_ERR(c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- установка ошибки выполнения с передачей имени функции и номера строки через параметр
#define SET_ERRx(c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=::GetLastError(); m_last_error.comment=c;} while(0)
//--- установка пользовательской ошибки
#define SET_UERR(err,c) do {m_last_error.function = __FUNCTION__; \
      m_last_error.line =__LINE__; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- установка пользовательской ошибки с передачей имени функции и номера строки через параметр
#define SET_UERRx(err,c,f,l) do {m_last_error.function = f; m_last_error.line = l; \
      m_last_error.code=ERR_USER_ERROR_FIRST+err; m_last_error.comment=c;} while(0)
//--- вызовы функций для работы с OpenCL
#define _BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags) \
      if(BufferFromArray(buffer_index,data,data_array_offset,data_array_count,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferCreate(buffer_index,size_in_bytes,flags) \
      if(BufferCreate(buffer_index,size_in_bytes,flags,__FUNCTION__,__LINE__)==false) return false
#define _BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferRead(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count) \
      if(BufferWrite(buffer_index,data,cl_buffer_offset,data_array_offset,data_array_count,__FUNCTION__,__LINE__)==false) return false
#define _Execute(kernel_index,work_dim,work_offset,work_size) \
      if(Execute(kernel_index,work_dim,work_offset,work_size,__FUNCTION__,__LINE__)==false) return false
#define _SetArgument(kernel_index,arg_index,value) \
      if(SetArgument(kernel_index,arg_index,value,__FUNCTION__,__LINE__)==false) return false
#define _SetArgumentBuffer(kernel_index,arg_index,buffer_index) \
      if(SetArgumentBuffer(kernel_index,arg_index,buffer_index,__FUNCTION__,__LINE__)==false) return false
#define _KernelCreate(k,src) \
      if(KernelCreate(k,src,__FUNCTION__,__LINE__)==false) break

//--- Пользовательские ошибки  
#define UERR_NONE                0     // Нет ошибки
#define UERR_NO_OCL              1     // Объект COpenCL не существует
#define UERR_GET_MEMORY_SIZE     2     // Ошибка получения размера памяти
#define UERR_KERNEL_CREATE       3     // Ошибка создания кернела
#define UERR_SET_BUF_COUNT       4     // Ошибка установки количества буферов
#define UERR_DOUBLE_NOT_SUPP     5     // Не поддерживается double
#define UERR_BUFFER_CREATE       6     // Ошибка создания буфера
#define UERR_BUFFER_FROM_ARRAY   7     // Ошибка создания буфера из массива
#define UERR_BUFFER_READ         8     // Ошибка чтения буфера
#define UERR_BUFFER_WRITE        9     // Ошибка записи буфера
#define UERR_SET_ARGUMENT        10    // Ошибка установки аргумента
#define UERR_SET_ARGUMENT_BUFFER 11    // Ошибка установки буфера в качестве аргумента
#define UERR_EXECUTE             12    // Ошибка выполнения кернела
#define UERR_NO_ENOUGH_MEM       13    // Нет свободной памяти

//--- Ошибки тестера
#define UERR_TESTER_ERROR_FIRST  256
#define SET_UERRt(err,c)         SET_UERR(UERR_TESTER_ERROR_FIRST+err,c)
//+------------------------------------------------------------------+
 
fxsaber:
Кастомные символы могут помочь избавиться от свопов и комиссий при сравнительном анализе результатов тестеров.

Да, но это ещё больше отдаляет от реальных условий. Разве что для отладки.

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

Поздравляю, Вы написали отличную статью!

Код из статьи разойдётся на цитаты, а Вы очень высоко подняли планку для коллег, которые собираются написать статьи на тему параллельных вычислений в трейдинге.

 
fxsaber:

В статье Вы очень сильно отошли от универсальности в сторону частности.

Это только начало. Универсальность впереди. Скрытый посыл статьи - не всё так просто. Нельзя тупо сконвертировать последовательный код в параллельный. Нужно изначально параллельно писать.

Если общество заинтересуется, выложу свои дальнейшие наработки в этом направлении.

 
Serhii Shevchuk:

Это только начало. Универсальность впереди. Скрытый посыл статьи - не всё так просто. Нельзя тупо сконвертировать последовательный код в параллельный. Нужно изначально параллельно писать.

Если общество заинтересуется, выложу свои дальнейшие наработки в этом направлении.

общество очень интересуется, "аффтар фиши исчо!!!1111"

очень важная тема в части ускорения оптимизиции\тестировнаия, особенно для алгоритмов машинного обучения

 

Очень полезная статья!

Конечно хотелось бы больше простых примеров перевода обычного кода MQL в код OpenCL, в виде готовых функций с комментариями для чайников.

И ещё вопрос, сколько времени занимает передача\подготовка данных для видеокарты, слышал мнение, что OpenCL для видеокарты нет смысла применять для реальной торговли из-за потерь времени на передачу данных для обработки, это действительно так?