初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1340 1...133313341335133613371338133913401341134213431344134513461347...1503 新评论 Kira27 2021.08.29 23:39 #13391 所以,事实证明,脚本 void OnStart() { int Target=6; //Количество тайм-фреймов int Counter_UP=0; //Счетчик нахождения цены над МА int Counter_DOWN=0; int MA = 200; //Период МА double bufer_MA[]; //Буфер для хендла ENUM_TIMEFRAMES frame1[10]; //Битная маска тайм-фреймов //___________________int битная маска ENUM Массив таймфреймов__________________________________________ frame1[1]=1; frame1[2]=5; frame1[3]=15; frame1[4]=30; frame1[5]=16385; frame1[6]=16388; frame1[7]=16408; frame1[8]=32769; frame1[9]=49153; //____________________________________________________________________________________________________________ int KollSymbols = SymbolsTotal(true); //Колл. символов в маркет вотч Alert("Колл.Инстр = ",KollSymbols); //--- int MA200; //Переменная для хендла for(int i=0; i<KollSymbols; i++) //Перебераем все символы из маркет вотч { string symbol = SymbolName(i,true); //Выбираем имя символа из маркет вотч // Alert("symbol = ",symbol,"i= ",i); for(int I=1; I<=Target; I++) //Перебераем таймфреймы { MA200 = iMA(symbol,frame1[I],MA,0,MODE_EMA,PRICE_MEDIAN); //хендл на выбранном тайме CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма ArraySetAsSeries(bufer_MA,true); //Разворачиваем массив как в тайм-серии //Alert("Символ - ",symbol,"i= ",i); // Alert("Simbol = ",symbol," bufer_MA[1] = ",bufer_MA[1]); if(iClose(symbol,frame1[I],1) > bufer_MA[1]) //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре { //Alert("iClose= ",iClose(symbol,frame1[I],1), " bufer_MA[1]= ",bufer_MA[1]); Counter_UP++; if(Counter_UP==Target) Alert("Инструмент для наблюдения в покупки - ",symbol); ArrayFree(bufer_MA); //Очистка буфера индикатора } else { ArrayFree(bufer_MA); //Очистка буфера индикатора } IndicatorRelease(MA200); //Удаление хендла } Counter_UP=0; Counter_DOWN=0; } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ 它工作正常。 还有22种乐器的清单。 它花了大约5分钟,但很奇怪,它大部分时间都在向数组写句柄。 剖析结果 问题:为什么从一个句柄复制5个值到一个数组会如此耗时,而对于列表中的22个工具,要复制132次,也就是说,对于273个工具,我需要复制1632次,而且还要加载硬盘上所有工具的历史记录。 Kira27 2021.08.29 23:40 #13392 Fast235 #:关于创建和删除手柄。它是有效的,我对正确的方法感兴趣,我希望开发者能告诉我。 这就是我在做的事,看看上面的代码,也有问题)) Aleksandr Slavskii 2021.08.30 14:13 #13393 Kira27 #: 所以,事实证明,该剧本 工作正常,22个工具的列表需要大约5分钟来处理。 但这很奇怪,它花了大部分时间将句柄写到数组中。 剖析结果问题:为什么从一个句柄复制5个值到一个数组如此耗时,而对列表中的22个工具进行了132次复制,也就是说,对于273个工具,我需要对所有的工具进行1632次的历史加载,并复制到我的硬盘中。 如果我没记错的话。 它似乎正常工作,如果报价已经被下载,它不会变慢。第一次启动是非常长的,显然它下载了引号。 //+------------------------------------------------------------------+ void OnStart() { int Target = 6; //Количество тайм-фреймов int Counter_UP = 0; //Счетчик нахождения цены над МА int Counter_DOWN = 0; int MA = 200; //Период МА double bufer_MA[]; //Буфер для хендла int MA200[][9]; //Переменная для хендла string symbol[]; ENUM_TIMEFRAMES frame1[9]; //Битная маска тайм-фреймов //___________________int битная маска ENUM Массив таймфреймов__________________________________________ frame1[0] = 1; frame1[1] = 5; frame1[2] = 15; frame1[3] = 30; frame1[4] = 16385; frame1[5] = 16388; frame1[6] = 16408; frame1[7] = 32769; frame1[8] = 49153; //____________________________________________________________________________________________________________ int KollSymbols = SymbolsTotal(true); //Колл. символов в маркет вотч Print("Колл.Инстр = ", KollSymbols); int res = 0; for(int i = 0; i < KollSymbols; i++) { for(int I = 0; I < 9; I++) //Перебераем таймфреймы { ArrayResize(MA200, i + 1); ArrayResize(symbol, i + 1); symbol[i] = SymbolName(i, true); //Выбираем имя символа из маркет вотч MA200[i][I] = iMA(symbol[i], frame1[I], MA, 0, MODE_EMA, PRICE_MEDIAN); //хендл на выбранном тайме if(MA200[i][I] == INVALID_HANDLE) PrintFormat("Инвалид хэндл, символ %s, тайм %d", symbol[i], frame1[I]); res++; } } Print("Создано хэндлов = " + (string)res); //--- for(int i = 0; i < KollSymbols; i++) { for(int I = 0; I < 9; I++) //Перебераем таймфреймы { int size = CopyBuffer(MA200[i][I], 0, 1, 1, bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма PrintFormat("Скопировано %d, символ %s, тайм %d", size, symbol[i], frame1[I]); if(size > 0) if(iClose(symbol[i], frame1[I], 1) > bufer_MA[0]) //Если цена 1 баре, на выбранном символе и тайме, БОЛЬШЕ цены скользяхи на 1 баре { Counter_UP++; } } } Print("Counter_UP = " + (string)Counter_UP); } //+------------------------------------------------------------------+ Aleksei Stepanenko 2021.08.30 21:41 #13394 Kira27 #:脚本的重点是在1分钟到4小时的时间段内,通过市场观察的每一个工具。 如果我要做这样的事情,我会创建一个数组,将过去的数据存储在其中,更新当前的数据。这将避免沉重的循环和CopyBuffer。一切都会飞起来。 Kira27 2021.08.30 22:33 #13395 Aleksandr Slavskii #:如果我没记错的话。它似乎工作得很好,如果下载了报价,它的速度就不会变慢。第一次启动需要很长的时间,我想它是在下载引言。 谢谢你的反馈和你的程序版本,我会尝试的)!我只想知道为什么在完成程序前不删除手柄,或者程序完成后会自动删除,但根据任务管理器,内存没有被释放。 Kira27 2021.08.30 22:34 #13396 Aleksei Stepanenko #:如果我要做这样的事情,我会创建一个数组,将过去的数据存储在其中,更新当前的数据。这将避免沉重的循环和CopyBuffer。一切都会飞起来。 谢谢!我也会考虑的) Aleksandr Slavskii 2021.08.31 08:21 #13397 Kira27 #:谢谢你的反馈和你的版本,我将进行实验)!我不明白的是,为什么你不在终止程序前删除句柄? 或者从任务管理器来看,它们在程序结束时被自动删除,尽管内存没有被释放。 我在某处读到,在脚本终止后,指标句柄会在一定时间间隔后自动删除。但这并不准确。 pips 2021.09.05 01:14 #13398 问候!能否 请您在MQL5中测试EA后,当鼠标悬停在箭头上时,如何在弹出窗口中输出我的任何统计数据? Mikhail Rudyk 2021.09.07 15:04 #13399 你好 该终端有一个线性回归 工具 有一些脚本可以用图形对象绘制相同的通道 但只有中心线画得正确,偏离线的画法与中心线的距离不正确。 建议如果有人知道计算偏差的正确公式,它应该像在终端一样 或者,也许有一个现成的解决方案 谢谢你 Dmitrii Solovei 2021.09.09 09:35 #13400 你好! 你能告诉我为什么在用AMarkets经纪商测试时,加密货币的OrderSend功能 不工作。我找不到法规对加密货币交易顾问的任何禁止规定。或者我的代码中有错误? GetLastError给出了错误4756 #property copyright "qwerty" #property link "qwerty@list.ru" #property version "1.00" //----------------- //----------------- #include <Trade\PositionInfo.mqh> #include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\AccountInfo.mqh> //----------------- //----------------- CPositionInfo aPosition; CTrade aTrade; CSymbolInfo aSymbol; CAccountInfo aAccount; //----------------- //----------------- int Slippage = 3000; //--- //--------------------------------- //------пробные переменные double LotsCrypto = 0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(!aSymbol.Name(Symbol())) return(INIT_FAILED); RefreshRates(); //---устанавливаем допустимое проскальзывание aTrade.SetDeviationInPoints(Slippage); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { RefreshRates(); LotsCrypto = 0.1; if(OpenSellPosition(aSymbol.Name(), LotsCrypto, NULL, Slippage, ORDER_FILLING_RETURN)) Print("Ура"); Comment("Symbol.Name = " + string(aSymbol.Name()) + "\n" + "Ask = " + string(aSymbol.Ask()) + "\n"+ "GetLastError = " + string(GetLastError()) + "\n"+ "LotsCrypto = " + string(LotsCrypto)); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //+ Обновление котировок + //+------------------------------------------------------------------+ bool RefreshRates() { if(!aSymbol.RefreshRates()) { Print("Не удалось обновить котировки валютной пары!"); return(false); } if(aSymbol.Ask() == 0 || aSymbol.Bid() == 0) return(false); return(true); } //+------------------------------------------------------------------+ bool OpenSellPosition(string symbol, double volume, string comment="", ulong deviation=1000, ENUM_ORDER_TYPE_FILLING filling=ORDER_FILLING_FOK) { MqlTradeRequest Request; MqlTradeResult Results; ZeroMemory(Request); ZeroMemory(Results); Request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID); Request.action=TRADE_ACTION_DEAL; Request.type=ORDER_TYPE_SELL; Request.symbol=symbol; Request.volume=volume; Request.deviation=deviation; Request.comment=comment; Request.type_filling=filling; bool res=false; res=OrderSend(Request,Results); if(res) { if(Results.deal>0) return(true); else return(false); } return(false); } //+------------------------------------------------------------------+ 1...133313341335133613371338133913401341134213431344134513461347...1503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
它工作正常。 还有22种乐器的清单。 它花了大约5分钟,但很奇怪,它大部分时间都在向数组写句柄。 剖析结果
问题:为什么从一个句柄复制5个值到一个数组会如此耗时,而对于列表中的22个工具,要复制132次,也就是说,对于273个工具,我需要复制1632次,而且还要加载硬盘上所有工具的历史记录。
关于创建和删除手柄。
它是有效的,我对正确的方法感兴趣,我希望开发者能告诉我。
这就是我在做的事,看看上面的代码,也有问题))
所以,事实证明,该剧本
工作正常,22个工具的列表需要大约5分钟来处理。 但这很奇怪,它花了大部分时间将句柄写到数组中。 剖析结果
问题:为什么从一个句柄复制5个值到一个数组如此耗时,而对列表中的22个工具进行了132次复制,也就是说,对于273个工具,我需要对所有的工具进行1632次的历史加载,并复制到我的硬盘中。
如果我没记错的话。
它似乎正常工作,如果报价已经被下载,它不会变慢。第一次启动是非常长的,显然它下载了引号。
脚本的重点是在1分钟到4小时的时间段内,通过市场观察的每一个工具。
如果我要做这样的事情,我会创建一个数组,将过去的数据存储在其中,更新当前的数据。这将避免沉重的循环和CopyBuffer。一切都会飞起来。
如果我没记错的话。
它似乎工作得很好,如果下载了报价,它的速度就不会变慢。第一次启动需要很长的时间,我想它是在下载引言。
谢谢你的反馈和你的程序版本,我会尝试的)!我只想知道为什么在完成程序前不删除手柄,或者程序完成后会自动删除,但根据任务管理器,内存没有被释放。
如果我要做这样的事情,我会创建一个数组,将过去的数据存储在其中,更新当前的数据。这将避免沉重的循环和CopyBuffer。一切都会飞起来。
谢谢!我也会考虑的)
谢谢你的反馈和你的版本,我将进行实验)!我不明白的是,为什么你不在终止程序前删除句柄? 或者从任务管理器来看,它们在程序结束时被自动删除,尽管内存没有被释放。
我在某处读到,在脚本终止后,指标句柄会在一定时间间隔后自动删除。但这并不准确。
你好
该终端有一个线性回归 工具
有一些脚本可以用图形对象绘制相同的通道
但只有中心线画得正确,偏离线的画法与中心线的距离不正确。
建议如果有人知道计算偏差的正确公式,它应该像在终端一样
或者,也许有一个现成的解决方案
谢谢你
你好!
你能告诉我为什么在用AMarkets经纪商测试时,加密货币的OrderSend功能 不工作。我找不到法规对加密货币交易顾问的任何禁止规定。或者我的代码中有错误? GetLastError给出了错误4756