以下是你可以在MetaTrader 5中直接使用OpenCL而不需要任何DLLs的情况 - 页 4 1234567891011...18 新评论 Andrey Dik 2016.12.10 13:03 #31 Alexey Volchanskiy: 是的,我对OCL有点熟悉,我知道的。你不必将整个EA加载到地图中,让他们加载一些并行的代码片段,它们通常是整个代码的一个百分比。 这样一来,你就不会为标准的专家顾问系统获得巨大的速度提升。一切都将受到代理商的带宽限制。 Renat Fatkhullin 2016.12.10 13:03 #32 Vitalie Postolache: 那么,为什么我在优化时只看到CPU核心(Core i5,8核心-8代理),而我有NVIDIA 780GTX?你在你的代码中使用OpenCL吗?最有可能的是,你认为你的任何代码都应该加载在显卡上。这是不正确的。 我强烈建议阅读我们关于MetaTrader 5中OpenCL的文章,其中详细解释了它是如何工作的。OpenCL:通往平行世界的桥梁OpenCL:从幼稚的编码到更合理的编码如何在计算中安装和使用OpenCL Andrey Dik 2016.12.10 13:06 #33 为了获得显着的加速,您需要将整个顾问发送到 GPU,但为此您需要编写自己的测试器。这是一个这样的测试器的例子, 一个带有交易逻辑的神经网络,OCL 代码: //———————————————————————————————————————————————————————————————————————————————————————————————— //Функция для ядра string GPU_kernel( int hl1NeuronCount, int hl2NeuronCount, int sampleCount, int signalCount){ return ( "#define HL1Count " + ( string )hl1NeuronCount + " \r\n" "#define HL2Count " + ( string )hl2NeuronCount + " \r\n" //------------------------------------------------------------------------------------ "#define NeuronSensitivity " + ( string )NeuronSensitivity_P + " \r\n" //------------------------------------------------------------------------------------ "#define sampleCount " + ( string )sampleCount + " \r\n" //------------------------------------------------------------------------------------ "#define signalCount " + ( string )signalCount + " \r\n" //------------------------------------------------------------------------------------ "#define StrArrSaSize " + ( string )( sizeof (ArrSample) / sizeof ( float )) + "\r\n" "typedef struct{float C[StrArrSaSize];} ArrSa; \r\n" //------------------------------------------------------------------------------------ "#define StrArrWeSize " + ( string )( sizeof (ArrWe) / sizeof ( float )) + " \r\n" "typedef struct{float C[StrArrWeSize];} ArrWe; \r\n" //------------------------------------------------------------------------------------ "#define StrArrCrSize " + ( string )( sizeof (ArrCr) / sizeof ( float )) + " \r\n" "typedef struct{float C[StrArrCrSize];}ArrCr; \r\n" //------------------------------------------------------------------------------------ "#define Spread " + ( string )(Spread_P * Point ()) + " \r\n" //------------------------------------------------------------------------------------ "#define Point " + ( string ) Point () + " \r\n" "#define SL " + ( string )(StopLoss_P * Point ()) + " \r\n" "#define TP " + ( string )(TakeProfit_P * Point ()) + " \r\n" //------------------------------------------------------------------------------------ " \r\n" "__kernel void Work(__global ArrSa *Sample, \r\n" " __global ArrWe *Weights, \r\n" " __global ArrCr *Result) \r\n" "{ \r\n" " int thread = get_global_id(0); \r\n" " \r\n" " //------------------Переменные нейронной сети---------------------------------\r\n" " float nHL1 [HL1Count]; // Нейроны первого скрытого слоя \r\n" " float nHL2 [HL2Count]; // Нейроны второго скрытого слоя \r\n" " ArrWe parametr = Weights[thread]; // Параметры системы \r\n" " int cnt_W = 0; // счетчик весов \r\n" " float out = 0.0; // выход сети \r\n" " \r\n" " //-------------------Переменные для торговли----------------------------------\r\n" " float temp = 0.0; // для временного хранения чего нибудь \r\n" " \r\n" " //---параметры цены \r\n" " float priceASK = 0.0; // текущая Ask цена \r\n" " float priceBID = 0.0; // текущая Bid цена \r\n" " float pricePrevHighASK = 0.0; // максимум предыдущей свечи Ask \r\n" " float pricePrevHighBID = 0.0; // максимум предыдущей свечи Bid \r\n" " float pricePrevLowASK = 0.0; // минимум предыдущей свечи Ask \r\n" " float pricePrevLowBID = 0.0; // минимум предыдущей свечи Bid \r\n" " \r\n" " float posType = 0.0; // тип сделки: \r\n" " // 1.0 - buy, \r\n" " //-1.0 - sell; \r\n" " // 0.0 - нет открытой сделки \r\n" " float posPriceClose = 0.0; \r\n" " float posPriceClosePrevHi = 0.0; \r\n" " float posPriceClosePrevLo = 0.0; \r\n" " \r\n" " //-----------------Текущие показатели позиции---------------------------------\r\n" " float posPriceSL = 0.0; // цена StopLoss открытой сделки \r\n" " float posPriceTP = 0.0; // цена TakeProfit открытой сделки \r\n" " \r\n" " //--------------------Статистика торговли-------------------------------------\r\n" " int StTradeProfitCount = 0; // кол-во приб. сделок \r\n" " int StTradeLossCount = 0; // кол-во уб. сделок \r\n" " \r\n" " int StTradeLossSeries = 0; // текущая серия убыточных ордеров \r\n" " int StTradeMaxLossSer = 0; // самая длинная серия уб.ордеров \r\n" " \r\n" " //-----------------------Тут прогон по истории--------------------------------\r\n" " for(int hist = 0;hist < sampleCount;hist++) \r\n" " { \r\n" " cnt_W = 0; \r\n" " //---------------Обработаем первый скрытый слой-----------------------------\r\n" " //Добавим смещение точек насыщения нейрона: (+b) \r\n" " for(int u = 0;u < HL1Count;u++) \r\n" " { \r\n" " nHL1[u] = parametr.C[cnt_W]; \r\n" " cnt_W++; \r\n" " } \r\n" " \r\n" " //Сумма произведений нейронов предыдущего слоя и их весов: \r\n" " // (+w1*x1+...+wn*xn) для каждого нейрона \r\n" " for(int u = 0;u < HL1Count;u++) \r\n" " { \r\n" " for(int i = 0;i < signalCount;i++) \r\n" " { \r\n" " nHL1[u] += Sample[hist].C[i + 3] * parametr.C[cnt_W]; \r\n" " cnt_W++; \r\n" " } \r\n" " } \r\n" " \r\n" " //Посчитаем функцию активации для каждого скрытого нейрона \r\n" " for(int u = 0;u < HL1Count;u++) \r\n" " { \r\n" " nHL1[u] = 5.0 * nHL1[u] / (1.0 + fabs(4.02 * nHL1[u])); \r\n" " } \r\n" " \r\n" " //---------------Обработаем второй скрытый слой-----------------------------\r\n" " //Добавим смещение точек насыщения нейрона: (+b) \r\n" " for(int u = 0;u < HL2Count;u++) \r\n" " { \r\n" " nHL2[u] = parametr.C[cnt_W]; \r\n" " cnt_W++; \r\n" " } \r\n" " \r\n" Here's what you can 轻松快捷开发 MetaTrader 程序的函数库 (第十九部分) 使用 OpenCL 测试烛形形态 Andrey Dik 2016.12.10 13:06 #34 代码继续: " //Сумма произведений нейронов предыдущего слоя и их весов: \r\n" " // (+w1*x1+...+wn*xn) для каждого нейрона \r\n" " for(int u = 0;u < HL2Count;u++) \r\n" " { \r\n" " for(int i = 0;i < HL1Count;i++) \r\n" " { \r\n" " nHL2[u] += nHL1[i] * parametr.C[cnt_W]; \r\n" " cnt_W++; \r\n" " } \r\n" " } \r\n" " \r\n" " //Посчитаем функцию активации для каждого скрытого нейрона \r\n" " for(int u = 0;u < HL2Count;u++) \r\n" " { \r\n" " nHL2[u] = 5.0 * nHL2[u] / (1.0 + fabs(4.02 * nHL2[u])); \r\n" " } \r\n" " \r\n" " //-----------------Обработаем выходной слой---------------------------------\r\n" " //Добавим смещение точек насыщения нейрона: (+b) \r\n" " out = parametr.C[cnt_W]; \r\n" " cnt_W++; \r\n" " \r\n" " //Сумма произведений нейронов предыдущего слоя и их весов: \r\n" " // (+w1*x1+...+wn*xn) для каждого нейрона \r\n" " for(int i = 0;i < HL2Count;i++) \r\n" " { \r\n" " out += nHL2[i] * parametr.C[cnt_W]; \r\n" " cnt_W++; \r\n" " } \r\n" " //==========================================================================\r\n" " \r\n" " \r\n" " //==========================================================================\r\n" " priceASK = Sample[hist].C[0] + Spread; \r\n" " priceBID = Sample[hist].C[0]; \r\n" " \r\n" " pricePrevHighASK = Sample[hist].C[1] + Spread; \r\n" " pricePrevHighBID = Sample[hist].C[1]; \r\n" " \r\n" " pricePrevLowASK = Sample[hist].C[2] + Spread; \r\n" " pricePrevLowBID = Sample[hist].C[2]; \r\n" " \r\n" " //-----------------проверка условий на выход из рынка-----------------------\r\n" " // если есть открытая поза \r\n" " if(posType != 0.0) \r\n" " { \r\n" " if(posType == 1.0) \r\n" " { \r\n" " posPriceClose = priceBID; \r\n" " posPriceClosePrevHi = pricePrevHighBID; \r\n" " posPriceClosePrevLo = pricePrevLowBID; \r\n" " } \r\n" " else \r\n" " { \r\n" " posPriceClose = priceASK; \r\n" " posPriceClosePrevHi = pricePrevHighASK; \r\n" " posPriceClosePrevLo = pricePrevLowASK; \r\n" " } \r\n" " \r\n" " \r\n" " // может уже сработал SL? \r\n" " if(posType * (posPriceSL - posPriceClose) >= 0.0 || \r\n" " posType * (posPriceSL - posPriceClosePrevLo) >= 0.0) \r\n" " { \r\n" " // на одну убыточную сделку больше \r\n" " StTradeLossCount++; \r\n" " // текущая серия убыточных сделок увеличилась \r\n" " StTradeLossSeries++; \r\n" " // если серия уб. сделок больше чем в истори, то запомним \r\n" " StTradeMaxLossSer = (StTradeMaxLossSer < StTradeLossSeries) ? \r\n" " StTradeLossSeries : StTradeMaxLossSer; \r\n" " // позиция закрыта \r\n" " posType = 0.0; \r\n" " } \r\n" " // нет, SL не сработал \r\n" " else \r\n" " { \r\n" " // может уже сработал TP? \r\n" " if(posType * (posPriceClose - posPriceTP) >= 0.0 || \r\n" " posType * (posPriceClosePrevHi - posPriceTP) >= 0.0) \r\n" " { \r\n" " // на одну прибыльную сделку больше \r\n" " StTradeProfitCount++; \r\n" " // текущая серия убыточных сделок закончилась \r\n" " StTradeLossSeries = 0; \r\n" " // позиция закрыта \r\n" " posType = 0.0; \r\n" " } \r\n" " } \r\n" " \r\n" " } \r\n" " //--------------------------------------------------------------------------\r\n" " \r\n" " \r\n" " //-----------------проверка сигнала на вход в рынок-------------------------\r\n" " // если нет открытых поз проверим возможность открытия \r\n" " if(posType == 0.0 && hist < (sampleCount - 1)) \r\n" " { \r\n" " // если есть сигнал на покупку \r\n" " if(NeuronSensitivity < out) \r\n" " { \r\n" " posPriceTP = priceASK + TP; \r\n" " posPriceSL = priceASK - SL; \r\n" " posType = 1.0; \r\n" " } \r\n" " // если есть сигнал на продажу \r\n" " if(out < -NeuronSensitivity) \r\n" " { \r\n" " posPriceSL = priceBID + SL; \r\n" " posPriceTP = priceBID - TP; \r\n" " posType = -1.0; \r\n" " } \r\n" " } \r\n" " } \r\n" " \r\n" " \r\n" " //----------------------------------------------------------------------------\r\n" " float Profit = ((float)StTradeProfitCount*TP)-((float)StTradeLossCount*SL); \r\n" " Result[thread].C[0] = Profit; \r\n" " Result[thread].C[1] = -StTradeMaxLossSer; \r\n" "} \r\n" );} //———————————————————————————————————————————————————————————————————————————————————————————————— Here's what you can 轻松快捷开发 MetaTrader 程序的函数库 (第十九部分) 轻松快捷开发 MetaTrader 程序的函数库(第一部分)。 概念,数据管理和首期成果 Maxim Romanov 2016.12.10 13:09 #35 Renat Fatkhullin:这不仅展示了MQL5代码中的GPU计算,而且还展示了终端的图形功能。 附上作为脚本的完整源代码。OpenCL 1.2上的错误已被修复。 这真是太酷了!我将制作3D图形,会很方便的。而且,对于一个大型项目来说,速度会很好。我今天会过来给它试运行)。 Alexey Volchanskiy 2016.12.10 13:13 #36 Andrey Dik:的延续性代码。顺便问一下,有没有可能不以逐行工作表的形式向OCL发送代码,而是以某种文件的形式发送?否则,它看起来有点令人毛骨悚然。 Andrey Dik 2016.12.10 13:15 #37 Alexey Volchanskiy:顺便问一下,有没有可能不以逐行工作表的形式向OCL发送代码,而是以某种文件的形式发送?它看起来有点令人毛骨悚然。 OCL代码只是一个字符串。你可以将文件读入字符串变量,并将其发送到GPU。 Dmitriy Skub 2016.12.10 13:38 #38 这对我来说是无效的( Renat Fatkhullin 2016.12.10 13:43 #39 值得注意的是,现在,在2016年底,已经可以宣称目标系统中存在OpenCL。即使没有GPU,OpenCL也会使用所有内核在CPU上运行。这就是设备组的样子。OpenCL Device #0: GPU Advanced Micro Devices, Inc. Hawaii with OpenCL 2.0 (44 units, 1080 MHz, 8192 Mb, version 2117.13 (VM), rating 1760) OpenCL Device #1: CPU GenuineIntel Intel(R) Xeon(R) CPU E5-2690 v3 @ 2.60 GHz with OpenCL 1.2 (24 units, 2598 MHz, 32680 Mb, version 2117.13 (sse2,avx), rating 85)终端会根据性能等级自动选择最快的设备。也可以通过CLContextCreate 功能手动选择任何设备。不幸的是,忘记Windows XP上的OpenCL吧。还有一般的32位操作系统--现在是2017年了。更令人不快的是Nvidia的情况,它基本上是在破坏OpenCL标准,不实施OpenCL 2.0。它先是破坏了OpenCL 1.2的实施,现在又破坏了OpenCL 2.0。它这样做是为了推广自己的CUDA实现,这损害了整个社区。 此外,Nvidia故意降低其玩家卡的精度,以限制其在数学中的使用,并刺激购买专门的卡(Tesla)。在这种背景下,AMD看起来正在获胜,不仅是因为他们的数学速度明显更快(通常在AMD上建立的矿工农场),而且还因为他们的开放标准战略(他们已经非常开放并正在向公共领域推进)。AMD显卡中OpenCL 2.0的引入使这一规范非常接近于CUDA的能力,现在为CUDA打基础根本没有意义。 Here's what you can Renat Fatkhullin 2016.12.10 13:49 #40 很快,我们将允许在MQL5云计算网络 中使用OpenCL,至少在CPU实现方面。 Распределенные вычисления в сети MQL5 Cloud Network cloud.mql5.com Заработать деньги, продавая мощности своего компьютера для сети распределенных вычислений MQL5 Cloud Network 1234567891011...18 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
是的,我对OCL有点熟悉,我知道的。你不必将整个EA加载到地图中,让他们加载一些并行的代码片段,它们通常是整个代码的一个百分比。
那么,为什么我在优化时只看到CPU核心(Core i5,8核心-8代理),而我有NVIDIA 780GTX?
你在你的代码中使用OpenCL吗?
最有可能的是,你认为你的任何代码都应该加载在显卡上。这是不正确的。
我强烈建议阅读我们关于MetaTrader 5中OpenCL的文章,其中详细解释了它是如何工作的。
为了获得显着的加速,您需要将整个顾问发送到 GPU,但为此您需要编写自己的测试器。
这是一个这样的测试器的例子, 一个带有交易逻辑的神经网络,OCL 代码:
//Функция для ядра
string GPU_kernel( int hl1NeuronCount,
int hl2NeuronCount,
int sampleCount,
int signalCount)
{
return
(
"#define HL1Count " + ( string )hl1NeuronCount + " \r\n"
"#define HL2Count " + ( string )hl2NeuronCount + " \r\n"
//------------------------------------------------------------------------------------
"#define NeuronSensitivity " + ( string )NeuronSensitivity_P + " \r\n"
//------------------------------------------------------------------------------------
"#define sampleCount " + ( string )sampleCount + " \r\n"
//------------------------------------------------------------------------------------
"#define signalCount " + ( string )signalCount + " \r\n"
//------------------------------------------------------------------------------------
"#define StrArrSaSize " + ( string )( sizeof (ArrSample) / sizeof ( float )) + "\r\n"
"typedef struct{float C[StrArrSaSize];} ArrSa; \r\n"
//------------------------------------------------------------------------------------
"#define StrArrWeSize " + ( string )( sizeof (ArrWe) / sizeof ( float )) + " \r\n"
"typedef struct{float C[StrArrWeSize];} ArrWe; \r\n"
//------------------------------------------------------------------------------------
"#define StrArrCrSize " + ( string )( sizeof (ArrCr) / sizeof ( float )) + " \r\n"
"typedef struct{float C[StrArrCrSize];}ArrCr; \r\n"
//------------------------------------------------------------------------------------
"#define Spread " + ( string )(Spread_P * Point ()) + " \r\n"
//------------------------------------------------------------------------------------
"#define Point " + ( string ) Point () + " \r\n"
"#define SL " + ( string )(StopLoss_P * Point ()) + " \r\n"
"#define TP " + ( string )(TakeProfit_P * Point ()) + " \r\n"
//------------------------------------------------------------------------------------
" \r\n"
"__kernel void Work(__global ArrSa *Sample, \r\n"
" __global ArrWe *Weights, \r\n"
" __global ArrCr *Result) \r\n"
"{ \r\n"
" int thread = get_global_id(0); \r\n"
" \r\n"
" //------------------Переменные нейронной сети---------------------------------\r\n"
" float nHL1 [HL1Count]; // Нейроны первого скрытого слоя \r\n"
" float nHL2 [HL2Count]; // Нейроны второго скрытого слоя \r\n"
" ArrWe parametr = Weights[thread]; // Параметры системы \r\n"
" int cnt_W = 0; // счетчик весов \r\n"
" float out = 0.0; // выход сети \r\n"
" \r\n"
" //-------------------Переменные для торговли----------------------------------\r\n"
" float temp = 0.0; // для временного хранения чего нибудь \r\n"
" \r\n"
" //---параметры цены \r\n"
" float priceASK = 0.0; // текущая Ask цена \r\n"
" float priceBID = 0.0; // текущая Bid цена \r\n"
" float pricePrevHighASK = 0.0; // максимум предыдущей свечи Ask \r\n"
" float pricePrevHighBID = 0.0; // максимум предыдущей свечи Bid \r\n"
" float pricePrevLowASK = 0.0; // минимум предыдущей свечи Ask \r\n"
" float pricePrevLowBID = 0.0; // минимум предыдущей свечи Bid \r\n"
" \r\n"
" float posType = 0.0; // тип сделки: \r\n"
" // 1.0 - buy, \r\n"
" //-1.0 - sell; \r\n"
" // 0.0 - нет открытой сделки \r\n"
" float posPriceClose = 0.0; \r\n"
" float posPriceClosePrevHi = 0.0; \r\n"
" float posPriceClosePrevLo = 0.0; \r\n"
" \r\n"
" //-----------------Текущие показатели позиции---------------------------------\r\n"
" float posPriceSL = 0.0; // цена StopLoss открытой сделки \r\n"
" float posPriceTP = 0.0; // цена TakeProfit открытой сделки \r\n"
" \r\n"
" //--------------------Статистика торговли-------------------------------------\r\n"
" int StTradeProfitCount = 0; // кол-во приб. сделок \r\n"
" int StTradeLossCount = 0; // кол-во уб. сделок \r\n"
" \r\n"
" int StTradeLossSeries = 0; // текущая серия убыточных ордеров \r\n"
" int StTradeMaxLossSer = 0; // самая длинная серия уб.ордеров \r\n"
" \r\n"
" //-----------------------Тут прогон по истории--------------------------------\r\n"
" for(int hist = 0;hist < sampleCount;hist++) \r\n"
" { \r\n"
" cnt_W = 0; \r\n"
" //---------------Обработаем первый скрытый слой-----------------------------\r\n"
" //Добавим смещение точек насыщения нейрона: (+b) \r\n"
" for(int u = 0;u < HL1Count;u++) \r\n"
" { \r\n"
" nHL1[u] = parametr.C[cnt_W]; \r\n"
" cnt_W++; \r\n"
" } \r\n"
" \r\n"
" //Сумма произведений нейронов предыдущего слоя и их весов: \r\n"
" // (+w1*x1+...+wn*xn) для каждого нейрона \r\n"
" for(int u = 0;u < HL1Count;u++) \r\n"
" { \r\n"
" for(int i = 0;i < signalCount;i++) \r\n"
" { \r\n"
" nHL1[u] += Sample[hist].C[i + 3] * parametr.C[cnt_W]; \r\n"
" cnt_W++; \r\n"
" } \r\n"
" } \r\n"
" \r\n"
" //Посчитаем функцию активации для каждого скрытого нейрона \r\n"
" for(int u = 0;u < HL1Count;u++) \r\n"
" { \r\n"
" nHL1[u] = 5.0 * nHL1[u] / (1.0 + fabs(4.02 * nHL1[u])); \r\n"
" } \r\n"
" \r\n"
" //---------------Обработаем второй скрытый слой-----------------------------\r\n"
" //Добавим смещение точек насыщения нейрона: (+b) \r\n"
" for(int u = 0;u < HL2Count;u++) \r\n"
" { \r\n"
" nHL2[u] = parametr.C[cnt_W]; \r\n"
" cnt_W++; \r\n"
" } \r\n"
" \r\n"
代码继续:
" // (+w1*x1+...+wn*xn) для каждого нейрона \r\n"
" for(int u = 0;u < HL2Count;u++) \r\n"
" { \r\n"
" for(int i = 0;i < HL1Count;i++) \r\n"
" { \r\n"
" nHL2[u] += nHL1[i] * parametr.C[cnt_W]; \r\n"
" cnt_W++; \r\n"
" } \r\n"
" } \r\n"
" \r\n"
" //Посчитаем функцию активации для каждого скрытого нейрона \r\n"
" for(int u = 0;u < HL2Count;u++) \r\n"
" { \r\n"
" nHL2[u] = 5.0 * nHL2[u] / (1.0 + fabs(4.02 * nHL2[u])); \r\n"
" } \r\n"
" \r\n"
" //-----------------Обработаем выходной слой---------------------------------\r\n"
" //Добавим смещение точек насыщения нейрона: (+b) \r\n"
" out = parametr.C[cnt_W]; \r\n"
" cnt_W++; \r\n"
" \r\n"
" //Сумма произведений нейронов предыдущего слоя и их весов: \r\n"
" // (+w1*x1+...+wn*xn) для каждого нейрона \r\n"
" for(int i = 0;i < HL2Count;i++) \r\n"
" { \r\n"
" out += nHL2[i] * parametr.C[cnt_W]; \r\n"
" cnt_W++; \r\n"
" } \r\n"
" //==========================================================================\r\n"
" \r\n"
" \r\n"
" //==========================================================================\r\n"
" priceASK = Sample[hist].C[0] + Spread; \r\n"
" priceBID = Sample[hist].C[0]; \r\n"
" \r\n"
" pricePrevHighASK = Sample[hist].C[1] + Spread; \r\n"
" pricePrevHighBID = Sample[hist].C[1]; \r\n"
" \r\n"
" pricePrevLowASK = Sample[hist].C[2] + Spread; \r\n"
" pricePrevLowBID = Sample[hist].C[2]; \r\n"
" \r\n"
" //-----------------проверка условий на выход из рынка-----------------------\r\n"
" // если есть открытая поза \r\n"
" if(posType != 0.0) \r\n"
" { \r\n"
" if(posType == 1.0) \r\n"
" { \r\n"
" posPriceClose = priceBID; \r\n"
" posPriceClosePrevHi = pricePrevHighBID; \r\n"
" posPriceClosePrevLo = pricePrevLowBID; \r\n"
" } \r\n"
" else \r\n"
" { \r\n"
" posPriceClose = priceASK; \r\n"
" posPriceClosePrevHi = pricePrevHighASK; \r\n"
" posPriceClosePrevLo = pricePrevLowASK; \r\n"
" } \r\n"
" \r\n"
" \r\n"
" // может уже сработал SL? \r\n"
" if(posType * (posPriceSL - posPriceClose) >= 0.0 || \r\n"
" posType * (posPriceSL - posPriceClosePrevLo) >= 0.0) \r\n"
" { \r\n"
" // на одну убыточную сделку больше \r\n"
" StTradeLossCount++; \r\n"
" // текущая серия убыточных сделок увеличилась \r\n"
" StTradeLossSeries++; \r\n"
" // если серия уб. сделок больше чем в истори, то запомним \r\n"
" StTradeMaxLossSer = (StTradeMaxLossSer < StTradeLossSeries) ? \r\n"
" StTradeLossSeries : StTradeMaxLossSer; \r\n"
" // позиция закрыта \r\n"
" posType = 0.0; \r\n"
" } \r\n"
" // нет, SL не сработал \r\n"
" else \r\n"
" { \r\n"
" // может уже сработал TP? \r\n"
" if(posType * (posPriceClose - posPriceTP) >= 0.0 || \r\n"
" posType * (posPriceClosePrevHi - posPriceTP) >= 0.0) \r\n"
" { \r\n"
" // на одну прибыльную сделку больше \r\n"
" StTradeProfitCount++; \r\n"
" // текущая серия убыточных сделок закончилась \r\n"
" StTradeLossSeries = 0; \r\n"
" // позиция закрыта \r\n"
" posType = 0.0; \r\n"
" } \r\n"
" } \r\n"
" \r\n"
" } \r\n"
" //--------------------------------------------------------------------------\r\n"
" \r\n"
" \r\n"
" //-----------------проверка сигнала на вход в рынок-------------------------\r\n"
" // если нет открытых поз проверим возможность открытия \r\n"
" if(posType == 0.0 && hist < (sampleCount - 1)) \r\n"
" { \r\n"
" // если есть сигнал на покупку \r\n"
" if(NeuronSensitivity < out) \r\n"
" { \r\n"
" posPriceTP = priceASK + TP; \r\n"
" posPriceSL = priceASK - SL; \r\n"
" posType = 1.0; \r\n"
" } \r\n"
" // если есть сигнал на продажу \r\n"
" if(out < -NeuronSensitivity) \r\n"
" { \r\n"
" posPriceSL = priceBID + SL; \r\n"
" posPriceTP = priceBID - TP; \r\n"
" posType = -1.0; \r\n"
" } \r\n"
" } \r\n"
" } \r\n"
" \r\n"
" \r\n"
" //----------------------------------------------------------------------------\r\n"
" float Profit = ((float)StTradeProfitCount*TP)-((float)StTradeLossCount*SL); \r\n"
" Result[thread].C[0] = Profit; \r\n"
" Result[thread].C[1] = -StTradeMaxLossSer; \r\n"
"} \r\n"
);
}
//————————————————————————————————————————————————————————————————————————————————————————————————
这不仅展示了MQL5代码中的GPU计算,而且还展示了终端的图形功能。
附上作为脚本的完整源代码。OpenCL 1.2上的错误已被修复。
的延续性代码。
顺便问一下,有没有可能不以逐行工作表的形式向OCL发送代码,而是以某种文件的形式发送?否则,它看起来有点令人毛骨悚然。
顺便问一下,有没有可能不以逐行工作表的形式向OCL发送代码,而是以某种文件的形式发送?它看起来有点令人毛骨悚然。
值得注意的是,现在,在2016年底,已经可以宣称目标系统中存在OpenCL。
即使没有GPU,OpenCL也会使用所有内核在CPU上运行。这就是设备组的样子。
OpenCL Device #1: CPU GenuineIntel Intel(R) Xeon(R) CPU E5-2690 v3 @ 2.60 GHz with OpenCL 1.2 (24 units, 2598 MHz, 32680 Mb, version 2117.13 (sse2,avx), rating 85)
终端会根据性能等级自动选择最快的设备。也可以通过CLContextCreate 功能手动选择任何设备。
不幸的是,忘记Windows XP上的OpenCL吧。还有一般的32位操作系统--现在是2017年了。
更令人不快的是Nvidia的情况,它基本上是在破坏OpenCL标准,不实施OpenCL 2.0。它先是破坏了OpenCL 1.2的实施,现在又破坏了OpenCL 2.0。它这样做是为了推广自己的CUDA实现,这损害了整个社区。
此外,Nvidia故意降低其玩家卡的精度,以限制其在数学中的使用,并刺激购买专门的卡(Tesla)。
在这种背景下,AMD看起来正在获胜,不仅是因为他们的数学速度明显更快(通常在AMD上建立的矿工农场),而且还因为他们的开放标准战略(他们已经非常开放并正在向公共领域推进)。AMD显卡中OpenCL 2.0的引入使这一规范非常接近于CUDA的能力,现在为CUDA打基础根本没有意义。