Voici ce que vous pouvez faire avec OpenCL directement dans MetaTrader 5, sans aucune DLL. - page 11

 
fxsaber:

Apparemment, l'objectif de programmation de l'algotrader est ce qu'on appelle quelque chose comme ça - toute la logique de négociation en quelques lignes.

Dans cet exemple, pour que le signal indique une tendance positive, l'ensemble de l'objectif d'algotrading est en fait contenu dans une seule ligne

qui n'a rien à voir avec la logique de l'ordre, mais qui est décisif pour les résultats du TS.


"Exactement la même ligne" se trouve dans tout conseiller expert compétent. Et c'est celui qui est écrit par les algotraders.


Et qu'est-ce que cela montre dans le commerce réel ? Vous n'êtes pas de bonne humeur. Le problème (s'il y en a un) réside certainement dans une bagatelle non prise en compte et liée au travail réel (quelques pings parasites, pertes de paquets ou variations de tension dans le réseau, qui causent des difficultés à l'esclave). C'est aussi mon sujet, d'ailleurs, je construis lentement un robot.
 
Alexey Oreshkin:

Pourquoi ?
Je n'ai jamais fait de gui pour les robots du tout, je ne vois pas l'intérêt de perdre du temps dessus.

Je ne vois pas non plus comment on peut analyser visuellement les stratégies de statarbitrage ;)). Toute l'analyse porte uniquement sur les données de calcul, mais il y a suffisamment de journaux dans la phase de débogage pour cela. Par exemple, ces données sont utilisées dans la phase de débogage de la stratégie, mais leur visualisation ne nous apprendra rien.

Dossiers :
 
fxsaber:

Apparemment, l'objectif de programmation de l'algotrader est ce qu'on appelle quelque chose comme ça - toute la logique de négociation en quelques lignes.

Dans cet exemple, pour que le signal indique une tendance positive, l'ensemble de l'objectif d'algotrading est en fait contenu dans une seule ligne

qui n'a rien à voir avec la logique de l'ordre, mais qui est décisif pour les résultats du TS.


"Exactement la même ligne" se trouve dans tout conseiller expert compétent. Et c'est celui qui est écrit par les algotraders.


Les ticks ne conviennent que pour le scalping. On ne peut même pas leur faire confiance avec une stratégie à court terme d'un algorithme fermé, car la moitié des positions seront bloquées dans le plat, faute d'analyse technique pour l'entrée correcte. Vous entrerez au hasard, et le résultat sera approprié. Les ticks sont bons pour tester les stratégies, comme me l'ont dit des personnes avisées, et ils rendent mon travail avec les actions plus efficace. Mais quel genre d'entrées par ticks peuvent être - juste pour le scalping, comme entrée-sortie et profit de 5-10 livres. Il s'agit d'une itération pure, sans aucune information. Une fois encore, vous connaissez leur état passé mais vous ne connaîtrez jamais leur état futur. Au lieu de cette absurdité visuelle, attachez quelques indicateurs à votre conseiller expert et ils analyseront le graphique et identifieront le vecteur d'un nouveau mouvement de prix avec une probabilité supérieure à 0,5.)
 
Les commentaires qui ne sont pas pertinents pour ce sujet ont été déplacés vers "The GUI Concept".
 

Une fois de plus, j'aborde le sujet pour savoirce que vous pouvez faire avec OpenCL directement dans le terminal MetaTrader 5 sans aucune DLL

Je dois lire le brouhaha de conneries... S'il vous plaît, si vous n'avez rien à écrire sur le sujet, n'écrivez pas du tout...

 

Très étrange.

Cela ressemble à une fuite de mémoire exactement dans le terminal.

J'ai écrit un script pour le démontrer. Je veux m'assurer que je ne rate rien et qu'il s'agit bien d'un 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;
}


La mémoire fuit, de manière assez visible. Une centaine de Mo par minute.

La fuite est exclue dans le programme puisqueMQLInfoInteger(MQL_MEMORY_USED) l'exclut.

S'agit-il vraiment d'un bogue et dois-je m'adresser au Service Desk ?

Le script imprime dans le journal la quantité de RAM consommée, à la fois par le programme lui-même et par le terminal.

 
Marat Sultanov:

Très étrange.

Cela ressemble à une fuite de mémoire exactement dans le terminal.

J'ai écrit un script pour le démontrer. Je veux m'assurer que je ne rate rien et qu'il s'agit bien d'un bug.


La mémoire fuit, de manière assez visible. Une centaine de Mo par minute.

La fuite est exclue dans le programme puisqueMQLInfoInteger(MQL_MEMORY_USED) l'exclut.

S'agit-il vraiment d'un bogue et cela vaut-il la peine d'aller chez Servicedesk ?


Veuillez poster les résultats des études sur ce sujet ici plus tard afin que nous sachions où le chien est enterré ;))
 

Personne n'utilise OpenCL dans des tâches pratiques ? :)

Konstantin:

Veuillez poster ici le résultat de vos recherches sur ce sujet, afin de savoir où le chien est enterré ;))

OK. Désolé, vous êtes comme moi, vous êtes bloqué à cause de cela, ou vous voulez juste savoir pour le développement général ?

 
Marat Sultanov:

Personne n'utilise OpenCL dans des tâches pratiques ? :)


C'est le cas, mais je n'ai pas encore eu le temps d'étudier votre exemple.
 
Igor Volodin:

C'est le cas, mais je n'ai pas encore eu le temps d'étudier votre exemple.

Super. Le script imprime dans le journal la quantité de RAM consommée, à la fois par le programme lui-même et par le terminal. Si vous exécutez le script, vous verrez immédiatement dans le journal combien de Mo de RAM le terminal consomme.

Utilisez-vous des calculs intensifs dans vos programmes ?