新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1462

 
Vitaly Muzichenko:

这是经过调整的那张,原来的那张只是普通的阴暗。

P.S. Dot.mq4 - 完整的原件

对不起,时间太长了,我忙于工作。

给你。

//+------------------------------------------------------------------+
//|                                                      VMTest1.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 7
#property indicator_plots   3
//--- plot ARR
#property indicator_label1  "MaOSC"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrLimeGreen,clrOrangeRed,clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot ArrUP
#property indicator_label2  "Up"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot ArrDN
#property indicator_label3  "Down"
#property indicator_type3   DRAW_ARROW
#property indicator_color3  clrCrimson
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//---
#include <MovingAverages.mqh>

//--- input parameters
input uint     InpA=40;
//--- indicator buffers
double         BufferMAOSC[];
double         BufferColorsARR[];
double         BufferArrUP[];
double         BufferArrDN[];
double         BufferMAV[];
double         BufferMAA[];
double         BufferTMP[];
//--- gv
int a=0;
int per=0;
int val=0;
int handle_mav=INVALID_HANDLE;
int handle_maa=INVALID_HANDLE;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferMAOSC,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColorsARR,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,BufferArrUP,INDICATOR_DATA);
   SetIndexBuffer(3,BufferArrDN,INDICATOR_DATA);
   SetIndexBuffer(4,BufferMAV,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,BufferMAA,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,BufferTMP,INDICATOR_CALCULATIONS);
   
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,159);
   PlotIndexSetInteger(1,PLOT_ARROW,225);
   PlotIndexSetInteger(2,PLOT_ARROW,226);
//---
   ArraySetAsSeries(BufferMAOSC,true);
   ArraySetAsSeries(BufferColorsARR,true);
   ArraySetAsSeries(BufferArrUP,true);
   ArraySetAsSeries(BufferArrDN,true);
   ArraySetAsSeries(BufferMAV,true);
   ArraySetAsSeries(BufferMAA,true);
   ArraySetAsSeries(BufferTMP,true);
//---
   a=(InpA<4 ? 4 : InpA);
   per=(int)floor(sqrt(a));
   val=(int)floor(a/1.9);
//---
   handle_mav=iMA(NULL,PERIOD_CURRENT,val,0,MODE_SMA,PRICE_LOW);
   if(handle_mav==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",val,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
   handle_maa=iMA(NULL,PERIOD_CURRENT,a,0,MODE_SMA,PRICE_LOW);
   if(handle_maa==INVALID_HANDLE)
     {
      Print("Не удалось создать хэндл индикатора MA(",a,"), ошибка ",GetLastError());
      return INIT_FAILED;
     }
//---
   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 limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferMAOSC,EMPTY_VALUE);
      ArrayInitialize(BufferColorsARR,2);
      ArrayInitialize(BufferArrUP,EMPTY_VALUE);
      ArrayInitialize(BufferArrDN,EMPTY_VALUE);
      ArrayInitialize(BufferMAV,0);
      ArrayInitialize(BufferMAA,0);
      ArrayInitialize(BufferTMP,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 1),copied=0;
   copied=CopyBuffer(handle_mav,0,0,count,BufferMAV);
   if(copied!=count) return 0;
   copied=CopyBuffer(handle_maa,0,0,count,BufferMAA);
   if(copied!=count) return 0;

//--- Предварительный расчёт
   for(int i=limit;i>WRONG_VALUE;i--)
      BufferTMP[i]=2.0*BufferMAV[i]-BufferMAA[i];
      
//--- Расчёт индикатора
   if(SimpleMAOnBuffer(rates_total,prev_calculated,a,per,BufferTMP,BufferMAOSC)==0)
      return 0;
   for(int i=limit;i>WRONG_VALUE;i--)
     {
      BufferArrUP[i]=EMPTY_VALUE;
      BufferArrDN[i]=EMPTY_VALUE;
      BufferColorsARR[i]=(BufferMAOSC[i]>BufferMAOSC[i+1] ? 0 : BufferMAOSC[i]<BufferMAOSC[i+1] ? 1 : 2);
      if((BufferColorsARR[i]==0 && BufferColorsARR[i+1]==1) || (BufferColorsARR[i]==0 && BufferColorsARR[i+1]==2))
         BufferArrUP[i]=BufferMAOSC[i];
      if((BufferColorsARR[i]==1 && BufferColorsARR[i+1]==0) || (BufferColorsARR[i]==1 && BufferColorsARR[i+1]==2))
         BufferArrDN[i]=BufferMAOSC[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

我理解这个想法,它很有用,但在这种情况下,它对我不起作用。我需要为测试器 计时 在指示器上按下停止按钮

不确定在按下按钮后,打印的内容是否会被写入日志。

因此,尝试在文件中写下每一个新条 目的所有工作环境功能--禁止交易、测试、终止程序.....https://docs.mql4.com/ru/check

如果没有帮助,你不能,那么就通过WinAPI来寻找一些东西。

HH:做一个按钮并点击它--按下它,做所有的动作,然后让展示台完成空闲的运行,我认为比搜索更快。

 
Igor Makanu:

不确定在按下按钮后是否将打印内容写入日志。

因此,尝试将所有功能写进文件,以与环境合作 - 禁止交易,测试,终止程序.....。

如果它没有帮助,那么你就不能,然后通过WinAPI来寻找东西。

HH:做一个按钮并按下它--按下它,做所有的动作,然后让展示台完成空闲的运行,这比寻找更快。

测试仪 杂志中的打印停止按钮:按了停止按钮

但我在文档中没有找到。对专家顾问来说,止损是由OnDynit调用的,对指标来说,只是在日志中打印。该指标停止测试,就这样了。实际上有一个停顿。但它没有印在杂志上。

注意事项

一般来说,手动删除指标或关闭窗口并不难。但这个问题很有意思。这就像通过对第三方符号的请求来获取实时信息)它应该以某种方式跟踪测试的结束与停止按钮)。

 
Valeriy Yastremskiy:

测试仪 杂志中停止按钮的打印:停止按钮已按下

但我在文档中没有找到。对于专家顾问来说,停止是由OnDeinit调用的,对于指标来说,只在日志中打印。该指标停止测试,就这样了。实际上有一个停顿。但它没有印在杂志上。

注意事项

一般来说,手动删除指标或关闭窗口并不难。但这个问题很有意思。这就像通过对第三方符号的请求来访问实时)似乎它应该以某种方式跟踪测试按钮的结束停止)。

不知道

搜索论坛IsTesting() - 发现类似的讨论

ZZY: 我认为日志会打印出终端,但我需要MQL代码来做这件事

ZZZY:写的是EA,imho,指标的可视化很繁琐))))。

 
Artyom Trishkin:

我很抱歉花了这么长时间--我一直在忙于工作。

给你。

变化是巨大的,但这不是问题的关键。

我将处理iMAOnArray,那是我的目标。

谢谢你!

 
Vitaly Muzichenko:

变化是巨大的,但这不是重点。

我将处理iMAOnArray的问题,这就是目标。

谢谢你!

只是这里的一切都和那里完全一样。但在MQL5中,它是如此的简单。

 

你好。为什么在删除ObjectCreate() 中没有描述的常量时。

例如,z_order或隐藏?编译后会不会引起错误?他们不参与划线。

bool VLineCreate(const long            chart_ID=0,        // ID графика 
                 const string          name="VLine",      // имя линии 
                 const int             sub_window=0,      // номер подокна 
                 datetime              time=0,            // время линии 
                 const color           clr=clrRed,        // цвет линии 
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии 
                 const int             width=1,           // толщина линии 
                 const bool            back=false,        // на заднем плане 
                 const bool            selection=true,    // выделить для перемещений 
                 const bool            ray=true,          // продолжение линии вниз 
                 const bool            hidden=true,       // скрыт в списке объектов 
                 const long            z_order=0)         // приоритет на нажатие мышью 
  { 
//--- если время линии не задано, то проводим ее через последний бар 
   if(!time) 
      time=TimeCurrent(); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим вертикальную линию 
   if(!ObjectCreate(chart_ID,name,OBJ_VLINE,sub_window,time,0)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось создать вертикальную линию! Код ошибки = ",GetLastError()); 
      return(false); 
     } 
 
Дмитрий:

你好。为什么在删除ObjectCreate() 中没有描述的常量时。

例如,z_order或隐藏?编译后会不会引起错误?他们不参与划线。

在删除输入函数的一个参数时,要注意逗号和结尾的小括号。

 
Alexey Viktorov:

当删除一个函数的一个输入参数时,要注意逗号和闭合括号。

阿列克谢,谢谢你。我首先注意到了标点符号。脚本已经减少到最低限度,剩下的是ObjectCreate()所必需的(锚点,symv,和TD)。结果发现,只有在标题中的那些常数在代码中的任何地方都没有发生)对此,问题出现了,为什么删除至少一个错误发生。而问题出现了,在标题中可能有强制性的条件,有一个常量列表。function header))?
 
Dzmitry Zaitsau:
阿列克谢,谢谢你。我首先注意到了标点符号。脚本被缩减到最小,我留下了ObjectCreate()的必要内容(锚点,symv,和TD)。结果发现,只有在标题中的那些常数在代码中的任何地方都没有发生)对此,问题出现了,为什么删除至少一个错误发生。而问题出现了,在标题中可能有强制性的条件,有一个常量列表。function header))?

如果你能写下出现了什么错误,那就更容易理解了,否则就会出现心灵感应--猜猜我有什么错误)

原因: