Eis o que você pode fazer com OpenCL diretamente no MetaTrader 5 sem DLLs - página 11

 
fxsaber:

Aparentemente, o objetivo da programação do algotrader é o que você chama de algo assim- toda a lógica comercial em algumas linhas.

Nesse exemplo, para que o Sinal mostre uma tendência positiva, todo o objetivo do algotrading está na verdade contido em apenas uma linha

que não tem nada a ver com o Order-logic, mas é decisivo para os resultados do TS.


"Exatamente a mesma linha" está em qualquer Expert Advisor competente. E é o que é escrito pelos algotraders.


E o que isso mostra no comércio real? Você não está de bom humor. Certamente o problema (se houver algum) reside em algumas bagatelas não contabilizadas relacionadas ao trabalho real (alguns saltos, perda de pacotes ou flutuações de tensão na rede, devido ao qual a roba está tendo problemas. Este também é o meu tema, a propósito, estou construindo um robô lentamente.
 
Alexey Oreshkin:

Por quê?
Eu nunca fiz truques para os robôs, não vejo a utilidade de desperdiçar tempo com isso.

Também não vejo como você pode analisar visualmente as estratégias de statarbitrage ))). Todas as análises são apenas dados de cálculo, mas há registros suficientes na fase de depuração para isso. Por exemplo, tais dados são utilizados na fase de depuração da estratégia, mas sua visualização não nos dirá nada.

Arquivos anexados:
 
fxsaber:

Aparentemente, o objetivo da programação do algotrader é o que você chama de algo assim- toda a lógica comercial em algumas linhas.

Nesse exemplo, para que o Sinal mostre uma tendência positiva, todo o objetivo do algotrading está na verdade contido em apenas uma linha

que não tem nada a ver com o Order-logic, mas é decisivo para os resultados do TS.


"Exatamente a mesma linha" está em qualquer Expert Advisor competente. E é o que é escrito pelos algotraders.


Os carrapatos são adequados apenas para o escalpe. Não se pode sequer confiar neles com uma estratégia de curto prazo de um algoritmo fechado, porque metade das posições ficarão presas no apartamento, pois não há análise técnica para a entrada correta. Você entrará ao acaso, e o resultado será apropriado. Os carrapatos são bons para testar estratégias, como me disseram pessoas sábias, além de tornarem meu trabalho com ações mais eficaz. Mas que tipo de entradas por carrapatos podem ser - apenas para escalpelismo, como entrada/saída e lucro de 5-10 libras. É pura iteração, sem nenhuma informação. Mais uma vez, você conhece seu estado passado, mas nunca conhecerá seu estado futuro. Essa é a natureza do Forex. Em vez desse disparate visualizado, anexe alguns indicadores ao seu Consultor Especialista e eles analisarão o gráfico e identificarão o vetor de maior movimento de preços com a probabilidade de mais de 0,5).
 
Comentários não relevantes a este tópico foram movidos para "O Conceito GUI".
 

Mais uma vez chego ao tópico para descobriro que pode ser feito com OpenCL diretamente no terminal MetaTrader 5 sem DLL

Tenho que ler tretas... Por favor, se você não tem nada para escrever sobre o assunto, não escreva de jeito nenhum...

 

Muito estranho.

Parece um vazamento de memória exatamente no terminal.

Eu escrevi um roteiro para demonstrá-lo. Eu quero ter certeza de que não estou perdendo nada e é realmente um bug.

//+------------------------------------------------------------------+
//|                                            OpenCL_MemoryLeak.mq5 |
//|                                           Copyright 2017, Progid |
//|                             http://www.mql5.com/en/users/progid/ |
//|                                                       18.04.2017 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Progid"
#property link      "http://www.mql5.com/en/users/progid/"
#property version   "1.00"

//+------------------------------------------------------------------+
//| define
//+------------------------------------------------------------------+
#ifndef  _Error_
 #define _Error_(info)  { Print("Error: ",info," line: "+(string)__LINE__+" file: "+__FILE__+" function: "+__FUNCTION__+"; GetLastError: "+(string)GetLastError()); }
#endif

#ifndef  _ErrorDefault_
 #define _ErrorDefault_(info,r) { _Error_(info) r; }
#endif

#define _RAM_Print_ Print("RAM used: Program(",MQLInfoInteger(MQL_MEMORY_USED)," MB) Terminal(",TerminalInfoInteger(TERMINAL_MEMORY_USED)," MB)");

//+------------------------------------------------------------------+
//| resource
//+------------------------------------------------------------------+
//#resource "Gpu_Code_0.cl" as string _CL_GpuCode_0

string _CL_GpuCode_0 = ""
"__kernel void GPU_Test (global int * buf_0,"
"                        global int * buf_1,"
"                        global int * buf_r,"
"                        "
"                        local  int * l_buf_1)"
"{"
"   const int id   = get_global_id(0);"
"   "
"   buf_r[id] = 0;"
"   "
"   l_buf_1[id] = buf_0[id] * buf_1[id];"
"   "
"   buf_r[id] = l_buf_1[id];"
"}";


//+------------------------------------------------------------------+
//| include
//+------------------------------------------------------------------+
#include <OpenCL\OpenCL.mqh>

//+------------------------------------------------------------------+
//| global var
//+------------------------------------------------------------------+
COpenCL _OpenCL;

const int _Size = 5000;

