정사각형 또는 직사각형 그리기. 정말 도움이 필요해요... - 페이지 6

 
evillive :

글쎄, 그는 어디에서 일합니까? 선은 TK가 아니라 각 막대에 그려집니다. 또는 TF=H1 위의 그림에서?

루프의 각 반복에서 한계i 가 같아지는 종이에 다시 계산하십시오.

위에 표시된 예는 내가 이해하는 한 고려되지 않았습니다.

화살표 확인란은 표시기 버퍼와 촛불 그림자를 연결하는 선을 사용하여 그릴 수 있습니다.

PERIOD_H;. H4 기간 이하는 모든 것이 잘 그려집니다.

나는 = 0;

한계는 외부 변수 기본값 = 5입니다.

외부 int barToProcess = 5; //--- 표시된 기간(줄) 수 .

"촛불 그림자를 연결하는 선과 같이 표시기 버퍼를 사용하여 화살표 눈금을 그릴 수 있습니다."

이렇게 이해합니다.

인덱스가 [Limit]인 버퍼에는 Array에서 높은 값이 할당됩니다.

이중 Buf_High[Limit] = mqlRates [0].high ;

각 막대에서 원을 그리는 방법을 이해합니다. 그러나 모든 H4 막대에서와 같이 아무 것도 없습니다.

 
Alex_Profit :

PERIOD_H;. H4 기간 이하는 모든 것이 잘 그려집니다.

나는 = 0;

한계는 외부 변수 기본값 = 5입니다.

외부 int barToProcess = 5; //--- 표시된 기간(줄) 수 .

"촛불 그림자를 연결하는 선과 같이 표시기 버퍼를 사용하여 화살표 눈금을 그릴 수 있습니다."

이렇게 이해합니다.

인덱스가 [Limit]인 버퍼에는 Array에서 높은 값이 할당됩니다.

이중 Buf_High[Limit] = mqlRates[0].high ;

각 막대에서 원을 그리는 방법을 이해합니다. 그러나 모든 H4 막대에서와 같이 아무 것도 없습니다.

루프를 사용하기 전에 루프가 어떻게 작동하는지 이해하십시오. i = 처음에만 0, 그 다음에는 i++, 한계까지.

표시기의 첫 번째 실행에서 limit=Bars-counted_bars= Bars-0=Bars.

for 루프는 이론적으로 0에서 차트의 막대 수까지 계산해야 합니다. 하지만!!! 여기서 두 번째 while 루프 가 개입하여 i와 limit를 모두 다시 계산합니다.

왜 그랬는지, 누가 가르쳤는지, 나는 이해하지 못합니다 ...

손가락에 대한 예, 제공: 막대 - 100, barToProcess = 5.

표시기의 첫 번째 실행에서 counted_bars=0은 아직 계산되지 않았으므로 limit=100입니다. 따라서 처음에 for 루프는 0에서 99까지 100번 작동해야 합니다.

for 루프 반복:

1. i=0, limit=barsToProcess=5, while (i<5) - 내부 루프는 0에서 4까지 5번 라인과 체크 표시를 그리면서 실행됩니다. 매번 i++ 가 완료되면 while - i=5, limit =5 .

2. i=5=limit - for 루프가 종료되었습니다.

모두! 그런 다음 표시기는 다음 틱까지 아무 작업도 수행하지 않습니다. 틱이 도착했습니다(counted_bars=99, limit=Bars-counted_bars= 100-99=1).

for 루프는 1번, while 루프 는 실행되지 않습니다( if(limit>barsToProcess) 조건이 충족되지 않기 때문에). 그리고 지표가 차트에서 언로드 되거나 TF가 변경될 때까지 일반적으로 지표가 다시 초기화될 때까지 계속됩니다.

즉, 실제로 표시기는 차트에 로드할 때 확인 표시 선을 한 번 그린 다음 다시 초기화될 때까지 유휴 상태를 유지합니다. 그리고 왜 그러한 지표가 필요합니까? 단일 처리 및 스크립트로 대처합니다.

 

코드를 다시 작성했습니다. 모든 것이 주기에 맞는 것 같습니다.

"버퍼" 라인을 그리는 문제가 있었습니다.

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

왜 그랬는지, 누가 가르쳤는지, 나는 이해하지 못합니다 ...

적절한 지표를 찾아 필요한 조각이 남을 때까지 "분석"했습니다. 그런 다음 코드 조각을 수집하고 필요한 정보를 얻었습니다. 이 같은.

"나는 콧수염을 감아요" .

 
Alex_Profit :

코드를 다시 작성했습니다. 모든 것이 주기에 맞는 것 같습니다.

"버퍼" 라인을 그리는 문제가 있었습니다.

코드를 삽입하기 위해 메시지 편집 창의 상단 패널에 SRC 버튼이 있는데, 빈 줄 없이 코드를 멋지게 삽입합니다.

선은 또한 개체(추세)와 함께 그려야 하고 별도의 변수에 이전 시간/가격을 기억하고 두 번째 점의 좌표로 사용해야 합니다.

눈금을 다른 문자로 바꾸려면 - OBJ_ARROW 및 ARROW_CODE.

 
evillive :

코드를 삽입하기 위해 메시지 편집 창의 상단 패널에 SRC 버튼이 있는데, 빈 줄 없이 코드를 멋지게 삽입합니다.

선은 또한 개체(추세)와 함께 그려야 하고 별도의 변수에 이전 시간/가격을 기억하고 두 번째 점의 좌표로 사용해야 합니다.

눈금을 다른 기호로 바꾸려면 - OBJ_ARROW 및 ARROW_CODE.

좋아하지 않는 것

DRAW_SECTION

하나

공백이 아닌 라인 값 사이의 세그먼트

 
AlexeyVik :

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

DRAW_SECTION

1

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

적용하는 방법을 모르겠습니다.

 
AlexeyVik :

좋아하지 않는 것

DRAW_SECTION

하나

비어 있지 않은 라인 값 사이의 세그먼트

사악한 라이브 :

선은 또한 개체(추세)와 함께 그려야 하고 별도의 변수에 이전 시간/가격을 기억하고 두 번째 점의 좌표로 사용해야 합니다.

아이디어가 좋습니다. 작동하는지 시도하겠습니다.

사실, 그릴 조끼가 없습니다. 그것이 제대로 작동하는 한.

 

Alex_Profit :

적용하는 방법을 모르겠습니다.

대신 OnInit()에서

SetIndexStyle(0, DRAW_LINE);

쓰다

SetIndexStyle(0, DRAW_SECTION);

 

어떤 이유로 변경 없음

 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 );
사유: