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

 
Alexey Viktorov:
将显示颜色设置为clrNONE。

所以你只能输出缓冲区,而不能单独输出变量?

 
psyman:

所以你只能输出缓冲区,而不能单独输出变量?

是的,那是唯一的方法。还有一个技巧可能会派上用场,如果你设置了SetIndexLabel(0, "");那么这些值就不会显示在数据窗口 中。甚至iCustom()函数也将无法使用。
 
Igor Makanu:

谢谢你的回答。

所以我的理解是创建一个缓冲区,然后在其中填入

的值,然后用iMAOnArray() 给这个缓冲器提供信息。

有谁为EA做了这个,在子窗口 测试EA的 时候会显示出来?

通常情况下,通过iCustom进行的EA测试是很迟钝的。

 

从https://www.mql5.com/ru/docs/strings/stringadd 的例子中提取代码,并将其粘贴到脚本中。在MQL4和MQL5中,结果是一样的。


HE      0       22:42:49.015    Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH      0       22:42:50.187    Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP      0       22:42:50.781    Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000


我以为StringAdd()和StringConcatenate() 应该比 "+"运行得快。为什么不是这样呢?

 
Northwest:

iCustom通常会减慢专家顾问的测试速度。

这不是真的,通常情况下是相反的,因为指标缓冲区的内存分配是由终端完成的,而不是由MQL脚本完成的,通常这些问题是指标中的非最佳计算问题,许多新手在一个指标调用--tick,计算整个历史数据的长度。

如果你已经了解了MQL的基础知识,请阅读文章,这都是书面的。

https://www.mql5.com/ru/articles/4602


西北地区

谁为EA做了这个,在子窗口中测试EA时将会显示出来?

没有人,阅读EA和指标的区别,谁有指标缓冲区,谁没有,谁有交易功能,谁有....。

ZZY:一个子窗口只能创建一个指标。如果你创建了一个子窗口,那么你可以使用专家顾问https://www.mql5.com/ru/docs/constants/objectconstants/enum_object,向这个子窗口添加图形对象。

ZSYZZ:子窗口可以通过应用模板获得,几个月前有一个话题,但我认为你到目前为止在其他方面有问题。

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu:

这不是真的,通常情况下是相反的,因为指标缓冲区的内存分配是由终端完成的,而不是由MQL脚本完成的,通常这些问题是指标中的非最佳计算问题,许多新手在一次指标调用中,他们计算了整个历史数据的长度。

如果你已经了解了MQL的基础知识,请阅读文章,它已经写了很久了。

https://www.mql5.com/ru/articles/4602


没有人,阅读专家顾问和指标的区别是什么,谁有指标缓冲区,谁没有,谁有交易功能,谁有....

ZZY:一个子窗口只能创建一个指标,如果你创建了一个子窗口,那么你可以使用专家顾问https://www.mql5.com/ru/docs/constants/objectconstants/enum_object,向这个子窗口添加图形对象。

ZSYZZ:子窗口可以通过应用模板获得,这是几个月前的一个话题,但我认为到目前为止你有一个其他的问题。

对不起。也许我的措辞并不正确,但

我不是说要用它来测试,但我也不是说要运行它。

至于测试时指标图上的可视化,如果你用

当你使用内置指标函数时,它们会在测试过程中被画在图表上

这正是我的意思。

但如果你使用某种集成在EA代码中的自定义指标计算代码,那么这个指标

在测试EA的过程中,将不会显示。

至于iCustom,当你在测试过程中使用它时,EA将显示在图表上

任何指标和指标的代码都可以和EA一起编译成一个ex4,但我不需要它。

我只是想知道在这件事上是否有办法绕过iCustom,如果没有,也不是什么问题。

非常感谢您的全面答复。

 

Artem在这里发布了一个指标模板,这里是OnCalculate 的部分。

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

我正在使用它,但我有一个问题)

为什么我使用limit=rates_total-1 来计算完整的历史,而不是limit=rates_total?

 
psyman:

为什么limit=rates_total-1 用于全部历史计算,而不是limit=rates_total?

试着检查一下,你会立即 "超出范围"--条形图的编号从零到......。总数-1 ,这是编程中常见的情况--编号以0开始。作为一个明显的例子,声明数组double x[5],并尝试在最后一个元素x[5]=100中写些什么。

ZS:回答你还没有问的问题....OrderTotal()也是从零到OrderTotal()-1的数字 ;)

 
Igor Makanu:

ZS:回答一个还没有被问到的问题....OrderTotal()的编号也从零到OrderTotal()-1;)

问题顺便产生了,现在我不能在阵列上赢得一个平均数,虽然我在五个,但以什么主题来写,我不知道,让它在这里。

该指标计算开仓-平仓差,并在此基础上建立МА。我选择了MA=2进行调试,但使用SimpleMAOnBuffer和iMAOnArray时,我得到了无法解释的行位移动,而且iMAOnArray在最后一个条形上显示为零值。


//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots   2
//--- plot OC
#property indicator_label1  "OC"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrSteelBlue, clrRed,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MA1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBrown
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1


//--- indicator buffers
double   OC[], OC_color[], MA1_buf[];
input int MA1=2;

int OnInit()
  {
  
   IndicatorSetString(INDICATOR_SHORTNAME,"t1");
   
   SetIndexBuffer(0,OC,INDICATOR_DATA);
   SetIndexBuffer(1,OC_color,INDICATOR_COLOR_INDEX);
   
   SetIndexBuffer(2, MA1_buf,INDICATOR_DATA); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   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[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total-1;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     
     OC[i]=fmax(open[i],close[i])-fmin(open[i],close[i]);
     if(OC[i]>0.001)
      {   OC_color[i]=1;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated,0,MA1,OC,MA1_buf);

//--- return value of prev_calculated for next call
   return(rates_total);
  }




double iMAOnArray(double &array[],
                      int total,
                      int period,
                      int ma_shift,
                      int ma_method,
                      int shift)
  {
   double buf[],arr[];
   if(total==0) total=ArraySize(array);
   if(total>0 && total<=period) return(0);
   if(shift>total-period-ma_shift) return(0);
   switch(ma_method)
     {
      case MODE_SMA :
        {
         total=ArrayCopy(arr,array,0,shift+ma_shift,period);
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,pos=total-1;
         for(i=1;i<period;i++,pos--)
            sum+=arr[pos];
         while(pos>=0)
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period-1];
            pos--;
           }
         return(buf[0]);
        }
      case MODE_EMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double pr=2.0/(period+1);
         int    pos=total-2;
         while(pos>=0)
           {
            if(pos==total-2) buf[pos+1]=array[pos+1];
            buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_SMMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,k,pos;
         pos=total-period;
         while(pos>=0)
           {
            if(pos==total-period)
              {
               for(i=0,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]=0;
                 }
              }
            else sum=buf[pos+1]*(period-1)+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_LWMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0.0,lsum=0.0;
         double price;
         int    i,weight=0,pos=total-1;
         for(i=1;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while(pos>=0)
           {
            buf[pos]=sum/weight;
            if(pos==0) break;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return(buf[shift+ma_shift]);
        }
      default: return(0);
     }
   return(0);
  }
 
psyman:

我有一个相关的问题,我还在为数组平均化而苦恼,虽然我在做5,但我不知道该写在什么题目上,就让它在这里吧。

我感觉在MQL5 中,指标 缓冲区和时间序列是以相反的方式 "展开 "的,默认情况下,MT5中最左边的柱子是柱子0,而在MT4中,最右边的柱子是柱子0,指标缓冲区有相同的编号

ZS: 我不想参与MT5,MT4已经足够我检查我的想法了,我只看MT5,如果我用MT5做了什么,我从不给别人看 ))