Esto es lo que puedes hacer con OpenCL directamente en MetaTrader 5 sin ninguna DLL - página 11

 
fxsaber:

Aparentemente, el objetivo de programación de algotrader es lo que se llama algo así: toda la lógica de negociación en unas pocas líneas.

En este ejemplo, para que la señal muestre una tendencia positiva, todo el objetivo de algotrading está contenido en una sola línea

que no tiene nada que ver con la lógica de la Orden, pero que es decisiva para los resultados de la ST.


"Exactamente la misma línea" está en cualquier Asesor Experto competente. Y es el que está escrito por los algotraders.


¿Y qué muestra en el comercio real? No estás de buen humor. Seguramente el problema (si es que lo hay) radica en alguna nimiedad no contabilizada relacionada con el trabajo real (algunos pings que saltan, pérdida de paquetes o fluctuaciones de voltaje en la red, debido a lo cual la roba está teniendo problemas. Este es mi tema también, por cierto, estoy construyendo un robot poco a poco.
 
Alexey Oreshkin:

¿Por qué?
Nunca he hecho gui para robots, no veo el sentido de perder el tiempo en ello.

Tampoco veo cómo se pueden analizar visualmente las estrategias de statarbitrage )). Todo el análisis son datos de cálculo solamente, pero hay suficientes registros en la fase de depuración para ello. Por ejemplo, estos datos se utilizan en la fase de depuración de la estrategia, pero su visualización no nos dirá nada.

Archivos adjuntos:
 
fxsaber:

Aparentemente, el objetivo de programación de algotrader es lo que se llama algo así: toda la lógica de negociación en unas pocas líneas.

En este ejemplo, para que la señal muestre una tendencia positiva, todo el objetivo de algotrading está contenido en una sola línea

que no tiene nada que ver con la lógica de la Orden, pero que es decisiva para los resultados de la ST.


"Exactamente la misma línea" está en cualquier Asesor Experto competente. Y es el que está escrito por los algotraders.


Las garrapatas son adecuadas sólo para el scalping. Ni siquiera se puede confiar en una estrategia a corto plazo de un algoritmo cerrado, porque la mitad de las posiciones se quedarán atascadas en el plano, porque no hay análisis técnico para la entrada correcta. Entrará al azar y el resultado será el adecuado. Los ticks son buenos para el tester de estrategias, como me han dicho los sabios, además de que hacen que mi trabajo con la renta variable sea más efectivo. Pero qué tipo de entradas por ticks pueden ser - sólo para scalping, como entrada-salida y beneficio de 5-10 libras. Es pura iteración, sin ninguna información. Una vez más, conoces su estado pasado pero nunca conocerás su estado futuro. Esa es la naturaleza de Forex. En lugar de esta tontería visualizada, adjunte un par de indicadores a su Asesor Experto y ellos analizarán el gráfico e identificarán el vector de movimiento adicional del precio con la probabilidad más de 0,5).
 
Los comentarios que no son relevantes para este tema se han trasladado a "El concepto de interfaz gráfica de usuario".
 

Una vez más vengo al tema para saberqué se puede hacer con OpenCL directamente en el terminal de MetaTrader 5 sin ninguna DLL

Tengo que leer chorradas... Por favor, si no tienes nada que escribir sobre el tema, no escribas...

 

Muy extraño.

Parece una fuga de memoria exactamente en el terminal.

He escrito un guión para demostrarlo. Quiero asegurarme de que no se me escapa nada y de que realmente es un error.

//+------------------------------------------------------------------+
//|                                            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;
}


La memoria tiene una fuga, bastante notable. Cien MB por minuto.

La fuga se excluye en el programa ya queMQLInfoInteger(MQL_MEMORY_USED) la excluye.

¿Es realmente un error y debo acudir al Servicio de Atención al Cliente?

El script imprime en el registro la cantidad de RAM consumida, tanto por el propio programa como por la terminal.

 
Marat Sultanov:

Muy extraño.

Parece una fuga de memoria exactamente en la terminal.

He escrito un guión para demostrarlo. Quiero asegurarme de que no se me escapa nada y de que realmente es un error.


La memoria tiene una fuga, bastante notable. Cien MB por minuto.

La fuga se excluye en el programa ya queMQLInfoInteger(MQL_MEMORY_USED) la excluye.

¿Es realmente un error y vale la pena ir a servicedesk?


Por favor, publique aquí más tarde los resultados de los estudios sobre este tema para que sepamos dónde está enterrado el perro ))
 

¿Nadie utiliza OpenCL en tareas prácticas? :)

Konstantin:

Por favor, publique aquí el resultado de su investigación sobre este tema, para saber dónde está enterrado el perro ))

BIEN. Lo siento, ¿eres como yo, estás atascado por esto, o simplemente quieres saberlo para el desarrollo general?

 
Marat Sultanov:

¿Nadie utiliza OpenCL en tareas prácticas? :)


Lo hago, pero no he llegado a tu ejemplo
 
Igor Volodin:

Lo hago, pero no he llegado a tu ejemplo

Genial. El script imprime en el registro la cantidad de RAM consumida, tanto por el propio programa como por el terminal. Si ejecuta el script, verá inmediatamente en el registro cuántos MB de RAM está consumiendo el terminal.

¿Utiliza cálculos intensivos en sus programas?

Razón de la queja: