Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 2333

 


....

 

Artigo fácil e bom sobre possibilidades de programação genética

https://blog.ephorie.de/symbolic-regression-genetic-programming-or-if-kepler-had-r

 

Eu encontrei (para mim) uma maneira legal de testar meus scripts mql em python, bem como acelerar significativamente algumas funções nele, usando dll.

Aqui está a função inicial em mql5, que eu quero colocar em python. Procura simplesmente os mínimos e máximos de um preço usando o seu padrão alisado.

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];
        }

     }

Isto é feito em várias etapas

1. Em algum lugar, em estúdio visual ou em bloco de código, compile sua dll. No arquivo .cpp escrevemos nossa função, no arquivo .h o declaramos. Um exemplo que funcionou para mim no apego ao posto. Na pasta codeblox arquivo de projeto, arquivo principal .cpp, arquivo principal .h, na pasta \bin\Debug arquivo my_lib.dll. Em resumo, aqui está o cabeçalho da função em c++:

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

2 Em python, faça o seguinte:

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)) #смотрим  что получилось

Esta não é a verdade final, ter quaisquer aditamentos, ou outras opções, escrever.

Arquivos anexados:
my_lib.zip  36 kb
 
welimorn:

Eu encontrei (para mim) uma maneira legal de testar meus scripts mql em python, bem como acelerar significativamente algumas funções nele, usando dll.

Aqui está a função inicial em mql5, que eu quero colocar em python. Procura simplesmente os mínimos e máximos de um preço usando o seu padrão alisado.

Isto é feito em várias etapas

1. Em algum lugar, em estúdio visual ou em bloco de código, compile sua dll. No arquivo .cpp escrevemos nossa função, no arquivo .h o declaramos. Um exemplo que funcionou para mim no apego ao posto. Na pasta codeblox arquivo de projeto, arquivo principal .cpp, arquivo principal .h, na pasta \bin\Debug arquivo my_lib.dll. Em resumo, aqui está o cabeçalho da função em c++:

2 Em python, faça o seguinte:

Esta não é a verdade final, quaisquer adições, ou outras opções, escreva.

O que você quer alcançar?
Se velocidade, então não use
ArrayResize(loc_max,ArraySize(loc_max)+1);

dentro do laço, e uma vez antes de chamar a função, defina o tamanho desejado, como fez em C++ e python, ou reserve-o com o 3º parâmetro

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

Agora cada chamada para o ArrayResize, cria um novo bloco na memória, copia o antigo para dentro dele e apaga o antigo. Isto é muito, muito lento.

И

ArraySize(loc_max)

não tens de o fazer sempre, podes guardá-lo numa variável.


Experimente, talvez você não tenha que traduzir uma função simples em 3 linguagens de programação diferentes. Os desenvolvedores dizem que o MQL é comparável em velocidade a C++, e mais rápido em algumas coisas.

Por que você precisa do Python se você pode chamar DLL diretamente da MQL?

Ou você tem algum outro propósito?
 
elibrarius:
O que você quer alcançar?
Se velocidade, não use

dentro do laço, e 1 vez antes de chamar a função, defina o tamanho desejado, como fez em C++ e Python, ou reserve-o com o 3º parâmetro

Agora cada chamada para o ArrayResize, cria um novo bloco na memória, copia o bloco antigo para dentro dele e apaga o antigo. Isto é muito, muito lento.

И

não tens de o fazer sempre, podes guardá-lo numa variável.


Experimente, talvez você não tenha que traduzir uma função simples em 3 linguagens de programação diferentes. Os desenvolvedores dizem que o MQL é comparável em velocidade a C++, e mais rápido em algumas coisas.

Por que você precisa do Python se você pode chamar a DLL diretamente da MQL?

Ou você tem algum outro propósito?

A função de busca extrema na mensagem é fornecida apenas como um exemplo para mostrar o princípio por trás dela.

O propósito é que é conveniente procurar as dependências das características e do alvo em Python e escolher modelos, enquanto a MQL tem um bom testador que, se não se enganar, lhe dará uma estimativa clara das suas descobertas.

Estou confortável trabalhando com Python, mas estou apenas aprendendo e não consigo escrever nenhuma função em mql5 com loops em Python usando cálculos vetoriais. Escrever código sem eles é uma perda de tempo, uma vez que a pitão é muito lenta. Algumas funções podem ser chamadas em todos os bares e isso torna muito difícil de encontrar. Tenho usado algibe em toda parte desde que eles têm soluções tanto para píton como para mql5. Mas quando se trata da minha imaginação louca, eu tenho alguns problemas.

O código para mql5 pode facilmente converter para c++ e compilar para dll. Como resultado, eu uso uma e a mesma função no testador e no roteiro de pitão.

 
welimorn:

A função de busca de extremos na mensagem é dada simplesmente como exemplo para mostrar o princípio sobre ela.

O propósito é que o Python é útil para procurar dependências de características e modelos de alvo e ajuste, enquanto a MQL tem um bom testador que, se não se enganar a si mesmo, permite obter uma estimativa clara das suas descobertas.


Então, você encontrou dependências em Python, escolheu, treinou e testou o modelo. E como é que se testa num testador? Python não é amigável com o testador ou MKL5.

 
Se o tempo médio de manutenção de uma posição para um TS é de 10 minutos. E a posição atual está pairando há 10 horas, então seu resultado é um quid pro quo (completamente não-sistemático)?
 
fxsaber:
Se o tempo médio de manutenção da posição para o TS é de 10 minutos. E a posição actual está pendurada há 10 horas, então o seu resultado é um gambit (completamente não sistémico)?

Depende de como a lógica/regras do TS são escritas. O "talvez" é um resultado probabilístico, não determinado pela lógica do TC. Se a lógica funcionou definitivamente durante todas as 10 horas, então é apenas um caso raro.

 
Valeriy Yastremskiy:

Se todas as 10 horas de lógica funcionaram definitivamente, é apenas um caso raro.

Só porque a lógica funcionou, não faz o resultado sistémico.

 
fxsaber:

Só porque a lógica funcionou, não torna o resultado sistemático.

A pergunta não especifica a que se deve aplicar o quid pro quo e a sistemática. Se à TC, então depende da TC, se a condições externas, então casos raros não são intrinsecamente sistêmicos. E podem ser excepções à regra. Eurodollar 14 de Maio a Março de 15. Não é um caso sistémico.