int _Buf_0[];
int _Buf_1[];
int _Buf_r[];
   
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
{
   if (ArrayResize(_Buf_0, _Size) != _Size) _ErrorDefault_("", return)
   if (ArrayResize(_Buf_1, _Size) != _Size) _ErrorDefault_("", return)
   if (ArrayResize(_Buf_r, _Size) != _Size) _ErrorDefault_("", return)
   
   for (int i=0; i<_Size; ++i)
   {
      _Buf_0[i] = i;
      _Buf_1[i] = i;
   }
   
   if (!GPU_Init()) _ErrorDefault_("", return)
   
   while(!_StopFlag)
   {
      if (!GPU_Test()) _ErrorDefault_("", break)
   }
      
   _OpenCL.Shutdown();
   
   Print("Completed!");
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool GPU_Init()
{
#define _gpu_error_ _OpenCL.Shutdown(); return false
   
//---init
   if (!_OpenCL.Initialize(_CL_GpuCode_0, true)) _ErrorDefault_("", _gpu_error_)
   
   
//---kernels
   if (!_OpenCL.SetKernelsCount(1)) _ErrorDefault_("", _gpu_error_)

   if (!_OpenCL.KernelCreate(0, "GPU_Test")) _ErrorDefault_("", _gpu_error_)


//---buffers
   if (!_OpenCL.SetBuffersCount(3)) _ErrorDefault_("", _gpu_error_)

   //buf_0
   if (!_OpenCL.BufferCreate(0, _Size*sizeof(int), CL_MEM_READ_ONLY)) _ErrorDefault_("", _gpu_error_)
   //buf_1
   if (!_OpenCL.BufferCreate(1, _Size*sizeof(int), CL_MEM_READ_ONLY)) _ErrorDefault_("", _gpu_error_)
   //buf_r
   if (!_OpenCL.BufferCreate(2, _Size*sizeof(int), CL_MEM_WRITE_ONLY)) _ErrorDefault_("", _gpu_error_)
   
   
//---args
   if (!_OpenCL.SetArgumentBuffer(0, 0, 0)) _ErrorDefault_("", _gpu_error_)
   if (!_OpenCL.SetArgumentBuffer(0, 1, 1)) _ErrorDefault_("", _gpu_error_)
   if (!_OpenCL.SetArgumentBuffer(0, 2, 2)) _ErrorDefault_("", _gpu_error_)
   
   if (!_OpenCL.SetArgumentLocalMemory(0, 3, _Size*sizeof(int))) _ErrorDefault_("", _gpu_error_)


//---write to GPU
   if (!_OpenCL.BufferWrite(0, _Buf_0, 0, 0, _Size)) _ErrorDefault_("", return false)
   if (!_OpenCL.BufferWrite(1, _Buf_1, 0, 0, _Size)) _ErrorDefault_("", return false)
   
   
//---
#undef _gpu_error_ 

   return true;   
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+   
bool GPU_Test()
{ 
   for (int c=0; c<100; ++c)
   {   
//---Execute     
      uint GlobalWorkOffset[1] = {0};
      uint GlobalWorkSize[1]   = {0}; GlobalWorkSize[0] = _Size;
      
      if(!_OpenCL.Execute(0, 1, GlobalWorkOffset, GlobalWorkSize)) _ErrorDefault_("", return false)
      if(!_OpenCL.BufferRead(2, _Buf_r, 0, 0, _Size)) _ErrorDefault_("", return false)
   }

//---RAM
   int RAM_Used = TerminalInfoInteger(TERMINAL_MEMORY_USED);
   
   if (RAM_Used > 3024) _ErrorDefault_("RAM used: "+(string)RAM_Used+" > 3024 MB", return false)
   
   static ulong LastMSC = 0;
    
   if (GetMicrosecondCount() - LastMSC >= 3000000)
   { 
      _RAM_Print_
      
      LastMSC = GetMicrosecondCount();
   }
   
//---
   return true;
}


A memória está vazando, muito visivelmente. Uma centena de MB por minuto.

O vazamento é excluído no programa, poisa MQLInfoInteger(MQL_MEMORY_USED) o exclui.

Isto é realmente um bug e eu devo ir ao Service Desk?

O script imprime no log a quantidade de RAM consumida, tanto pelo próprio programa quanto pelo terminal.

 
Marat Sultanov:

Muito estranho.

Parece um vazamento de memória exatamente no terminal.

Eu escrevi um roteiro para demonstrá-lo. Eu quero ter certeza de que não estou perdendo nada e é realmente um bug.


A memória está vazando, muito visivelmente. Uma centena de MB por minuto.

O vazamento é excluído no programa, poisa MQLInfoInteger(MQL_MEMORY_USED) o exclui.

É realmente um bug e vale a pena ir ao servicedesk?


Favor postar aqui os resultados dos estudos sobre este assunto mais tarde para que saibamos onde o cão está enterrado))
 

Ninguém usa o OpenCL em tarefas práticas? :)

Konstantin:

Favor publicar aqui o resultado de sua pesquisa sobre o assunto, para que você saiba onde o cão está enterrado ))

OK. Desculpe, você é como eu, você está preso por causa disso, ou você só quer saber para o desenvolvimento geral?

 
Marat Sultanov:

Ninguém usa o OpenCL em tarefas práticas? :)


Eu sim, mas ainda não cheguei ao seu exemplo
 
Igor Volodin:

Eu sim, mas ainda não cheguei ao seu exemplo

Ótimo. O script imprime no log a quantidade de RAM consumida, tanto pelo próprio programa quanto pelo terminal. Se você executar o script, você verá imediatamente no log quantos MB de RAM o terminal está consumindo.

Você utiliza cálculos intensivos em seus programas?

Razão: