Вот что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL - страница 11

 
fxsaber:

Видимо, алготрейдерской целью программирования Вы называете нечто подобное - вся торговая логика в несколько строк.

В том примере, чтобы Сигнал показывал положительную динамику, вся на самом деле алготрейдерская суть содержится лишь в одной строчке

которая никакого отношения к Order-логике не имеет, но является определяющей для результатов ТС.


"Точно такая же строчка" есть в любом грамотном советнике. И именно ее написанием занимаются алготрейдеры.


А что он в реале показывает? Что-то настроение у вас невесёлое. Наверняка проблема (если она есть) скрывается в какой-то неучтённой мелочи, относящейся к реальной работе (какой-нибудь пинг там скачущий, потеря пакетов данных или скачки напряжения в сети из-за чего у робы затруднения возникают. Вот кстати моя тема тоже собираю робота потихоньку. 
 
Alexey Oreshkin:

Зачем?
Никогда вообще не делал gui роботам, не вижу смысла в трате времени на это.

Так же не понимаю, как можно проанализировать визуально стратегии статарбитража )) Весь анализ только расчетные данные, но для этого хватает логов на этапе отладки. К примеру такие данные используются на этапе отладки стратегии, но их визуализация ни о чем не скажет.

Файлы:
 
fxsaber:

Видимо, алготрейдерской целью программирования Вы называете нечто подобное - вся торговая логика в несколько строк.

В том примере, чтобы Сигнал показывал положительную динамику, вся на самом деле алготрейдерская суть содержится лишь в одной строчке

которая никакого отношения к Order-логике не имеет, но является определяющей для результатов ТС.


"Точно такая же строчка" есть в любом грамотном советнике. И именно ее написанием занимаются алготрейдеры.


Тики пригодны только для скальпинга. Им даже краткосрочную стратегию закрытого алгоритма доверить нельзя так как половина позиций застрянет во флете так как нет тех анализа для правильного входа. Вход наобум получается и результат соответствующий. Тики хорошо выручают на тестере стратегий как мне тут умные люди сказали плюс работа с акциями эффективней стала,  а так то какие могут быть входы по тикам - только для скальпинга типа зашёл-вышел и профит 5-10  баксов. Это чистая итерация без всякой информации все эти тики  - ещё раз говорю что вы знаете по тикам прошлое их состояние но никогда не узнаете будущее их состояние,  а рынок двигает только теханализ который создаёт ожидание направления движения котировок валютных пар. Те кто вне тех анализа те несут деньги на счёт, те кто в тех анализе и играет по правилам - те снимают деньги со счёта. Всё, вот вся природа форекс. Вместо этой визуализированной бредятины прикрутите в советник пару тройку индикаторов с приёмами теханализа графика котировок и определения вектора дальнейшего движения котировок инструмента на рынке с вероятностью более 0,5, глядишь робо смску и отправит однажды всего убытков 49%, прибылей 51% И будет счастье :)))
 
Комментарии, не относящиеся к этой теме, были перенесены в "Своя концепция ГУИ".
 

В который раз захожу в тему чтобы  узнать что можно сделать с OpenCL прямо в терминале MetaTrader 5 без всяких DLL

но приходится читать бредовые холивары..Большая просьба..если не чего писать по теме,не пишите вообще...

 

Очень странно.

Похоже на утечку памяти именно в терминале.

Я написал скрипт для демонстрации. Хочу убедиться, что я ничего не упускаю и это действительно баг.

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


Память утекает, достаточно заметно. За минуту за сотню МБ.

В программе утечка исключена, т.к. MQLInfoInteger(MQL_MEMORY_USEDэто исключает.

Это действительно баг и стоит идти в сервисдеск?

Скрипт в журнале печатает количество потребляемой оперативки, как самой программой, так и терминалом.

 
Marat Sultanov:

Очень странно.

Похоже на утечку памяти именно в терминале.

Я написал скрипт для демонстрации. Хочу убедиться, что я ничего не упускаю и это действительно баг.


Память утекает, достаточно заметно. За минуту за сотню МБ.

В программе утечка исключена, т.к. MQLInfoInteger(MQL_MEMORY_USEDэто исключает.

Это действительно баг и стоит идти в сервисдеск?


результат исследований по данному вопросу здесь потом опубликуйте пожалуйста, что бы знать где собака порылась ))
 

Неужели, ни кто не использует OpenCL в практических задачах? :)

Konstantin:

результат исследований по данному вопросу здесь потом опубликуйте пожалуйста, что бы знать где собака порылась ))

Хорошо. Простите, вы как и я, из-за этого застряли, или вы просто для общего развития хотите знать?

 
Marat Sultanov:

Неужели, ни кто не использует OpenCL в практических задачах? :)


Я использую, но до вашего примера руки не дошли
 
Igor Volodin:

Я использую, но до вашего примера руки не дошли

Отлично. Скрипт в журнале печатает количество потребляемой оперативки, как самой программой, так и терминалом. Если вы запустите скрипт, то в журнале вы сразу увидите как растет потребляемое количество МБ оперативной памяти терминалом.

Вы используете интенсивные расчеты в своих программах?

Причина обращения: