포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 979

 
Vadim_2015 :

친애하는, 나는 내가 달성하고 싶은 것을 최대한 설명하려고 노력할 것입니다 ... ..또는 성공할 것입니다 ..또는 나는 모두를 완전히 혼란스럽게 할 것입니다!

...

우리는 대화를 계속합니다 ... 내가 이해하기로는 작업을 다음과 같이 줄일 수 있습니다. 단순화하기 위해 H1 기간인 어제만 공부할 것입니다.

먼저, 종가가 시가보다 높은 가장 이른 양초(어제 차트의 왼쪽에서 본)를 찾습니다. 최초의 강세 양초를 찾고 있습니다. 그러한 양초가 발견되면 그 양초(포함)에서 시작하여 주어진 날짜의 최신 날짜까지 최고가가 가장 높은 양초를 찾아야 합니다. 예를 들어, 첫 번째 강세 양초 의 개장 시간 이 10:00이고 그 다음부터 23:00 양초까지라면 최고가가 가장 높은 양초를 찾고 있습니다. 그래서?

 
paladin80 :

우리는 대화를 계속합니다 ... 내가 이해하기로는 작업을 다음과 같이 줄일 수 있습니다. 단순화하기 위해 H1 기간인 어제만 공부할 것입니다.

먼저, 종가가 시가보다 높은 가장 이른 양초(어제 차트의 왼쪽에서 본)를 찾습니다. 최초의 강세 양초를 찾고 있습니다. 그러한 양초가 발견되면 그 양초(포함)에서 시작하여 주어진 날짜의 최신 날짜까지 최고가가 가장 높은 양초를 찾아야 합니다. 예를 들어, 첫 번째 강세 양초의 개장 시간이 10:00이고 그 다음부터 23:00 양초까지라면 최고가가 가장 높은 양초를 찾고 있습니다. 그래서?

OOO, 전능하신 분을 찬양합니다... 그들은 저를 이해했습니다! 네! 네! 네! 이것이 바로 제가 달성하려는 것입니다. 알고 계시다면 방법을 알려주세요?
 
Vadim_2015 :
OOO, 전능하신 분을 찬양합니다... 그들은 저를 이해했습니다! 네! 네! 네! 이것이 바로 제가 달성하려는 것입니다. 알고 계시다면 방법을 알려주세요?
이해합니다. 생각하려고 합니다. 하지만 현재 상황에 따라 다릅니다. 앞으로 질문이 나타나면 프로그래머가 더 잘 이해할 수 있도록 거의 같은 방식으로 형식을 지정하십시오.
 
Vadim_2015 :
OOO, 전능하신 분을 찬양합니다... 그들은 저를 이해했습니다! 네! 네! 네! 이것이 바로 제가 달성하려는 것입니다. 알고 계시다면 방법을 알려주세요?

이것이 어제의 촛불이면 iHigest() 의 끝이 되며 iBarShift () 에서 얻은 다음 날(즉, 오늘)의 시작 00:00 입니다.

샘플 알고리즘:

1. 오늘 우리는 어제의 시간봉 중 첫 번째 강세봉을 찾고 있습니다. endBar의 인덱스로 둡니다.

2. 오늘 첫 번째 시간별 막대를 결정합니다. 아니면 null이 될 것인가...

3. iHighest()에서 끝에서 두 번째 매개변수 endBar(또는 지정될 endBar +1)를 설정하고 마지막 매개변수는 1입니다. 필요한 간격에서 가장 높은 High를 갖는 막대의 인덱스를 얻습니다.

4. 원하는 결과 High[iHighest(적절한 매개변수 포함)] // 또는 이전 단락에서 값이 할당된 해당 변수.

 
Vadim_2015 :
OOO, 전능하신 분을 찬양합니다... 그들은 저를 이해했습니다! 네! 네! 네! 이것이 바로 제가 달성하려는 것입니다. 알고 계시다면 방법을 알려주세요?
 void OnStart ()
  {
 double   longValue;
 datetime t1,t2;    
 int b1,b2,h; 
 
 int bStart = iBarOfDayReal(); //бар, с которого уходим в историю
           Print ( "" ,bStart);                 
   for ( int i=bStart;i<bStart+ 1000 ;i++)
      {
       longValue = Close[i+ 1 ]-Open[i+ 3 ];
       
//--- само условие
         
       if (longValue> 0 ) 
       {
      t1= iTime( NULL , 0 ,i); //
      t2= iTime( NULL , PERIOD_D1 ,iBarShift( NULL , PERIOD_D1 ,t1, false )- 1 ); //00.00.00 время 
      
     // Print("",TimeToStr(t1,TIME_DATE|TIME_SECONDS)); 
     // int("",TimeToStr(t2,TIME_DATE|TIME_SECONDS))Pr;
     
      b1= iBarShift( NULL , 0 ,t1, false );
      b2= iBarShift( NULL , 0 ,t2, false ); 
      
      h=iHighest( NULL , 0 ,MODE_HIGH,b1-b2+ 1 ,b2); //нашли максимум
      
      SetArrow( 159 , clrCoral , "h" +( string )Time[h],Time[h],High[h]); //рисуем пипичку
     
       }
   }
  }
//+------------------------------------------------------------------+
void SetArrow( int cd, color cl,
               string nm= "" , datetime t1= 0 , double p1= 0 , int sz= 0 ) {
   if (nm== "" ) nm=DoubleToStr(Time[ 0 ], 0 );
   if (t1<= 0 ) t1=Time[ 0 ];
   if (p1<= 0 ) p1=Bid;
   if ( ObjectFind (nm)< 0 ) ObjectCreate (nm, OBJ_ARROW , 0 , 0 , 0 );
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE , cd);
  ObjectSet(nm, OBJPROP_COLOR     , cl);
  ObjectSet(nm, OBJPROP_WIDTH     , sz);
}
//-------------------------------------------------------------------+
int iBarOfDayReal( string sy= "" , int tf= 0 , datetime dt= 0 ) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
   if (tf<= 0 ) tf= Period ();
   if (dt<= 0 ) dt= TimeCurrent ();
   if (tf> PERIOD_D1 ) {
     Print ( "iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1" );
     return ( 0 );
  }

   int cd=TimeDay(dt);                       // текущий день месяца
   int nb=iBarShift(sy, tf, dt, False);       // номер текущего бара
   int bd= 0 ;                                 // номер бара от начала суток

   while (TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

   return (bd);
}
   
  
//+------------------------------------------------------------------+
스크립트! 우리는 시도합니다.
 
r772ra :
스크립트! 우리는 시도합니다.

r772ra 정말 감사합니다!!! 스크립트는 필요한 작업을 수행합니다! 물론 마지막 코드 블록에서 모든 것이 명확하지는 않지만 알아낼 것입니다. 중요한 것은 작동합니다. 지표로 옮기도록 노력하겠습니다.

팔라딘80 :

앞으로 질문이 나타나면 프로그래머가 더 잘 이해할 수 있도록 거의 같은 방식으로 형식을 지정하십시오.

물론이죠, 제가 배우겠습니다!

모두에게 큰 감사를 드립니다!

 
Vadim_2015 :

r772ra 정말 감사합니다!!! 스크립트는 필요한 작업을 수행합니다! 물론 마지막 코드 블록에서 모든 것이 명확 하지는 않지만 괜찮습니다. 제가 알아낼 것입니다. 중요한 것은 작동합니다. 지표로 옮기도록 노력하겠습니다.

물론이죠, 제가 배우겠습니다!

모두에게 큰 감사를 드립니다!

구체적으로 명확하지 않은 것은?
 
r772ra :
구체적으로 명확하지 않은 것은?

스크립트 코드 _" void SetArrow( int cd, color cl, " 이것은 사용자의 " _ OnInit()" 함수를 참조하는 코드 부분입니다. 표시기 및 코드의 전반부 script_" void OnStart () "는 표시기의 "_OnCalculate" 기능을 의미합니까? 대략적으로 말하면 스크립트에서 먼저 1) 계산, 2) 초기화만 있습니다. 표시기에서는 그 반대가 사실입니다.

 
Vadim_2015 :

스크립트 코드 _" void SetArrow( int cd, color cl, " 이것은 사용자의 " _ OnInit()" 함수를 참조하는 코드 부분입니다. 표시기 및 코드의 전반부 script_" void OnStart () "는 표시기의 "_OnCalculate" 기능을 의미합니까? 대략적으로 말하면 스크립트에서 먼저 1) 계산, 2) 초기화만 있습니다. 표시기에서는 그 반대가 사실입니다.

다른 함수 외부에 있는 사용자 정의 함수입니다.

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка значка на графике, объект OBJ_ARROW.                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cd - код значка                                                         |
//|    cl - цвет значка                                                        |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время открытия бара        (0  - текущий бар)                      |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    sz - размер значка              (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetArrow( int cd, color cl,
               string nm= "" , datetime t1= 0 , double p1= 0 , int sz= 0 ) {
   if (nm== "" ) nm=DoubleToStr(Time[ 0 ], 0 );
   if (t1<= 0 ) t1=Time[ 0 ];
   if (p1<= 0 ) p1=Bid;
   if ( ObjectFind (nm)< 0 ) ObjectCreate (nm, OBJ_ARROW , 0 , 0 , 0 );
  ObjectSet(nm, OBJPROP_TIME1    , t1);
  ObjectSet(nm, OBJPROP_PRICE1   , p1);
  ObjectSet(nm, OBJPROP_ARROWCODE , cd);
  ObjectSet(nm, OBJPROP_COLOR     , cl);
  ObjectSet(nm, OBJPROP_WIDTH     , sz);
}

다른 함수에서 함수 호출

SetArrow( 159 , clrCoral , "h" +( string )Time[h],Time[h],High[h]); //рисуем пипичку

나는 당신이 표시기에 그것을 필요로하지 않는다고 생각합니다. 버퍼는 그리기를 담당합니다.

즉.

          longBarsBuffer[i]=High[h]+ 5 * Point (); - то что необходимо получить. 
       else 
          longBarsBuffer[i]= 0.0 ; 

더 멀리

기능

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal( string sy= "" , int tf= 0 , datetime dt= 0 ) {
   if (sy== "" || sy== "0" ) sy= Symbol ();
   if (tf<= 0 ) tf= Period ();
   if (dt<= 0 ) dt= TimeCurrent ();
   if (tf> PERIOD_D1 ) {
     Print ( "iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1" );
     return ( 0 );
  }

   int cd=TimeDay(dt);                       // текущий день месяца
   int nb=iBarShift(sy, tf, dt, False);       // номер текущего бара
   int bd= 0 ;                                 // номер бара от начала суток

   while (TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

   return (bd);
}

그리고 전화

우리는 하루의 시작에서 막대의 수를 찾고(현재 날짜는 다시 계산되지 않음) 해당 막대는 기록에 기록됩니다.

 int bStart = iBarOfDayReal(); //бар, с которого уходим в историю
 
가산))) 기능은 여기에서 가져옵니다.