Nova versão da plataforma MetaTrader 5 build 3620: melhorias no terminal web, suporte ONNX e multiplicação mais rápida de matrizes em MQL5
Olá boa noite, na att 3601 não estou conseguindo abrir o Meta Editor, está dando o Erro "2023.03.04 00:02:56.008 Error MetaEditor not found"
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Na sexta-feira, 10 de março de 2023, lançaremos uma versão atualizada da plataforma MetaTrader 5 em modo beta.
Nesta atualização, aprimoramos o terminal web adicionando diferentes esquemas de cores para a interface e melhorando a janela de especificação do instrumento.
Além disso, o MQL5 agora oferece suporte ao novo algoritmo General Matrix Multiplication (GeMM), o que permite uma aceleração significativa nos cálculos em muitos processadores. O novo algoritmo é atualmente suportado pelo método matrix::GeMM.
O MQL5 agora também tem suporte para trabalhar com modelos ONNX, tornando mais fácil o uso de redes neurais em EAs.
A atualização cobre as seguintes alterações:
MetaTrader 5 Client Terminal build 3620
ONNX é uma biblioteca de código aberto para a construção de redes neurais de aprendizado profundo. Este formato é suportado por muitas plataformas, incluindo Chainer, Caffee2 e PyTorch. Depois de criar um modelo ONNX usando ferramentas especializadas, você pode integrá-lo ao seu programa MQL5 e usá-lo para tomar decisões de negociação.
Uma descrição de todas as funções suportadas está disponível na documentação. Um exemplo de como trabalhar com um modelo de teste está disponível em projetos públicos dentro do MetaEditor. Encontre o projeto ONNX.Price.Prediction em "Ferramentas > Projetos públicos" e clique em "Participar" no menu de contexto. O projeto será baixado para o seu computador e aparecerá no Navegador:
Compile o projeto e execute-o com EURUSD H1 para ver o resultado.
Além do modelo finalizado e do código MQL5 para executá-lo, o projeto também inclui o script de Python PricePredictionTraining.py. Ele mostra como criar um modelo ONNX sozinho. Para que o script funcione, instale o Python em seu computador, bem como os módulos necessários a partir da linha de comando:
python -m pip install --upgrade tensorflow
python -m pip install --upgrade pandas
python -m pip install --upgrade scikit-learn
python -m pip install --upgrade matplotlib
python -m pip install --upgrade tqdm
python -m pip install --upgrade metatrader5
python -m pip install --upgrade onnx==1.12
python -m pip install --upgrade tf2onnx
O novo algoritmo é atualmente suportado no método matrix::GeMM. Se o seu processador suportar as instruções AVX e FMA (a maioria dos processadores lançados após 2013), o algoritmo será ativado automaticamente.
Matrizes e vetores são passados para a DLL como um ponteiro para um buffer. Por exemplo, para passar uma matriz do tipo float, o parâmetro correspondente da função DLL exportada deve levar um ponteiro para um buffer do tipo float. Por exemplo:
MQL5
#import "mmlib.dll" bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta); #import
C++extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
Para um processamento adequado de matrizes e vetores, além de seus buffers, devem ser passados seus tamanhos.MQL5: adicionada a nova função CopySeries para copiar séries temporais sincronizadas de MqlRates para arrays separados.
A função CopySeries permite obter apenas as séries temporais necessárias, de cada vez, em diferentes matrizes especificadas, garantindo que todas elas estejam sincronizadas entre si. Isso significa que todos os valores nas matrizes resultantes, em um índice específico N, pertencem à mesma barra no par símbolo/período de tempo especificado. Dessa forma, não é necessário garantir que todas as séries temporais recebidas estejam sincronizadas com o tempo de abertura da barra.
Ao contrário da função CopyRates, que retorna um conjunto completo de séries temporais como uma matriz MQLRates, a função CopySeries permite que o programador obtenha somente as séries temporais necessárias, com base em uma combinação de sinalizadores que indicam o tipo de série temporal solicitado. Neste caso, a ordem dos arrays passados para a função deve corresponder à ordem dos campos na estrutura MqlRates:
struct MqlRates { datetime time; // período de início double open; // preço de abertura double high; // preço mais alto no período double low; // preço mais baixo no período double close; // preço de fechamento long tick_volume; // volume de ticks int spread; // spread long real_volume; // volume de negociação }
Assim, caso seja necessário obter os valores das séries temporais time, close e real_volume para as últimas 100 barras do símbolo/timeframe atual, a chamada deve ser a seguinte:
datetime time[]; double close[]; long volume[]; CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
Ao mesmo tempo, a ordem dos arrays "time, close, volume" é importante — deve corresponder à ordem dos campos Estrutura MqlRates. Mas a ordem dos valores na máscara rates_mask não importa, a máscara poderia ser assim:
COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE
Exemplo
//--- input parameters input datetime InpDateFrom=D'2022.01.01 00:00:00'; input datetime InpDateTo =D'2023.01.01 00:00:00'; input uint InpCount =20; //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart(void) { //--- obtemos séries temporais a partir da estrutura de preços Rates double open[]; double close[]; float closef[]; datetime time1[], time2[]; //--- solicitamos os preços de fechamento em uma matriz do tipo double ResetLastError(); int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount, COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close); PrintFormat("1. CopySeries returns %d values. Error code=%d", res1, GetLastError()); ArrayPrint(close); //--- agora pedimos mais preços de abertura e fechamento em uma série de preços do tipo float ResetLastError(); int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount, COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef); PrintFormat("2. CopySeries returns %d values. Error code=%d", res2, GetLastError()); ArrayPrint(closef); //--- comparamos os dados if((res1==res2) && (time1[0]==time2[0])) { Print(" | Time | Open | Close double | Close float |"); for(int i=0; i<10; i++) { PrintFormat("%d | %s | %.5f | %.5f | %.5f |", i, TimeToString(time1[i]), open[i], close[i], closef[i]); } } /* Resultado 1. CopySeries returns 0 values. Error code=0 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247 2. CopySeries returns 0 values. Error code=0 [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604 [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247 | Time | Open | Close double | Close float | 0 | 2023.03.01 17:00 | 1.06660 | 1.06722 | 1.06722 | 1 | 2023.03.01 18:00 | 1.06722 | 1.06733 | 1.06733 | 2 | 2023.03.01 19:00 | 1.06734 | 1.06653 | 1.06653 | 3 | 2023.03.01 20:00 | 1.06654 | 1.06520 | 1.06520 | 4 | 2023.03.01 21:00 | 1.06520 | 1.06573 | 1.06573 | 5 | 2023.03.01 22:00 | 1.06572 | 1.06649 | 1.06649 | 6 | 2023.03.01 23:00 | 1.06649 | 1.06694 | 1.06694 | 7 | 2023.03.02 00:00 | 1.06683 | 1.06675 | 1.06675 | 8 | 2023.03.02 01:00 | 1.06675 | 1.06684 | 1.06684 | 9 | 2023.03.02 02:00 | 1.06687 | 1.06604 | 1.06604 | */ }
MetaTrader 5 WebTerminal, build 3620
A atualização estará disponível através do sistema LiveUpdate.