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

 
很抱歉再次打扰你,但有一个问题出现了。MT4有一个颜色水平指标,在它的设置中,有一些线段,是由TrendCreate趋势线创建的,它有4个锚点--日期和价格,如果我把它进一步扩展为一个水平,我必须按Shift键。是否有可能像HLineCreate那样改变TrendCreate属性,即从水平面开始有段,或者也许有办法通过HLineCreate本身制作段?我的意思是使该段的行为像一个水平,而不是趋势线
 
DYM:
很抱歉再次打扰你,但有一个问题出现了。MT4有一个颜色水平指标,它的线段是由TrendCreate线创建的,它有4个锚点--日期和价格,如果你把它进一步拉伸成一个水平,你必须按住Shift。是否有可能像HLineCreate那样改变TrendCreate属性,即从水平面开始有段,或者也许有办法通过HLineCreate本身制作段?我的意思是使该段表现得像一个水平线,而不是趋势线

这个问题并不清楚...

为什么要按住Shift?线条可以随意移动。如果你按中心点移动,坡度不会改变。

如果你想改变指标中线条的长度,请在代码中添加黄色高亮部分

extern   int               x_coor         =  10;                  // Coordinate X
extern   int               y_coor         =  20;                  // Coordinate Y

extern   int               x_size         =  155;                 // длина объектов
 
Waaaaaaaaaaaaaaaaa。帮我解决这个问题。我搞不清楚哪里出了问题。它甚至没有在测试器中测试。那里缺少什么呢?为什么是在每个蜡烛上执行,而不是在箭头上?我已经要疯了((((
附加的文件:
123.mq4  10 kb
 
MakarFX:

这个问题并不清楚...

为什么要按住Shift?线条可以随意移动。如果你按中心点移动,坡度不会改变。

如果你想改变指标中线条的长度,请在代码中加入突出显示的黄色

我做了一个GIF,第一条线有趋势线属性,第二条线有水平线属性(在我看来是这样的)。我想了解如何使一条线段具有第二条线的属性。

附加的文件:
line.gif  2022 kb
 
DYM:

我做了一个GIF,第一条线有趋势线属性,第二条线有水平线属性(嗯,对我来说似乎是这样)。我想了解一条线段如何具有第二条线的属性。

double a=ObjectGetDouble(ChartID,name,OBJPROP_PRICE1);
double b=ObjectGetDouble(ChartID,name,OBJPROP_PRICE2);
if(b!=a) ObjectSetDouble(ChartID,name,OBJPROP_PRICE2,a);
 
MakarFX:

Igor,谢谢你,但是MT4不能正常工作。


你能告诉我该怎么解决吗?

这段代码应该可以工作。

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

// plot ZigZagZZ
#property indicator_label1  "ZigZagZZ"
#property indicator_type1   DRAW_SECTION
#property indicator_color1  clrDarkBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
// input parameters
input int   Deviation=10;
// indicator buffers
double         ZZBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
// indicator buffers mapping
   SetIndexBuffer(0,ZZBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
   SetIndexEmptyValue(0,0.0);
   //PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   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[])
  {
   static bool UP;
   static double max,min;
   static int LastExt=rates_total - 1;
   static const double dev=NormalizeDouble(Deviation*_Point,_Digits);
   int limit=LastExt;
   if(prev_calculated==0)
     {
      ArrayInitialize(ZZBuffer,0.0);
      limit = LastExt = rates_total - 1;
      if(low[0]<high[1]) { min=low[limit];  max=high[limit - 1];   UP=true;  }
      else               { max=high[limit]; min  = low[limit - 1]; UP=false; }
     }
   for(int i=limit; i>=0; i--)
     {
      ZZBuffer[i]=0.0;
      if(UP)
        {
         if(low[i]-min<=0.0) { min=low[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=min; }
         else
           {
            if(high[i]-min-dev>0.0) { max=high[i]; LastExt=i; ZZBuffer[i]=max; UP=false; }
           }
        }
      else
        {
         if(high[i]-max>=0.0) { max=high[i]; ZZBuffer[LastExt]=0.0; LastExt=i; ZZBuffer[i]=max; }
         else
           {
            if(low[i]-max+dev<0.0) { min=low[i]; LastExt=i; ZZBuffer[i]=min; UP=true; }
           }
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

这段代码应该可以工作。

非常感谢您!这一切都很有效......现在我想弄清楚其中的逻辑("之 "字形结构对我来说很难理解)。
 
MakarFX:
太感谢了!这一切都很有效......现在我想弄清楚其中的逻辑(之字形结构对我来说很难理解)。

没有检查,运行它 - 它绘制

逻辑很简单--寻找其中一个条件发生的条数,并将其存储在代码中。

static int LastExt

然后将这个柱子与下一个柱子进行比较,如果是断相,我们将把这个柱子记在静态int LastExt中

 
Igor Makanu:

没有检查,运行它 - 它绘制

逻辑很简单--寻找其中一个条件发生的条数,并将其存储在代码中。

然后你将这个条形图与下一个条形图进行比较,如果有一个阶段性的中断,你将其存储在静态的Int LastExt中

现在一切都在我的脑海里排好了)谢谢你,伊戈尔。

 
MakarFX:

我遇到了麻烦,我明白锚点 是price1,但我不够聪明,不能做一个条件。我的变体不起作用。

extern ENUM_LINE_STYLE  line_st   =  STYLE_SOLID;         // 9. Стиль линий
extern int              line_wd   =  2;                   // 10. Толщина линий
// Координаты
extern int x_coor = 7;    // Сдвиг по оси X
extern int y_coor = 10;    // Сдвиг по оси Y
//-- глобальные переменные
string line[6] = {"line_1","line_2","line_3","line_4","line_5","line_6"};

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
  
   datetime dt1     = 0;
   double   price1  = 0;
   datetime dt2     = 0;
   double   price2  = 0;
   int      window   = 0;
   int      x        = 0;
   int      y        = 0;

//+------------------------------------------------------------------+
   //--- Клик по 1 линии
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickObject=sparam;
      if(clickObject==line[0])
        {
         string name="line_"+IntegerToString(MathRand()+100,0,' ');

         y=210;
         ChartXYToTimePrice(0,x_coor+25,y,window,dt1,price1);
         ChartXYToTimePrice(0,x_coor+157,y,window,dt2,price2);

         TrendCreate(0,name,0,dt1,price1,dt2,price2,color2,line_st,line_wd,false,true,false,false,false,0);
         
           price1=ObjectGetDouble(id,name,OBJPROP_PRICE1);
           price2=ObjectGetDouble(id,name,OBJPROP_PRICE2);
             if(price2!=price1) 
           {
            ObjectSetDouble(id,name,OBJPROP_PRICE2,price1);
           }

        }
     }
}
//+------------------------------------------------------------------+
原因: