Desenho de um quadrado ou retângulo. Realmente precisam de ajuda... - página 6

 
evillive:

Então, onde funciona? Desenha linhas em cada barra, não na TF. Ou na figura acima está TF=H1?

Calcule em um pedaço de papel qual será o limite e eu em cada iteração dos ciclos.

Meu exemplo mostrado acima nunca é contabilizado, como eu o entendo.

As setas de seleção podem ser desenhadas usando amortecedores indicadores, assim como linhas que conectam as sombras dos castiçais.

PERÍODO_H;. Abaixo do período H4, tudo está bem desenhado.

i = 0;

O limite é variável externa por padrão = 5;

barras int externasToProcess = 5; //--- Número de períodos (linhas) a serem exibidos .

"As setas de seleção podem ser desenhadas usando amortecedores indicadores, assim como linhas que conectam as sombras dos castiçais. "

Eu entendo assim.

No buffer com o índice [Limite] são atribuídos os valores de alto do Array.

duplo Buf_High[Limit] =mqlRates[0].high;

Eu entendo como circular em cada barra. Mas eu não entendo como fazer isso em cada barra H4.

 
Alex_Profit:

PERÍODO_H;. Abaixo do período H4, tudo está desenhando bem.

i = 0;

O limite é uma variável externa por padrão = 5;

barras int externasToProcess = 5; //--- Número de períodos de exibição (linhas) .

"As setas de seleção podem ser desenhadas usando amortecedores indicadores, assim como linhas que conectam as sombras dos castiçais. "

Eu entendo assim.

No buffer com o índice [Limite] são atribuídos os valores de alto do Array.

duplo Buf_High[Limit] =mqlRates[0].high;

Eu entendo como circular em cada barra. Mas eu não entendo como fazer isso em cada barra H4.

Descubra como funcionam os laços antes de usá-los.i = 0 apenas na primeira vez, depoisi++, até o limite.

Ao executar pela primeira vez o indicador limite=Bars-counted_bars=Bars-0=Bars.

O para loop neste caso deveria teoricamente contar de 0 até o número de barras no gráfico. MAS!!! O segundo enquanto o loop interfere aqui e recalcula tanto i como limite.

Não consigo entender porque deveria tê-lo feito e quem me ensinou a fazê-lo...

Aqui está um exemplo: barras - 100, barrasToProcess = 5.

Durante a primeira execução do indicador, counted_bars=0, ainda não foram contados, portanto limite=100. Isso significa que o loop para o início deve ser executado 100 vezes, de 0 a 99.

Iterações do for loop:

1. i=0, limit=barsToProcess=5, while(i<5) - o laço interno com linhas e carrapatos desenhados é executado 5 vezes, de 0 a 4, toda vez que i++, ao terminar enquanto - i=5, limit=5.

2. i=5=limite - para loop está completo.

ISTO É ISTO! O indicador não faz mais nada até o próximo tique. Um tick vem, counted_bars=99, limit=Bars-counted_bars= 100-99=1.

O loop for é executado uma vez, o loop while não é executado (uma vez que a condição se (limite>barrasParaProcesso) não é cumprida). Continuaremos até que o indicador seja descarregado do gráfico ou até que o cronograma seja alterado, em geral, até a reinicialização do indicador.

Na verdade, o indicador desenha suas linhas de seleção uma vez quando é carregado na tabela, e permanece ocioso até a reinicialização. A questão é: por que precisamos de um indicador desse tipo? O roteiro pode lidar com uma única resposta.

 

Eu reescrevi o código. Tudo parece estar correto com o laço.

Há ainda a questão de traçar a linha "tampão".

#property strict 

#property indicator_chart_window


extern int     Total_bars = 5;        //--- Кол-во отображаемых Элементов в истории


    //---  Глобальные переменные    

string Name_VLine;     //--- Имя Элементов

string Name_CHECK;     //--- Имя Элементов


MqlRates    mqlRates[1]; //Структура для хранения информации 


#property indicator_buffers 1

#property indicator_type1   DRAW_LINE   // тип графического построения - линия 

#property indicator_color1  clrRed      // цвет линии 

#property indicator_style1  STYLE_SOLID // стиль линии 

#property indicator_width1  1           // толщина линии 


double Buff_High[];

 

//+------------------------------------------------------------------+

int OnInit()

  {

     return(INIT_SUCCEEDED);

  }

//+------------------------------------------------------------------+

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

{

  

     SetIndexBuffer(0,Buff_High);     

     SetIndexStyle(0,DRAW_LINE);     

     SetIndexStyle(0,DRAW_SECTION);

     

//+------------------------------------------------------------------+

int limit;                                //--- переменная  старт кол-во баров. Линии рисуем о по всем барам

int counted_bars = IndicatorCounted();     //--- перем counted_bars = функц.  Возвращает количество баров

   

if(counted_bars > 0) counted_bars --;      //--- последний посчитанный бар будет пересчитан 

  //--- основной цикл 

  limit = Bars - counted_bars;         

  for(int i = 0; i <= limit; i ++)

   {

     if(limit > Total_bars)              //--- Если кол-во баров на графике > Кол-ву выбранных элементов 

      {

       limit = Total_bars-1;              //--- тогда кол-во баров на графике = Кол-ву выбранных элементов

      }

      

   datetime t_Line = iTime(Symbol(),PERIOD_H4,i);         //--- В ПЕРЕМ t_Line Будет Присваиваться значение времени открытия бара

   CopyRates(_Symbol, PERIOD_H4, t_Line, 1, mqlRates);    //--- Структура для хранения информации 

         

   //+------------------------ Рисуем вертикальную линии -----------------------------------------------------+                 

   ObjectCreate (Name_VLine + " VLine" + DoubleToStr(i,0),OBJ_VLINE,0,t_Line,0);         //--- Создаём обьект вертикальную линию

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_STYLE,2);              //--- Со стилем

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_COLOR,DimGray);        //--- Со цветом  

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_WIDTH,0);              //--- С  толщиной

   ObjectSet    (Name_VLine + " VLine" + DoubleToStr(i,0),OBJPROP_BACK,0);               //--- С типом отображения. Объект на заднем плане


   //--- кубики по хай (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].high, t_Line,mqlRates[0].high);

   ObjectSetInteger(0,Name_CHECK + "H_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 

   

   //--- кубики по лоу (В место галочек нужно подставить кубики)

   ObjectCreate    (0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJ_ARROW_CHECK, 0, t_Line, mqlRates[0].low, t_Line,mqlRates[0].low);

   ObjectSetInteger(0,Name_CHECK + "L_CHECK" + DoubleToStr(i,0), OBJPROP_COLOR, clrGreen); 


  // На ТФ Н4 линии рисуются по хайям,

  // При смене ТФ линия рисуется на растоянии параметра Total_bars. 

  

   //--- Заполнение буфера

   Buff_High[i] = mqlRates[0].high ;  

  

   }

    return(rates_total);

}

//+------------------------------------------------------------------+


 
evillive:

Por que eu fiz isso, quem me ensinou, eu não entendo...

Encontrei um indicador adequado e "desmontei-o", até que o fragmento que eu precisava permaneceu. Depois reuni os fragmentos do código e consegui o que precisava. É assim.

"Estou aprendendo".

 
Alex_Profit:

Eu reescrevi o código. Tudo parece estar correto com o laço.

Há ainda a questão de traçar a linha "tampão".

Para colar o código há um botão SRC no painel superior da janela de edição de mensagens, ele insere o código de forma agradável e sem linhas vazias.

A linha provavelmente terá que ser desenhada também por objetos (tendência), armazenar o tempo/preço anterior em variáveis separadas e usar como segundo ponto de coordenadas.

Para substituir um tick por outro símbolo -OBJ_ARROW e ARROW_CODE.

 
evillive:

Para inserção de código há um botão SRC no painel superior da janela de edição de mensagens, insere o código de forma agradável e sem linhas vazias.

A linha provavelmente terá que ser desenhada também por objetos (tendência), armazenar o tempo/preço anterior em variáveis separadas e usar como segundo ponto de coordenadas.

Para substituir um tick por outro símbolo -OBJ_ARROW e ARROW_CODE.

O que não é gostar

DESENHAR_SECÇÃO

1

Segmentos de linha entre valores de linha não vazios

 
AlexeyVik:

А чем не нравится

DRAW_SECTION

1

Отрезки между непустыми значениями линии

Eu não sei como aplicá-lo.

 
AlexeyVik:

O que não deve ser gostado em

DESENHAR_SECÇÃO

1

Segmentos de linha entre os valores não vazios da linha

Vivos malignos:

A linha provavelmente teria que ser desenhada também por objetos (tendência), armazenar o tempo/preço anterior em variáveis separadas e usar como segundo ponto de coordenadas.

A idéia é boa. Vou tentar se funcionar.

De fato, não há necessidade de desenhá-la. Desde que funcione corretamente.

 

Alex_Profit:

Eu não sei como aplicá-lo.

Simplesmente no OnInit() em vez de

SetIndexStyle(0, DRAW_LINE);

escreva

SetIndexStyle(0, DRAW_SECTION);

 

De alguma forma nenhuma mudança

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[])
{
  
     SetIndexBuffer(0,Buff_High);     
     //SetIndexStyle(0,DRAW_LINE);     
     SetIndexStyle(0,DRAW_SECTION);