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

 
Igor Makanu:

试着用不同的方式提问,你的问题可能不清楚

我试着解释一下。但请记住,我不是一个程序员,实际上。

我们有一个滴答指标,在投标值上建立一个曲线。

#property  indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Aqua
double x[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,x);
   SetIndexDrawBegin(0,0);
   SetIndexLabel(0,"x");
   SetIndexShift(0,0);
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double b=MarketInfo(Symbol(),MODE_BID);
   x[0]=b;
   for(int j=ArraySize(x)-1;j>=1;j--){x[j]=x[j-1];}
   return(0);
  }
//+------------------------------------------------------------------+

现在我想做的是。

指标附在图表 上。获取bid1在第一个tick上的第一个值。记住它(我是这样做的--我进入第二个缓冲区y[0],并在init()中记录其值。)

在第二次打勾时,我们得到bid2的第二个值。

然后我们需要得到积分的差异。delta=bid1-bid2(我是这样做的:delta=x[0]-x[1])。

现在把delta加到y[0]上,得到y[1]的值,它实际上与bid2的值相对应。

指标曲线应该与我们要找的曲线相同,但它是用出价差的计算值来绘制的。

这个指标需要作为进一步计算的模板。

不要扔石头。我尽我所能地解释。

谢谢你。

 
Oleg Bondarev:

我试着解释一下。但请记住,实际上我是一个程序员新手。

我们有一个Tick指标,它通过出价值建立一个曲线。

现在我想做的是。

指标 固定在图表上。获取bid1在第一个tick上的第一个值。记住它(我是这样做的--我进入第二个缓冲区y[0],并在init()中记录其值。)

在第二次打勾时,我们得到bid2的第二个值。

然后我们需要得到积分的差异。delta=bid1-bid2(我是这样做的:delta=x[0]-x[1])。

现在把delta加到y[0]上,得到y[1]的值,它实际上与bid2的值相对应。

指标曲线应该与我们要找的曲线相同,但它是用出价差的计算值来绘制的。

这个指标需要作为进一步计算的模板。

不要扔石头。我试图尽可能地解释。

谢谢你。

不清楚你想做什么

这里有一个普遍的问题--你用指标缓冲区作为一个数组来存储ticks(Bid),指标缓冲区的大小改变了终端本身,此外,终端在一个新的条形图出现时也会改变指标缓冲区本身。

你应该使用一个数组来存储ticks,并使用一个指标缓冲区来绘制

我已经创建了一个与你类似的代码,我在一个数组中保存刻度线

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=10;  //Размер массива тиков
//--- indicator buffers
double         Label1Buffer[];
double TickArr[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
   ArrayResize(TickArr,TickCount);                                   //изменим размер массива
   ArrayInitialize(TickArr,SymbolInfoDouble(_Symbol,SYMBOL_BID));    // проинициализируем массив значением текущего Bid
//---
   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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = SymbolInfoDouble(_Symbol,SYMBOL_BID); // в 0-й элемент массива запомнили новый Bid
   
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

现在,你应该在这段代码中加入你的计算,并按照你的想法使用指标缓冲区Label1Buffer来绘制它

 
如果他们增加了以编程方式改变另一个指标的属性的可能性,那就更好了。粗略地说,在图表中添加(以编程方式)另一个指标后,你可以设置其颜色、风格和线条的粗细
 
Igor Makanu:

不清楚你想做什么

这就是确切的问题--你用指标缓冲区作为数组来存储ticks(Bid),指标缓冲区的大小改变了终端本身,此外--当一个新的bar出现时,终端会自己移动指标缓冲区。

你应该使用一个数组来存储ticks,并使用一个指标缓冲区来绘制

我已经创建了一个与你类似的代码,我在一个数组中保存刻度线

现在,你必须在这段代码中加入你的计算,并按照你的想法,使用指标缓冲区Label1Buffer来绘制它

谢谢你的答复。我再折磨你一下。

我是否在这里加入计算?

int OnCalculate()

以下是我的计算结果。

   if(TickArr[0]>TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]+(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]<TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1]-(TickArr[0]-TickArr[1]);
     }
   if(TickArr[0]==TickArr[1])
     {
      Label1Buffer[0]=Label1Buffer[1];
     }

添加了它,但什么也没有。

 
Yevhenii Levchenko:
如果他们增加了以编程方式改变另一个指标的属性的可能性,那就更好了。粗略地说,在图表中添加(以编程方式)另一个指标后,你可以设置线条的 颜色、样式和厚度

使用画布并绘制卡通。

 

我再附一张图片。

ind

 
Oleg Bondarev:

添加了,也没有。

这不是它的工作方式 ))))

在MQL中使用指示器缓冲区 绘图,意味着在指示器缓冲区中放入一个值 - 在我的例子中,它是Label1Buffer(分配一个值)。

在你的例子中,你只在满足条件时才赋值,如果不满足条件则不赋值?- 所以什么都不会被印出来。


再说一遍,我创建了一个 "模板",其中数组TickArr包含了ticks Bid的值,但在你的条件中,你使用了指标缓冲区的前值--谁把什么值放在这些缓冲区中?


试着在指标缓冲区边上画一条线,然后你就可以比较一下刻度了。

 
Oleg Bondarev:

我再附一张图片。


如果角度反过来呢?如何进行计算呢?

 
Oleg Bondarev:

我再附一张图片。


如果你说你在编程方面几乎是个零,那么你为什么要承担这种非标准的任务,也许你应该从简单的任务开始?还是为了提高你的基础知识?为你做这件事更容易,是的。
 
Igor Makanu:

那是不可能的 ))))

在MQL中使用指示器缓冲区 进行绘图,这意味着将一个值(分配一个值)放到指示器缓冲区中 - 在我的例子中,Label1Buffer

在你的例子中,你只在满足条件时才赋值,如果不满足条件则不赋值?- 所以什么都不会被印出来。


再说一遍,我创建了一个 "模板",其中数组TickArr包含了ticks Bid的值,但在你的条件中,你使用了指标缓冲区的前值--谁把什么值放在这些缓冲区中?


试着在指标缓冲区边上画一条线,然后你就可以比较一下刻度线。

我警告说,我是一个黑客)。

我是这样做的。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      TickCount=100000;  //Размер массива тиков
input int      TickCountb=100000;
//--- indicator buffers
double Label1Buffer[];
double TickArr[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer);
   ArrayResize(TickArr,TickCount);
   ArrayResize(Label1Buffer,TickCountb);                                   //изменим размер массива
   ArrayInitialize(TickArr,MarketInfo(Symbol(),MODE_BID));    // проинициализируем массив значением текущего Bid

//---
   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[])
  {
   for(int i=ArraySize(TickArr)-1;i>0;i--)
   {
      TickArr[i] = TickArr[i-1]; // сдвинули массив
   }
   TickArr[0] = MarketInfo(Symbol(),MODE_BID); // в 0-й элемент массива запомнили новый Bid
   
   for(int j=ArraySize(TickArr)-1;j>0;j--)
   {
      Label1Buffer[j] = Label1Buffer[j-1]; // сдвинули массив
   }
   
   Label1Buffer[0]= TickArr[0];   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

现在它画出了滴答图,但有一些断线。

我在做一个4。

原因: