Ecco cosa si può fare con OpenCL direttamente in MetaTrader 5 senza alcuna DLL - pagina 11

 
fxsaber:

Apparentemente, l'obiettivo di programmazione dell'algotrader è quello che si chiama qualcosa del genere - tutta la logica di trading in poche righe.

In questo esempio, affinché il segnale mostri una tendenza positiva, l'intero obiettivo dell'algotrading è in realtà contenuto in una sola linea

che non ha niente a che vedere con la logica dell'ordine, ma è decisivo per i risultati della ST.


"Esattamente la stessa linea" è in qualsiasi Expert Advisor competente. Ed è quello che è scritto dagli algotraders.


E cosa mostra nel trading reale? Non sei di buon umore. Sicuramente il problema (se ce n'è uno) risiede in qualche inezia non calcolata relativa al lavoro reale (qualche ping che salta, perdita di pacchetti, o oscillazione di tensione nella rete, che causa difficoltà allo slave. Questo è anche il mio argomento, a proposito, sto costruendo un robot lentamente.
 
Alexey Oreshkin:

Perché?
Non ho mai fatto gui per i robot, non vedo il motivo di perderci tempo.

Inoltre non vedo come si possano analizzare visivamente le strategie di statarbitraggio )). Tutte le analisi sono solo dati di calcolo, ma ci sono abbastanza log nella fase di debug per questo. Per esempio, tali dati sono utilizzati nella fase di debug della strategia, ma la loro visualizzazione non ci dirà nulla.

File:
 
fxsaber:

Apparentemente, l'obiettivo di programmazione dell'algotrader è quello che si chiama qualcosa del genere - tutta la logica di trading in poche righe.

In questo esempio, affinché il segnale mostri una tendenza positiva, l'intero obiettivo dell'algotrading è in realtà contenuto in una sola linea

che non ha niente a che vedere con la logica dell'ordine, ma è decisivo per i risultati della ST.


"Esattamente la stessa linea" è in qualsiasi Expert Advisor competente. Ed è quello che è scritto dagli algotraders.


Le zecche sono adatte solo per lo scalping. Non ci si può fidare nemmeno di una strategia a breve termine di un algoritmo chiuso, perché la metà delle posizioni saranno bloccate nel piatto, perché non c'è un'analisi tecnica per l'entrata corretta. Entrerete a caso, e il risultato sarà appropriato. Le zecche sono buone per testare le strategie, come mi hanno detto persone sagge, e in più rendono il mio lavoro con le azioni più efficace. Ma che tipo di entrate da zecche possono essere - solo per lo scalping, come entrata-uscita e profitto di 5-10 sterline. È pura iterazione, senza alcuna informazione. Ancora una volta, si conosce il loro stato passato ma non si conoscerà mai il loro stato futuro. Questa è la natura del Forex. Invece di queste sciocchezze visualizzate, collegate un paio di indicatori al vostro Expert Advisor e loro analizzeranno il grafico e identificheranno il vettore di un ulteriore movimento di prezzo con una probabilità superiore allo 0,5).
 
I commenti non pertinenti a questo argomento sono stati spostati in "Il concetto di GUI".
 

Ancora una volta vengo all'argomento per scoprirecosa si può fare con OpenCL direttamente nel terminale MetaTrader 5 senza alcuna DLL

Devo leggere un mucchio di stronzate... Per favore, se non hai niente da scrivere sull'argomento, non scrivere affatto...

 

Molto strano.

Sembra una perdita di memoria esattamente nel terminale.

Ho scritto uno script per dimostrarlo. Voglio essere sicuro che non mi manchi niente e che sia davvero 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 memoria sta perdendo, in modo abbastanza evidente. Cento MB al minuto.

La perdita è esclusa nel programma poichéMQLInfoInteger(MQL_MEMORY_USED) la esclude.

È davvero un bug e dovrei andare al Service Desk?

Lo script stampa nel log la quantità di RAM consumata, sia dal programma stesso che dal terminale.

 
Marat Sultanov:

Molto strano.

Sembra una perdita di memoria esattamente nel terminale.

Ho scritto uno script per dimostrarlo. Voglio essere sicuro di non perdere nulla e che si tratti davvero di un bug.


La memoria sta perdendo, in modo abbastanza evidente. Cento MB al minuto.

La perdita è esclusa nel programma poichéMQLInfoInteger(MQL_MEMORY_USED) la esclude.

È davvero un bug e vale la pena andare a servicedesk?


Si prega di postare i risultati degli studi su questo argomento qui più tardi in modo che sappiamo dove è sepolto il cane ))
 

Nessuno usa OpenCL in compiti pratici? :)

Konstantin:

Per favore, pubblica qui il risultato delle tue ricerche su questo argomento, in modo da sapere dove è sepolto il cane ))

OK. Scusa, sei come me, sei bloccato a causa di questo, o vuoi solo sapere per lo sviluppo generale?

 
Marat Sultanov:

Nessuno usa OpenCL in compiti pratici? :)


Lo faccio, ma non ho ancora fatto il tuo esempio
 
Igor Volodin:

Lo faccio, ma non ho ancora fatto il tuo esempio

Fantastico. Lo script stampa nel log la quantità di RAM consumata, sia dal programma stesso che dal terminale. Se si esegue lo script, si vedrà immediatamente nel log quanti MB di RAM sta consumando il terminale.

Usate calcoli intensivi nei vostri programmi?