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

 
Igor Makanu:

Tente fazer a pergunta de outra forma, sua pergunta pode não ser clara

Vou tentar explicar. Mas tenha em mente que eu não sou um programador, praticamente.

Temos um indicador de tick que constrói uma curva sobre os valores de licitação.

#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);
  }
//+------------------------------------------------------------------+

Agora o que eu quero fazer.

Anexe o indicador ao gráfico. Obtenha o primeiro valor de lance1 no primeiro tick. Lembre-se disso (eu o fiz - eu entrei no segundo buffer y[0] e registrei seu valor no init())).

No segundo tick, obtemos o segundo valor de lance2.

Então precisamos obter a diferença em pontos. delta=bid1-bid2 (fiz desta forma: delta=x[0]-x[1]).

Agora adicione delta a y[0] e obtenha o valor de y[1], que na verdade corresponde ao valor de lance2.

A curva indicadora deve ser idêntica à que estamos procurando, mas é traçada utilizando os valores calculados das diferenças de oferta.

Este indicador é necessário como um modelo para cálculos posteriores.

Não atirar pedras. Expliquei o melhor que pude.

Obrigado.

 
Oleg Bondarev:

Vou tentar explicar. Mas tenha em mente que eu sou um programador novato, praticamente.

Temos um indicador de tick, que constrói uma curva por valores de oferta.

Agora o que eu quero fazer.

Fixar o indicador no gráfico. Obtenha o primeiro valor de lance1 no primeiro tick. Lembre-se disso (eu o fiz - eu entrei no segundo buffer y[0] e registrei seu valor no init())).

No segundo tick, recebemos o segundo valor de bid2.

Então precisamos obter a diferença em pontos. delta=bid1-bid2 (fiz desta forma: delta=x[0]-x[1]).

Agora adicione delta a y[0] e obtenha o valor de y[1] que realmente corresponde ao valor de lance2.

A curva indicadora deve ser idêntica à que estamos procurando, mas é traçada utilizando os valores calculados das diferenças de oferta.

Este indicador é necessário como um modelo para cálculos posteriores.

Não atirar pedras. Tentei explicar o melhor que pude.

Obrigado.

Não está claro o que você quer fazer

Aqui está o problema geral - você usa buffers indicadores como uma matriz para armazenar carrapatos (Bid), o tamanho do buffer indicador muda o próprio terminal e, além disso, o terminal desloca os próprios buffers indicadores com a aparência de uma nova barra

você deve usar uma matriz para armazenar carrapatos, e usar um buffer indicador para desenho

criei um código semelhante ao seu, onde salvo carrapatos em uma matriz

#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);
  }
//+------------------------------------------------------------------+

Agora, você deve adicionar seu cálculo a este código e desenhá-lo usando o tampão indicador Label1Buffer, de acordo com sua idéia

 
Seria bom se eles acrescentassem a possibilidade de alterar as propriedades de outro indicador programmaticamente. Grosso modo, após adicionar (programmaticamente) outro indicador ao gráfico, você pode definir sua cor, estilo e espessura de linhas
 
Igor Makanu:

não está claro o que você quer fazer

aqui está o problema exato - você usa buffers indicadores como uma matriz para armazenar carrapatos (Bid), o tamanho do buffer indicador muda o próprio terminal, e além disso - o terminal muda os próprios buffers indicadores quando uma nova barra aparece

você deve usar uma matriz para armazenar carrapatos, e usar um buffer indicador para desenho

criei um código semelhante ao seu, onde salvo carrapatos em uma matriz

Agora, você tem que adicionar seu cálculo a este código e desenhá-lo usando o tampão indicador Label1Buffer, de acordo com sua idéia.

Obrigado pela sua resposta. Vou torturá-lo um pouco mais.

Eu adiciono o cálculo aqui?

int OnCalculate()

Aqui está meu cálculo.

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

Acrescentei-o e nada.

 
Yevhenii Levchenko:
Seria bom se eles acrescentassem a possibilidade de alterar as propriedades de outro indicador de forma programática. Grosso modo, após adicionar (programmaticamente) outro indicador ao gráfico, você pode definir a cor, estilo e espessura das linhas

Use Tela e desenhe desenhos animados.

 

Vou anexar uma foto mais.

ind

 
Oleg Bondarev:

Adicionado e nada.

não é assim que funciona ))))

Para desenhar usando buffers indicadores em MQL, significa colocar um valor no buffer indicador - no meu exemplo, é Label1Buffer (atribuir um valor)

em seu exemplo você atribui valores somente quando uma condição é cumprida e se a condição não é cumprida? - Portanto, nada será impresso.


E novamente, eu criei um "modelo" onde a matriz TickArr contém os valores de ticks Bid, mas em suas condições você usa os valores anteriores do buffer indicador - e quem colocou que valores nesses buffers?


Tente traçar uma linha pelo tampão indicador, então você comparará os carrapatos.

 
Oleg Bondarev:

Vou anexar uma foto mais.


E se o ângulo for invertido? Como seria feito o cálculo?

 
Oleg Bondarev:

Vou anexar uma foto mais.


Se você diz que é praticamente um zero na programação, então por que está assumindo tais tarefas não-standard, talvez você devesse começar com tarefas simples? Ou para melhorar seu conhecimento do básico? É mais fácil fazer isso para você, sim.
 
Igor Makanu:

que não vai funcionar ))))

Para desenhar usando buffers indicadores em MQL, significa colocar um valor (atribuir um valor) ao buffer indicador - no meu exemplo, o Label1Buffer

em seu exemplo você atribui valores somente quando uma condição é cumprida e se a condição não é cumprida? - Portanto, nada será impresso.


E novamente, eu criei um "modelo" onde a matriz TickArr contém os valores de ticks Bid, mas em suas condições você usa os valores anteriores do buffer indicador - e quem colocou que valores nesses buffers?


Tente traçar uma linha pelo tampão indicador, e então você comparará os carrapatos.

Eu avisei que sou um hacker).

Eu o fiz dessa maneira.

#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);
  }
//+------------------------------------------------------------------+

Agora ele desenha a tabela de carrapatos, mas há algumas quebras de linha.

Estou fazendo um 4.

Razão: