以下是你可以在MetaTrader 5中直接使用OpenCL而不需要任何DLLs的情况 - 页 11

 
fxsaber:

显然,algotrader的编程目标就是你所说的这样的东西--所有的交易逻辑都在几行中。

在这个例子中,为了让信号显示出积极的趋势,整个自动交易的目标实际上只包含在一条线上

这与秩序逻辑无关,但对TS的结果有决定性作用。


"完全一样的线 "是在任何有能力的专家顾问。而这是由algotraders编写的。


那么它在实际交易中显示了什么呢?你的心情不好。当然,问题(如果有的话)在于一些与实际工作有关的、无法解释的小事(一些跳跃性的ping,数据包丢失,或网络中的电压波动,由于这些原因,roba出现了问题。顺便说一下,这也是我的主题,我正在慢慢地建造一个机器人。
 
Alexey Oreshkin:

为什么?
我根本就没有为机器人做过gui,我不认为有必要在上面浪费时间。

我也不明白你如何能直观地分析统计套利策略))。所有的分析都只是计算数据,但在调试阶段有足够的日志可供分析。例如,这样的数据被用于策略的调试 阶段,但其可视化不会告诉我们任何东西。

附加的文件:
 
fxsaber:

显然,algotrader的编程目标就是你所说的这样的东西--所有的交易逻辑都在几行中。

在这个例子中,为了让信号显示出积极的趋势,整个自动交易的目标实际上只包含在一条线上

这与秩序逻辑无关,但对TS的结果有决定性作用。


"完全一样的线 "是在任何有能力的专家顾问。而这是由algotraders编写的。


蜱虫只适合用于剥头皮。他们甚至不能相信封闭式算法的短期策略,因为一半的头寸会被卡在平盘中,因为没有技术分析,无法正确入场。你将随机进入,结果将是适当的。正如有识之士告诉我的那样,刻度线对策略测试很有帮助,而且它们使我的股票工作更加有效。 但什么样的刻度线条目可能是--只是为了剥头皮,比如进场-出场和5-10镑的利润。这是纯粹的迭代,没有任何信息。 再一次,你知道他们过去的状态,但你永远不会知道他们未来的状态。这就是外汇的本质。 在你的专家顾问上附加几个指标,它们会分析图表,并以超过0.5的概率确定价格进一步移动的矢量,而不是这种可视化的废话。)
 
与本主题无关的评论已被移至"GUI概念"。
 

我再次来到这个话题,想知道在没有任何DLL的情况下,可以 MetaTrader 5终端 中直接使用OpenCL做什么。

我必须要读狗屁的喧嚣......拜托,如果你对这个问题没有什么可写的,就不要写......

 

非常奇怪。

看起来正是终端的内存泄漏。

我写了一个脚本来演示它。我想确保我没有遗漏任何东西,而且这真的是一个错误。

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


内存正在泄漏,相当明显。每分钟一百MB。

由于MQLInfoInteger(MQL_MEMORY_USED) 将其排除在外,所以程序中的泄漏被排除。

这真的是一个错误,我应该去找服务台吗?

脚本在日志中打印出程序本身和终端所消耗的RAM数量。

 
Marat Sultanov:

非常奇怪。

看起来正是终端的内存泄漏。

我写了一个脚本来演示它。我想确保我没有遗漏任何东西,而且这真的是一个错误。


内存正在泄漏,相当明显。每分钟一百MB。

由于MQLInfoInteger(MQL_MEMORY_USED) 将其排除在外,所以程序中的泄漏被排除。

这真的是一个bug吗,值得去找servicedesk吗?


请以后在这里公布有关这一问题的研究结果,以便我们知道狗被埋在哪里 ))
 

难道没有人在实际任务中使用OpenCL吗?:)

Konstantin:

请在这里公布你对这个问题的研究结果,以便你知道狗被埋在哪里 ))

好的。对不起,你是否像我一样,因为这个问题而卡住了,或者你只是想知道一般的发展?

 
Marat Sultanov:

难道没有人在实际任务中使用OpenCL吗?:)


我有,但我还没来得及看你的例子
 
Igor Volodin:

我有,但我还没来得及看你的例子

很好。该脚本在日志中打印出程序本身和终端所消耗的RAM量。如果你运行这个脚本,你会立即在日志中看到终端消耗了多少MB的RAM。

你在你的程序中使用密集计算吗?