Hier sehen Sie, was Sie mit OpenCL direkt in MetaTrader 5 ohne DLLs machen können - Seite 11

 
fxsaber:

Offensichtlich ist das Programmierziel des Algotraders so etwas wie die gesamte Handelslogik in ein paar Zeilen.

In diesem Beispiel ist das gesamte Algotrading-Ziel in nur einer Zeile enthalten, damit das Signal einen positiven Trend anzeigt

die nichts mit der Ordnungslogik zu tun hat, aber entscheidend für die Ergebnisse des TS ist.


"Genau dieselbe Linie" ist in jedem kompetenten Expert Advisor enthalten. Und es ist diejenige, die von den Algotradern geschrieben wird.


Und wie sieht es im realen Handel aus? Sie sind nicht gut gelaunt. Sicherlich liegt das Problem (wenn es denn eines gibt) in irgendeiner unerklärlichen Kleinigkeit, die mit der eigentlichen Arbeit zusammenhängt (einige springende Pings, Paketverluste oder Spannungsschwankungen im Netz, aufgrund derer die Roba Probleme hat). Das ist übrigens auch mein Thema, ich baue langsam einen Roboter.
 
Alexey Oreshkin:

Und warum?
Ich habe noch nie eine Benutzeroberfläche für Roboter erstellt, ich sehe keinen Sinn darin, Zeit darauf zu verschwenden.

Ich verstehe auch nicht, wie man Statarbitrage-Strategien visuell analysieren kann )). Die gesamte Analyse besteht nur aus Berechnungsdaten, aber dafür gibt es in der Debugging-Phase genügend Protokolle. Solche Daten werden zum Beispiel in der Debugging-Phase der Strategie verwendet, aber ihre Visualisierung sagt nichts aus.

Dateien:
 
fxsaber:

Offensichtlich ist das Programmierziel des Algotraders so etwas wie die gesamte Handelslogik in ein paar Zeilen.

In diesem Beispiel ist das gesamte Algotrading-Ziel in nur einer Zeile enthalten, damit das Signal einen positiven Trend anzeigt

die nichts mit der Ordnungslogik zu tun hat, aber entscheidend für die Ergebnisse des TS ist.


"Genau dieselbe Linie" ist in jedem kompetenten Expert Advisor enthalten. Und es ist diejenige, die von den Algotradern geschrieben wird.


Zecken sind nur für Scalping geeignet. Man kann ihnen nicht einmal mit einer kurzfristigen Strategie eines geschlossenen Algorithmus trauen, da die Hälfte der Positionen im Flat stecken bleibt, weil es keine technische Analyse für den richtigen Einstieg gibt. Die Eingabe erfolgt nach dem Zufallsprinzip, und das Ergebnis wird angemessen sein. Ticks sind gut für Strategietester, wie mir kluge Leute gesagt haben, und sie machen meine Arbeit mit Aktien effektiver. Aber welche Art von Einträgen durch Ticks kann das sein - nur für Scalping, wie Entry-Exit und Gewinn von 5-10 Pfund. Es handelt sich um eine reine Iteration ohne jegliche Information. Auch hier kennen Sie den Zustand der Vergangenheit, aber Sie werden nie den Zustand der Zukunft kennen. Das ist die Natur des Forex. Anstelle dieses visualisierten Unsinns fügen Sie Ihrem Expert Advisor ein paar Indikatoren hinzu, die das Diagramm analysieren und den Vektor der weiteren Preisbewegung mit einer Wahrscheinlichkeit von mehr als 0,5 identifizieren werden).
 
Kommentare, die für dieses Thema nicht relevant sind, wurden nach "Das GUI-Konzept" verschoben.
 

Noch einmal komme ich zum Thema, um herauszufinden,was man mit OpenCL direkt im MetaTrader 5 Terminal ohne DLL machen kann

Ich muss das blödsinnige Tohuwabohu lesen... Bitte, wenn Sie nichts zu dem Thema zu schreiben haben, schreiben Sie gar nichts...

 

Sehr seltsam.

Es sieht aus wie ein Speicherleck genau im Terminal.

Ich habe ein Skript geschrieben, um es zu demonstrieren. Ich möchte sichergehen, dass ich nichts übersehe und dass es wirklich ein Fehler ist.

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


Der Speicher leckt, und zwar ziemlich deutlich. Einhundert MB pro Minute.

Das Leck wird im Programm ausgeschlossen, daMQLInfoInteger(MQL_MEMORY_USED) es ausschließt.

Ist dies wirklich ein Fehler und sollte ich mich an den Service Desk wenden?

Das Skript gibt im Protokoll die Menge des verbrauchten Arbeitsspeichers aus, sowohl durch das Programm selbst als auch durch das Terminal.

 
Marat Sultanov:

Sehr seltsam.

Es sieht aus wie ein Speicherleck genau im Terminal.

Ich habe ein Skript geschrieben, um es zu demonstrieren. Ich möchte sichergehen, dass ich nichts übersehe und dass es wirklich ein Fehler ist.


Der Speicher leckt, und zwar ziemlich deutlich. Einhundert MB pro Minute.

Das Leck ist im Programm ausgeschlossen, daMQLInfoInteger(MQL_MEMORY_USED) es ausschließt.

Handelt es sich wirklich um einen Fehler, und lohnt es sich, den Service von Tesk in Anspruch zu nehmen?


Bitte stellen Sie die Ergebnisse von Studien zu diesem Thema später hier ein, damit wir wissen, wo der Hund begraben ist ))
 

Verwendet denn niemand OpenCL für praktische Aufgaben? :)

Konstantin:

Bitte posten Sie das Ergebnis Ihrer Nachforschungen zu diesem Thema hier, damit Sie wissen, wo der Hund begraben ist ))

GUT. Entschuldigung, geht es Ihnen wie mir, stecken Sie deswegen fest, oder wollen Sie es einfach nur für die allgemeine Entwicklung wissen?

 
Marat Sultanov:

Verwendet denn niemand OpenCL für praktische Aufgaben? :)


Das tue ich, aber ich bin noch nicht dazu gekommen, Ihr Beispiel zu verwenden.
 
Igor Volodin:

Das tue ich, aber ich bin noch nicht dazu gekommen, Ihr Beispiel zu verwenden.

Großartig. Das Skript gibt im Protokoll die Menge an RAM aus, die sowohl vom Programm selbst als auch vom Terminal verbraucht wird. Wenn Sie das Skript ausführen, sehen Sie im Protokoll sofort, wie viele MB RAM das Terminal verbraucht.

Verwenden Sie in Ihren Programmen intensive Berechnungen?