Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 2333

 

Всем зарасти!  Нашел (для себя) прикольный способ проверить свои mql-писульки на пайтон, а также значительно ускорить работу некоторых функций в нем, с помощью dll. 

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

void get_loc_extremum(double &x[],double &x2[],double &loc_max[],double &loc_min[],bool real_price)
  {
   int N = ArraySize(x);
   for(int i=1; i<N-1; i++)
     {
      if(x[i-1]<x[i]&& x[i]>x[i+1])
        {
         ArrayResize(loc_max,ArraySize(loc_max)+1);
         if(real_price)
            loc_max[ArraySize(loc_max)-1]=x2[i];
         else
            loc_max[ArraySize(loc_max)-1]=x[i];
        }

      if(x[i-1]>x[i]&& x[i]<x[i+1])
        {

         ArrayResize(loc_min,ArraySize(loc_min)+1);
         if(real_price)
            loc_min[ArraySize(loc_min)-1]=x2[i];
         else
            loc_min[ArraySize(loc_min)-1]=x[i];
        }

     }

Это делается в несколько шагов

1. Где ни будь, в визуалстудио или в кодблоксе компилим свою dll. Там все просто, в файле .cpp пилим свою функцию, в файле .h объявляем её. Пример который у меня работал в приложении к сообщению. В папке файл проекта кодблокс, файлы main .cpp, main .h , в папке \bin\Debug файл  my_lib.dll.  Короче вот заголовок функции на c++:

void DLL_EXPORT GetLocalMaxMin(double* x_sm[],double* x_rl[], double* loc_max[], double* loc_min[], int N, bool real_price)
{
...
}

2  В пайтон делаем следущее:

from ctypes import *

my_dll = cdll.LoadLibrary("my_dll/my_lib.dll") 					#загружаем свою DLL
my_dll.GetLocalMaxMin.argtypes = [POINTER(c_double), 
        POINTER(c_double), POINTER(c_double), POINTER(c_double), c_int, c_bool] #определяем типы входных аргументов функции через атрибуты ctypes
my_dll.GetLocalMaxMin.restype = None                                            #определяем типы выходных данных 

...
# y - список цен
# y_sm - список сглаженных цен
# len(y)=len(y_sm) - длина списков одинаковая

x_sm = (c_double * len(y))(*y_sm)    				  #создаем указатель на массив x_sm размером len(y_sm) предаем туда указатель на массив y_sm
x_rl = (c_double * len(y))(*y)       			       	  #создаем указатель на массив x_rl размером len(y) предаем туда указатель на массив y
loc_max = (c_double * len(y))()      				  #создаем указатель на массив loc_max размером len(y) заполный 0.0 
loc_min = (c_double * len(y))()     				  #создаем указатель на массив loc_min размером len(y) заполный 0.0 
my_dll.GetLocalMaxMin(x_sm, x_rl, loc_max, loc_min, len(y), True) #вызываем функцию и передаем туда все что насоздавали

print(list(loc_max),list(loc_min)) #смотрим что получилось

Это не истина в последней инстанции, есть дополнения, или другие варианты, пишите.

Файлы:
my_lib.zip  36 kb
 
welimorn:

Всем зарасти!  Нашел (для себя) прикольный способ проверить свои mql-писульки на пайтон, а также значительно ускорить работу некоторых функций в нем, с помощью dll. 

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

Это делается в несколько шагов

1. Где ни будь, в визуалстудио или в кодблоксе компилим свою dll. Там все просто, в файле .cpp пилим свою функцию, в файле .h объявляем её. Пример который у меня работал в приложении к сообщению. В папке файл проекта кодблокс, файлы main .cpp, main .h , в папке \bin\Debug файл  my_lib.dll.  Короче вот заголовок функции на c++:

2  В пайтон делаем следущее:

Это не истина в последней инстанции, есть дополнения, или другие варианты, пишите.

А чего вы хотите добиться?
Если скорости, то не используйте
ArrayResize(loc_max,ArraySize(loc_max)+1);

внутри цикла, а 1 раз до вызова функции задайте нужный размер, как вы сделали это в С++ и питоне, или зарезервируйте его 3-м параметром

ArrayResize(loc_max,ArraySize(loc_max)+1, max_size);

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

И

ArraySize(loc_max)

можно не каждый раз делать, а хранить в переменной.


Попробуйте, может и не придется раскидывать простую функцию на 3 разных языка программирования. Разработчики говорят, то MQL соизмерим по скорости с С++, а в некоторых вещах и быстрее.

А зачем Питон, если DLL можно сразу из MQL вызвать?

Или у вас какая-то другая цель?
 
elibrarius:
А чего вы хотите добиться?
Если скорости, то не используйте

внутри цикла, а 1 раз до вызова функции задайте нужный размер, как вы сделали это в С++ и питоне, или зарезервируйте его 3-м параметром

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

И

можно не каждый раз делать, а хранить в переменной.


Попробуйте, может и не придется раскидывать простую функцию на 3 разных языка программирования. Разработчики говорят, то MQL соизмерим по скорости с С++, а в некоторых вещах и быстрее.

А зачем Питон, если DLL можно сразу из MQL вызвать?

Или у вас какая-то другая цель?

Функция поиска экстремумов в сообщении приводится просто в качестве примера, что бы на ней показать принцип.

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

Мне удобно работать с питоном, но я еще только учусь, и не способен любую функцию, на mql5, где есть циклы, написать на питоне с использованием либ с векторным вычислением. А писать код без них, пустая трата времени, т.к питон очень медленный. Некоторые функции могут вызываться на каждом баре и это значительно затрудняет поиск. Я везде где смог использовал algib т.к. у них есть решения и под питон и под mql5. Но когда дело касается полета моей бредовой фантазии тут возникают проблемки.

Код на  mql5 можно без усилий преобразовать в  С++, и скомпилировать в dll. В итоге и в тестере и в скрипте на питоне я использую одну и ту же функцию. 

 
welimorn:

Функция поиска экстремумов в сообщении приводится просто в качестве примера, что бы на ней показать принцип.

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


Ну нашли Вы в Питоне зависимости, подобрали, обучили и протестировали модель. И как Вы это протестируете в тестере? Питон не дружит ни с тестером ни с МКЛ5.

 
Если для ТС среднее время удержания позиции 10 минут. И текущая позиция зависла на 10 часов, то ее результат - авось (полностью не системный)?
 
fxsaber:
Если для ТС среднее время удержания позиции 10 минут. И текущая позиция зависла на 10 часов, то ее результат - авось (полностью не системный)?

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

 
Valeriy Yastremskiy:

Если все 10 часов логика работала определенно, то это просто редкий случай.

От того, что логика работала, не делает результат системным.

 
fxsaber:

От того, что логика работала, не делает результат системным.

В вопросе не определено, к чему применить авось и системность. Если к ТС, то все зависит от ТС, если к внешним условиям, то редкие случаи изначально не системны. И могут быть исключениями из правил. Евродоллар 14 год с мая по март 15го. Не системный случай.

 
Valeriy Yastremskiy:

В вопросе не определено, к чему применить авось и системность. Если к ТС, то все зависит от ТС, если к внешним условиям, то редкие случаи изначально не системны. И могут быть исключениями из правил. Евродоллар 14 год с мая по март 15го. Не системный случай.

Говорим о репрезентативной статистике ТС. В общем, проехали.

 
fxsaber:
Если для ТС среднее время удержания позиции 10 минут. И текущая позиция зависла на 10 часов, то ее результат - авось (полностью не системный)?

полностью. и если что выбросить из анализа результата. хотя, если текущая позиция результат работы системы, то учитывать обязательно. возникает вопрос, - что значит " текущая позиция зависла на 10 часов"? нюансы, мать их)

Причина обращения: