Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1519

 
Desculpe incomodá-lo novamente, mas surgiu uma pergunta. Há um indicador de Nível de Cor para MT4, em seu conjunto há segmentos de linha, que são criados a partir da linha de tendência TrendCreate, que tem 4 pontos de ancoragem - data e preço, e se eu o estender ainda mais como nível, tenho que pressionar Shift. É possível mudar a propriedade TrendCreate como o HLineCreate, ou seja, ter o segmento a partir do nível, ou talvez haja uma maneira de fazer o segmento pelo próprio HLineCreate? Quero dizer fazer o segmento comportar-se como um nível, não como uma linha de tendência
 
DYM:
Desculpe incomodá-lo novamente, mas surgiu uma pergunta. Há um indicador de Nível de Cor para MT4, ele tem segmentos de linha em seu conjunto que são criados a partir da linha TrendCreate que tem 4 pontos de ancoragem - data e preço, e se eu o estico mais como um nível eu tenho que segurar o Shift. É possível mudar a propriedade TrendCreate como o HLineCreate, ou seja, ter o segmento a partir do nível, ou talvez haja uma maneira de fazer o segmento pelo próprio HLineCreate? Quero dizer fazer o segmento comportar-se como um nível, não como uma linha de tendência

A questão não está clara...

Por que segurar o Shift? As linhas se movem como você quiser. Se você se mover pelo ponto central, a inclinação não muda.

Se você quiser alterar o comprimento da linha no indicador, adicione o destaque amarelo ao código

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

extern   int               x_size         =  155;                 // длина объектов
 
Waaaaaaaaaaaaaaaaaaaaaa. Ajude-me a resolver o problema. Eu não consigo descobrir o que está errado. Não está nem mesmo testando no testador. O que está faltando lá? Por que ela é executada em cada vela, e não na flecha? Eu já estou ficando louco((((
Arquivos anexados:
123.mq4  10 kb
 
MakarFX:

A questão não está clara...

Por que segurar o Shift? As linhas se movem como você quiser. Se você se mover pelo ponto central, a inclinação não muda.

Se você quiser alterar o comprimento da linha no indicador, adicione amarelo destacado ao código

Eu fiz um gif, a primeira linha tem propriedades de linha de tendência, a segunda tem propriedades de nível (parece-me que sim). Gostaria de entender como você pode fazer com que um segmento de linha tenha as propriedades da segunda linha.

Arquivos anexados:
line.gif  2022 kb
 
DYM:

Eu fiz um gif, a primeira linha tem propriedades de linha de tendência, a segunda linha tem propriedades de nível (bem, me parece que sim). Gostaria de entender como um segmento de linha pode ter as propriedades da segunda linha.

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, obrigado, mas o MT4 não está funcionando corretamente.


Você pode me dizer o que devo consertar?

Este código deve funcionar:

#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:

este código deve funcionar:

Muito obrigado! Tudo funciona...agora vou tentar descobrir a lógica (a construção em zig-zag é difícil para mim de entender).
 
MakarFX:
Muito obrigado! Tudo funciona...agora vou tentar descobrir a lógica (construir um ziguezague é difícil para mim de entender).

não checou, não verificou, não correu, não sacou

A lógica é simples - procurar o número de barras em que uma das condições ocorre e armazená-la no código

static int LastExt

e depois comparar esta barra com a próxima, se for uma interrupção em fase, memorizaremos esta barra na LastExt

 
Igor Makanu:

não checou, não verificou, não correu, não sacou

A lógica é simples - procurar o número de barras em que uma das condições ocorre e armazená-la no código

e então você compara esta barra com a próxima e se houver uma interrupção na fase, você a armazena na LastExt

Agora tudo está alinhado em minha cabeça) Obrigado, Igor.

 
MakarFX:

Estou tendo problemas com isto, entendo o preço1 ponto de ancoragem, mas não consigo descobrir como fazer a condição. Minha variante não funciona.

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);
           }

        }
     }
}
//+------------------------------------------------------------------+
Razão: