Автор, Спасибо за статью! Думаю, Вы неслучайно выбрали именно такую ТС для демонстрации, т.к. она параллелится великолепно. Однако, это очень узкая ниша.
В статье Вы очень сильно отошли от универсальности в сторону частности. Понятно, что цель продемонстрировать потенциальные возможности. Но применить под себя мало что получится.
Хотелось бы видеть примеры перевода разного MQL-кода в OpenCL-код. Возможно, это содержится в статьях, ссылки на которые Вы привели в начале своей статьи.
А файл 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) //+------------------------------------------------------------------+
Кастомные символы могут помочь избавиться от свопов и комиссий при сравнительном анализе результатов тестеров.
Да, но это ещё больше отдаляет от реальных условий. Разве что для отладки.
Поздравляю, Вы написали отличную статью!
Код из статьи разойдётся на цитаты, а Вы очень высоко подняли планку для коллег, которые собираются написать статьи на тему параллельных вычислений в трейдинге.
В статье Вы очень сильно отошли от универсальности в сторону частности.
Это только начало. Универсальность впереди. Скрытый посыл статьи - не всё так просто. Нельзя тупо сконвертировать последовательный код в параллельный. Нужно изначально параллельно писать.
Если общество заинтересуется, выложу свои дальнейшие наработки в этом направлении.
Это только начало. Универсальность впереди. Скрытый посыл статьи - не всё так просто. Нельзя тупо сконвертировать последовательный код в параллельный. Нужно изначально параллельно писать.
Если общество заинтересуется, выложу свои дальнейшие наработки в этом направлении.
общество очень интересуется, "аффтар фиши исчо!!!1111"
очень важная тема в части ускорения оптимизиции\тестировнаия, особенно для алгоритмов машинного обучения
Очень полезная статья!
Конечно хотелось бы больше простых примеров перевода обычного кода MQL в код OpenCL, в виде готовых функций с комментариями для чайников.
И ещё вопрос, сколько времени занимает передача\подготовка данных для видеокарты, слышал мнение, что OpenCL для видеокарты нет смысла применять для реальной торговли из-за потерь времени на передачу данных для обработки, это действительно так?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Применение OpenCL для тестирования свечных моделей:
В данной статье мы рассмотрим алгоритм реализации тестера свечных моделей на языке OpenCL в режиме "OHLC на M1". А также сравним его быстродействие cо встроенным тестером стратегий, запущенным в режиме быстрой и медленной оптимизации.
Для того, чтобы убедиться, что реализация тестера на OpenCL работает правильно, нужно на что-то опираться. Поэтому, для начала мы напишем эксперт на MQL5, а затем будем сравнивать результаты его тестирования и оптимизации штатным тестером с соответствующими результатами тестера, реализованного на OpenCL.
Объектом тестирования будет простой эксперт, который торгует по следующим свечным моделям (далее по тексту - паттернам).Стратегия будет простая:
Наличие паттерна будем проверять на полностью закрытых барах. Иными словами, в момент появления нового бара мы будем искать паттерн на трёх предыдущих.
Условия обнаружения паттернов будут следующие:
Автор: Serhii Shevchuk