新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1532 1...152515261527152815291530153115321533153415351536153715381539...1953 新评论 Алексей КоКоКо 2021.07.06 03:52 #15311 我无法处理缓冲区,我收集了统计数据,统计数据收集工作正常,指标甚至在图表上画出了所有内容(作为每个蜡烛图下的文本),但只要我创建一个缓冲区来填充统计数据,就会出现错误'CntM5Buffer' - 参数转换不允许 Trent_flat.mq5 30 21,我无法处理这些缓冲区 :( //+------------------------------------------------------------------+ //| Trent_flat.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window #property indicator_buffers 1 #include <statistic_func.mqh> #include <obj_text.mqh> int CntM5Buffer[]; ENUM_TIMEFRAMES TF = PERIOD_M5; int bars_on_history = 50; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,CntM5Buffer,INDICATOR_CALCULATIONS); //--- установим индексацию для буфера как в таймсерии ArraySetAsSeries(CntM5Buffer,true); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { int start = 1; Comment("RATES_TOTAL = ", rates_total, "\n PREV_CALCULATED = ", prev_calculated, "\nR - P = ", rates_total-prev_calculated); if(rates_total - prev_calculated >0) { int total_bars; if(rates_total-prev_calculated > bars_on_history) { total_bars = bars_on_history; } else { total_bars = rates_total - prev_calculated; } Get_TF_statistic(TF,total_bars,CntM5Buffer); } return(rates_total); } //+------------------------------------------------------------------+ Tretyakov Rostyslav 2021.07.06 08:01 #15312 能否请你解释一下其中的诀窍是什么? 这段代码加载了终端 for(int i=limit;i>=0;i--) { RSI_01Buffer[i]=iRSI(NULL,0,RSI_Period,RSI_Price,i); RSI_02Buffer[i]=iMAOnArray(RSI_01Buffer,0,RSI_Period,0,MODE_SMA,i); } 这个代码飞起来了。 for(int i=limit;i>=0;i--) RSI_01Buffer[i]=iRSI(NULL,0,RSI_Period,RSI_Price,i); for(int i=limit;i>=0;i--) { RSI_02Buffer[i]=iMAOnArray(RSI_01Buffer,0,RSI_Period,0,MODE_SMA,i); } Vitaly Muzichenko 2021.07.06 08:31 #15313 MakarFX:能否请你解释一下其中的诀窍是什么?这段代码加载了终端这个代码飞起来了。 第一个代码是不正确的。 首先你需要收集/填充 "RSI_01Buffer "数组,然后将其传递给函数来计算 "iMAOnArray"。 在第二个代码中,一切都很正确。 Tretyakov Rostyslav 2021.07.06 08:37 #15314 Vitaly Muzichenko:第一个代码是不正确的。首先你需要收集/填充 "RSI_01Buffer "数组,然后把它传递给函数来计算 "iMAOnArray"。在第二个代码中,一切都很正确。 非常感谢你。这是我第一次遇到这种情况,我感到很疑惑。 Andrei Sokolov 2021.07.06 09:35 #15315 Taras Slobodyanik:指示器在一个线程中工作,如果一个人等待,其他所有人都会等待,直到终端挂起。 当MT启动时,指标的初始化可能发生在终端变量的初始化 之前,也就是说,抓住一个挂起是小菜一碟。 谢谢你。但到目前为止,我还不知道其他选择。 Artyom Trishkin 2021.07.06 10:53 #15316 Andrey Sokolov:谢谢你。但我目前不知道有什么其他选择。 而正确的选择是非常简单的... SanAlex 2021.07.06 11:35 #15317 Artyom Trishkin:而正确的选择是非常简单的... 对不起--如果是这样呢? 是正确还是不很正确?- 我也在努力学习如何正确理解和实施)。 //+------------------------------------------------------------------+ //| Demo_iBands.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //--- входные параметры input int bands_period=20; // период скользящей средней input int bands_shift=0; // сдвиг input double deviation=2.0; // кол-во стандартных отклонений input ENUM_APPLIED_PRICE applied_price=PRICE_CLOSE; // тип цены //--- переменная для хранения хэндла индикатора iBands int handle; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- создадим хэндл индикатора handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price); //--- если не удалось создать хэндл if(handle==INVALID_HANDLE) { //--- сообщим о неудаче и выведем номер ошибки PrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d", _Symbol, EnumToString(_Period), GetLastError()); //--- работа индикатора завершается досрочно return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(handle!=INVALID_HANDLE) IndicatorRelease(handle); //--- почистим график при удалении индикатора Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- индикаторные буферы //--- get current Bands double UpperBuffer[]; double LowerBuffer[]; double MiddleBuffer[]; if(CopyBuffer(handle,BASE_LINE,-bands_shift,1,MiddleBuffer)!=1|| CopyBuffer(handle,UPPER_BAND,-bands_shift,1,UpperBuffer)!=1|| CopyBuffer(handle,LOWER_BAND,-bands_shift,1,LowerBuffer)!=1) { Print("CopyBuffer from Bands failed, no data"); return; } //--- сформируем сообщение Print("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0]); } //+------------------------------------------------------------------+ SanAlex 2021.07.06 12:37 #15318 SanAlex:对不起--如果是这样呢? 这样做是对还是错?- 我也在努力学习如何正确地理解和实施它)。 我几乎学会了--甚至打开了一个位置 //+------------------------------------------------------------------+ //| Demo_iBands.mq5 | //| Copyright 2021, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #define BAND_MAGIC 1234501 #include <Trade\Trade.mqh> CTrade ExtTrade; input group "---- Lots Parameters ----" input double InpLots = 0.1; // Lots input group "---- Bands Parameters ----" input int bands_period = 20; // период скользящей средней input int bands_shift = 0; // сдвиг input double bands_deviation = 2.0; // кол-во стандартных отклонений input ENUM_APPLIED_PRICE applied_price = PRICE_CLOSE; // тип цены //--- переменная для хранения хэндла индикатора iBands bool ExtHedging=false; int handle=0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- prepare trade class to control positions if hedging mode is active ExtHedging=((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING); ExtTrade.SetExpertMagicNumber(BAND_MAGIC); ExtTrade.SetMarginMode(); ExtTrade.SetTypeFillingBySymbol(Symbol()); //--- создадим хэндл индикатора handle=iBands(_Symbol,_Period,bands_period,bands_shift,bands_deviation,applied_price); //--- если не удалось создать хэндл if(handle==INVALID_HANDLE) { //--- сообщим о неудаче и выведем номер ошибки PrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d", _Symbol, EnumToString(_Period), GetLastError()); //--- работа индикатора завершается досрочно return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { if(handle!=INVALID_HANDLE) IndicatorRelease(handle); //--- почистим график при удалении индикатора Comment(""); } //+------------------------------------------------------------------+ //| Check for open position conditions | //+------------------------------------------------------------------+ void CheckForOpen(void) { MqlRates rt[2]; //--- go trading only for first ticks of new bar if(CopyRates(_Symbol,_Period,0,2,rt)!=2) { Print("CopyRates of ",_Symbol," failed, no history"); return; } if(rt[1].tick_volume>1) return; //--- get current Bands double MiddleBuffer[],UpperBuffer[],LowerBuffer[]; if(CopyBuffer(handle,BASE_LINE,-bands_shift,1,MiddleBuffer)!=1|| CopyBuffer(handle,UPPER_BAND,-bands_shift,1,UpperBuffer)!=1|| CopyBuffer(handle,LOWER_BAND,-bands_shift,1,LowerBuffer)!=1) { Print("CopyBuffer from Bands failed, no data"); return; } //--- check signals ENUM_ORDER_TYPE signal=WRONG_VALUE; if(((rt[0].open>MiddleBuffer[0] && rt[0].close<MiddleBuffer[0])|| (rt[0].open>UpperBuffer[0] && rt[0].close<UpperBuffer[0])|| (rt[0].open>LowerBuffer[0] && rt[0].close<LowerBuffer[0]))) signal=ORDER_TYPE_SELL; // sell conditions else { if(((rt[0].open<MiddleBuffer[0] && rt[0].close>MiddleBuffer[0])|| (rt[0].open<UpperBuffer[0] && rt[0].close>UpperBuffer[0])|| (rt[0].open<LowerBuffer[0] && rt[0].close>LowerBuffer[0]))) signal=ORDER_TYPE_BUY; // buy conditions } //--- additional checking if(signal!=WRONG_VALUE) { if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100) ExtTrade.PositionOpen(_Symbol,signal,InpLots, SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK), 0,0); } } //+------------------------------------------------------------------+ //| Check for close position conditions | //+------------------------------------------------------------------+ void CheckForClose(void) { MqlRates rt[2]; //--- go trading only for first ticks of new bar if(CopyRates(_Symbol,_Period,0,2,rt)!=2) { Print("CopyRates of ",_Symbol," failed, no history"); return; } if(rt[1].tick_volume>1) return; //--- get current Bands double MiddleBuffer[],UpperBuffer[],LowerBuffer[]; if(CopyBuffer(handle,BASE_LINE,-bands_shift,1,MiddleBuffer)!=1|| CopyBuffer(handle,UPPER_BAND,-bands_shift,1,UpperBuffer)!=1|| CopyBuffer(handle,LOWER_BAND,-bands_shift,1,LowerBuffer)!=1) { Print("CopyBuffer from Bands failed, no data"); return; } //--- positions already selected before bool signal=false; long type=PositionGetInteger(POSITION_TYPE); if(((type==(long)POSITION_TYPE_BUY && rt[0].open>MiddleBuffer[0] && rt[0].close<MiddleBuffer[0])|| (type==(long)POSITION_TYPE_BUY && rt[0].open>UpperBuffer[0] && rt[0].close<UpperBuffer[0])|| (type==(long)POSITION_TYPE_BUY && rt[0].open>LowerBuffer[0] && rt[0].close<LowerBuffer[0]))) signal=true; if(((type==(long)POSITION_TYPE_SELL && rt[0].open<MiddleBuffer[0] && rt[0].close>MiddleBuffer[0])|| (type==(long)POSITION_TYPE_SELL && rt[0].open<UpperBuffer[0] && rt[0].close>UpperBuffer[0])|| (type==(long)POSITION_TYPE_SELL && rt[0].open<LowerBuffer[0] && rt[0].close>LowerBuffer[0]))) signal=true; //--- additional checking if(signal) { if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100) ExtTrade.PositionClose(_Symbol,3); } //--- } //+------------------------------------------------------------------+ //| Position select depending on netting or hedging | //+------------------------------------------------------------------+ bool SelectPosition() { bool res=false; //--- check position in Hedging mode if(ExtHedging) { uint total=PositionsTotal(); for(uint i=0; i<total; i++) { string position_symbol=PositionGetSymbol(i); if(_Symbol==position_symbol && BAND_MAGIC==PositionGetInteger(POSITION_MAGIC)) { res=true; break; } } } //--- check position in Netting mode else { if(!PositionSelect(_Symbol)) return(false); else return(PositionGetInteger(POSITION_MAGIC)==BAND_MAGIC); //---check Magic number } //--- result for Hedging mode return(res); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick(void) { //--- if(SelectPosition()) CheckForClose(); else CheckForOpen(); //--- } //+------------------------------------------------------------------+ Алексей КоКоКо 2021.07.06 15:13 #15319 你能告诉我如何理解一般的文件吗?让我感到不安的是,即使是像文本这样简单的图形对象的例子,他们也是用一堆代码扔在你面前,而没有任何地方写出哪些参数是需要的,哪些是不需要的,为了写一些文本或设置一个趋势,甚至了解一个指标的缓冲区,你不明白需要输入哪些最低参数,不得不愚蠢地复制和***他们的代码。 Vladislav Andruschenko 2021.07.06 15:29 #15320 Алексей КоКоКо:你能告诉我如何理解一般的文件吗?我真的很烦恼,即使在简单的图形对象(如文本)的例子中,他们也会把一个带有一堆代码的样本扔到你面前,但他们没有任何地方写出哪些参数是必须的,哪些不是,为了写一些文本或设置一个趋势,甚至理解一个指标的缓冲区,你不明白你必须输入哪些最低参数,你只是复制和***他们的代码。 至少现在有很多文件。文章, 例子..... 1...152515261527152815291530153115321533153415351536153715381539...1953 新评论 原因: 取消 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我无法处理缓冲区,我收集了统计数据,统计数据收集工作正常,指标甚至在图表上画出了所有内容(作为每个蜡烛图下的文本),但只要我创建一个缓冲区来填充统计数据,就会出现错误'CntM5Buffer' - 参数转换不允许 Trent_flat.mq5 30 21,我无法处理这些缓冲区 :(
能否请你解释一下其中的诀窍是什么?
这段代码加载了终端
这个代码飞起来了。
能否请你解释一下其中的诀窍是什么?
这段代码加载了终端
这个代码飞起来了。
第一个代码是不正确的。
首先你需要收集/填充 "RSI_01Buffer "数组,然后将其传递给函数来计算 "iMAOnArray"。
在第二个代码中,一切都很正确。
第一个代码是不正确的。
首先你需要收集/填充 "RSI_01Buffer "数组,然后把它传递给函数来计算 "iMAOnArray"。
在第二个代码中,一切都很正确。
指示器在一个线程中工作,如果一个人等待,其他所有人都会等待,直到终端挂起。
当MT启动时,指标的初始化可能发生在终端变量的初始化 之前,也就是说,抓住一个挂起是小菜一碟。
谢谢你。但到目前为止,我还不知道其他选择。
谢谢你。但我目前不知道有什么其他选择。
而正确的选择是非常简单的...
而正确的选择是非常简单的...
对不起--如果是这样呢? 是正确还是不很正确?- 我也在努力学习如何正确理解和实施)。
对不起--如果是这样呢? 这样做是对还是错?- 我也在努力学习如何正确地理解和实施它)。
我几乎学会了--甚至打开了一个位置
你能告诉我如何理解一般的文件吗?让我感到不安的是,即使是像文本这样简单的图形对象的例子,他们也是用一堆代码扔在你面前,而没有任何地方写出哪些参数是需要的,哪些是不需要的,为了写一些文本或设置一个趋势,甚至了解一个指标的缓冲区,你不明白需要输入哪些最低参数,不得不愚蠢地复制和***他们的代码。
你能告诉我如何理解一般的文件吗?我真的很烦恼,即使在简单的图形对象(如文本)的例子中,他们也会把一个带有一堆代码的样本扔到你面前,但他们没有任何地方写出哪些参数是必须的,哪些不是,为了写一些文本或设置一个趋势,甚至理解一个指标的缓冲区,你不明白你必须输入哪些最低参数,你只是复制和***他们的代码。