[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 481

 
midorum :
Bars-30 시도
아니요, 사실이 아닙니다. 이것은 논리적으로 왼쪽에 30개의 막대를 들여쓰고 0번째 막대까지 그립니다.
 
SetIndexDrawBegin ( 0 , Bars - 30 ); //первый бар отрисовки индикатора 

무슨 논리인지 모르겠어, 표시기의 마지막 30개 막대를 그리는 설정이 있습니다.

다시 한 번 반복합니다. SetIndexDrawBegin()은 차트의 왼쪽 끝에서 막대를 계산합니다.

논쟁하기 전에 확인

 
merkulov.artem :

좋은. 나는 문제의 본질을 말하려고 노력할 것입니다. 아마도 누군가가 당신에게 말하거나 더 간단하게 구현하는 데 도움을 줄 것입니다.

우리는 분 차트에서 작업합니다. 2012년 10월 29일 00:00에 차트에서 분 막대(높은+낮은/2 - 막대의 평균값)를 가져옵니다. 이것이 시작점이 될 것입니다.

다음으로 이 가격과의 편차를 10포인트 위쪽으로 확인합니다(각 올바른 편차는 +1이 됨).

시작점에서 10포인트의 가격 인상에 도달하면 - 카운터 +1; 편차에 도달한 지점에서 10포인트만 더 편차를 확인하고 다음 가격이 10포인트 오를 때까지 기다립니다.

예를 들어 다음을 얻습니다.

(시작점) + 10핍 <= 가격인 경우(시작점에서 모든 후속 막대 가격을 사용합니다.) 카운터 = 카운터 +1을 얻습니다. 그리고 우리는 이미이 장소에서 시작점을 시작합니다 - (시작점 + 10 점).

If ( 시작점 + 10 포인트 ) + 1 0 포인트 <= 가격 (우리는 시작점에서 모든 후속 막대 가격을 사용합니다.) 우리는 카운터 = 카운터 +1을 얻습니다. 그리고 우리는 이미 이 곳에서 시작점을 시작합니다. ( 시작점 + 10점 ) + 1 0점 .

If ( 시작점 + 10 핍 + 1 0 핍) + 10 핍 <= 가격 (우리는 시작점에서 모든 후속 막대 가격을 사용합니다.) 우리는 counter= counter +1을 얻습니다. 그리고 우리는 이미 이 곳에서 시작점을 시작합니다 - ( 시작점 + 10점 + 10 점) + 10점 .  

등...

10( 카운터 == 10 )과 같은 카운터에 도달할 때까지.

그리고 새로 형성된 각각 의 분 막대(높은+낮은/2 - 막대의 평균값)가 이 조건에 대해 확인 되고 10( 카운터 == 10 ) 과 같은 카운터에 도달할 때까지 기다립니다 . 이틀이 지났다고 가정 해 봅시다. 우리는 각각의 새로운 형성된 막대를 확인하고 조건이 올바른지 이동했습니다 ....

그리고 counter =10에 도달했을 때 - "Counter == 10"이라는 메시지를 표시합니다. 사용자가 원래 설정한 시작점에서 2일 앞서 시작점을 이동합니다. 10/29/12 00:00부터 10/31/12 00:00까지 순환을 반복합니다.

우리는 주기를 반복하므로 일정에 따라 움직입니다.

저것들. 새로 형성된 막대를 가져와 스레드로 가져 가야 합니다 (높은+낮은/2 - 막대의 평균 값). 그리고 조건을 확인하고 조건이 맞으면 위와 같이 변속합니다.

배열을 통해 구현해 보았는데 매우 혼란스럽고 잘못된 값을 제공합니다!! 이 알고리즘을 구현하는 방법을 도와주세요!


여기서는 배열이 필요하지 않습니다. 고문, 대본, 지표는 무엇입니까? 요점은 이 작업을 구현하기 위해 EA 코드가 표시기 코드와 다르다는 것입니다.

그리고 여기에는 중요한 단점이 있습니다. 보세요, 우리는 시작점을 표시했고 그것은 상승 추세의 정점 캔들에 정확히 떨어졌습니다. 10 포인트에 대한 추가 낚시에서이 양초의 판독 값을 고려하지 않는다고 가정 해 봅시다. 시작 양초라고합시다. 그래서 다음 양초가 내려갔고 레벨 = 시작점 + 10점으로도 잡지 않을 것입니다. 그러면 가격이 내려갑니다. 따라서 우리는 말하자면 오랫동안 갇혀 있습니다. 가격이 떨어졌고 원하는대로 바닥에서 흔들릴 수 있습니다. 여전히 시작점 수준에 도달하지 않을 것입니다. 곰이 세게 눌렀습니다. 그런데 운이 좋게도 5,000캔들 이후 가격이 원점으로 돌아가서 10포인트 플러스를 넘었다고 합시다. 우리는 많은 시간을 낭비했지만 이제 배열에 입력하지 않고 시작점 + 10핍과 동일한 가변 가격으로 입력하고 이제 가격이 레벨 = 가변 레벨 + 10핍에 도달할 때까지 기다립니다... 요컨대,이 모든 것이 필요하지 않습니다. 귀하의 설명에 따라 판단하면 레벨 = 시작점 + 10 * 10 = 시작점 + 100점입니다. 이 수준에 도달하자마자 시작 날짜를 2일 앞으로 이동하고 새 시작 지점을 계산합니다. 그것은 모두 sloeno입니다 - 더 쉬운 방법이 있습니다.

사용자 변수에 시작 날짜를 설정합니다(코드에서 extern이라는 단어가 앞에 옴). datetime형의 변수를 선언합니다. 이것을 dt_StartDate 변수(시작 날짜)로 하고 초기화 블록에서 즉시 사용자 변수에 저장된 값을 할당합니다. 다음으로 이 날짜에 해당하는 양초를 찾고 공식에 따라 시작점을 계산합니다. 이것은 시작점이 아니라 시작 가격 수준입니다. 예를 들어 d_StartLevel(시작 수준)과 같은 double 유형의 변수를 선언하고 계산된 수준의 값을 변수에 입력합니다. 또는 훨씬 더 간단할 수 있습니다. 변수를 선언하지 않고 즉시 계산된 시작 가격을 통해 수평선 을 그립니다. 그래서 더 좋습니다. 이 라인을 StartLevel이라고 부르겠습니다. 이제 시작 수준에서 위로 100포인트 떨어진 위치에 차트의 두 번째 선을 그립니다. 이 선을 "트랩 수준"(OtlovLevel)이라고 부르겠습니다. 그게 다야, 더 이상 배열이 필요하지 않습니다. 가격이 OtlovLevel보다 높아졌는지 여부를 어리석게도 각 틱을 살펴봅니다. dt_StartDate 변수의 값을 2일 늘리고 시작 레벨을 다시 계산하고 시작 라인을 거기로 전송합니다. 그런 다음 다시 시작선에서 위쪽으로 100점을 따로 두고 OtlovLevel 선을 거기로 끕니다. 그게 다야, 작업이 해결되었습니다. 매번 라인이 설정된 가격을 요청하고 현재 가격 또는 현재 캔들의 고가와 비교할 수 있습니다.

 
midorum :

무슨 논리인지 모르겠어, 표시기의 마지막 30개 막대를 그리는 설정이 있습니다.

다시 한 번 반복합니다. SetIndexDrawBegin()은 차트의 왼쪽 끝에서 막대를 계산합니다.

논쟁하기 전에 확인

그래서 저는 논쟁하지 않습니다. 바라보다. 우리는 표준 CCI 지표를 사용합니다. SetIndexDrawBegin 함수에서 CCIPeriod( Bars - CCIPeriod ) 로 대체 했습니다. 코드에서 강조표시된 노란색만 변경했습니다..

코드는 다음과 같습니다.

 //+------------------------------------------------------------------+
//|                                                          CCI.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link       "http://www.metaquotes.net/"
//----
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 LightSeaGreen
//---- input parameters
extern int CCIPeriod = 14 ;
//---- buffers
double CCIBuffer[];
double RelBuffer[];
double DevBuffer[];
double MovBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- 3 additional buffers are used for counting.
   IndicatorBuffers ( 4 );
   SetIndexBuffer ( 1 , RelBuffer);
   SetIndexBuffer ( 2 , DevBuffer);
   SetIndexBuffer ( 3 , MovBuffer);
//---- indicator lines
   SetIndexStyle ( 0 , DRAW_LINE );
   SetIndexBuffer ( 0 , CCIBuffer);
//----
   if (CCIPeriod <= 0 )
       CCIPeriod = 14 ;
//----
   SetIndexDrawBegin ( 0 , Bars - CCIPeriod);
  
//---- name for DataWindow and indicator subwindow label
   short_name= "CCI(" + CCIPeriod + ")" ;
   IndicatorShortName (short_name);
   SetIndexLabel ( 0 , short_name);
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Commodity Channel Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int     i, k, counted_bars = IndicatorCounted ();
   double price, sum, mul; 
   if (CCIPeriod <= 1 )
       return ( 0 );
   if ( Bars <= CCIPeriod) 
       return ( 0 );
//---- initial zero
   if (counted_bars < 1 )
     {
       for (i = 1 ; i <= CCIPeriod; i++) 
           CCIBuffer[ Bars -i] = 0.0 ;
       for (i = 1 ; i <= CCIPeriod; i++) 
           DevBuffer[ Bars -i] = 0.0 ;
       for (i = 1 ; i <= CCIPeriod; i++) 
           MovBuffer[ Bars -i] = 0.0 ;
     }
//---- last counted bar will be recounted
   int limit = Bars - counted_bars;
   if (counted_bars > 0 ) 
       limit++;
//---- moving average
   for (i = 0 ; i < limit; i++)
       MovBuffer[i] = iMA ( NULL , 0 , CCIPeriod, 0 , MODE_SMA , PRICE_TYPICAL , i);
//---- standard deviations
   i = Bars - CCIPeriod + 1 ;
   if (counted_bars > CCIPeriod - 1 ) 
       i = Bars - counted_bars - 1 ;
   mul = 0.015 / CCIPeriod;
   while (i >= 0 )
     {
       sum = 0.0 ;
       k = i + CCIPeriod - 1 ;
       while (k >= i)
        {
          price =(High[k] + Low[k] + Close[k]) / 3 ;
          sum += MathAbs (price - MovBuffer[i]);
          k--;
        }
       DevBuffer[i] = sum*mul;
       i--;
     }
   i = Bars - CCIPeriod + 1 ;
   if (counted_bars > CCIPeriod - 1 ) 
       i = Bars - counted_bars - 1 ;
   while (i >= 0 )
     {
       price = (High[i] + Low[i] + Close[i]) / 3 ;
       RelBuffer[i] = price - MovBuffer[i];
       i--;
     }
//---- cci counting
   i = Bars - CCIPeriod + 1 ;
   if (counted_bars > CCIPeriod - 1 ) 
       i = Bars - counted_bars - 1 ;
   while (i >= 0 )
     {
       if (DevBuffer[i] == 0.0 ) 
           CCIBuffer[i] = 0.0 ;
       else 
           CCIBuffer[i] = RelBuffer[i] / DevBuffer[i];
       i--;
     }
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

논리적으로 CCIPeriod 가 14와 같으면 SetIndexDrawBegin ( 0 , Bars - CCIPeriod) 을 사용하여 마지막 막대 14개만 그려야 합니다. 값에서 시작 (Bar - 14) . 하지만 이것은 내가 화면에서 본 것입니다

 
hoz :

그래서 저는 논쟁하지 않습니다. 바라보다. 우리는 표준 CCI 지표를 사용합니다. SetIndexDrawBegin 함수에서 CCIPeriod( Bars - CCIPeriod ) 로 대체 했습니다. 코드에서 강조표시된 노란색만 변경했습니다..

코드는 다음과 같습니다.

논리적으로 CCIPeriod 가 14와 같으면 SetIndexDrawBegin ( 0 , Bars - CCIPeriod) 을 사용하여 마지막 막대 14개만 그려야 합니다. 값에서 시작 (Bar - 14) . 하지만 이것은 내가 화면에서 본 것입니다

이것은 내가 화면에서 보는 것입니다

기본 표시기 위, 아래가 SetIndexDrawBegin(0, Bars-CCIPeriod)로 변경됨;

 
미도룸 , 죄송합니다. 내 무뚝뚝한. MetaEditor 가 다른 터미널을 열었습니다... 이제 모든 것이 작동합니다. 고맙습니다!
 
hoz :
미도룸 , 죄송합니다. 내 무뚝뚝한. MetaEditor 가 다른 터미널을 열었습니다... 이제 모든 것이 작동합니다. 고맙습니다!
예, 나는 또한이 문제로 끊임없이 고통 받고 있습니다. 터미널이 3 개이고 편집기가 폴더를 혼동합니다. 터미널의 버튼을 통해 시작하고 수동으로 여는 것이 좋습니다.
[Deleted]  

안녕하세요! 친절한 분들 답변 부탁드립니다 15분 초가 열렸는지 확인하는 방법 아슬아슬한 선을 이용했는데 알고보니 초가 항상 제시간에 열리지는 않더라구요... 더 쉬운 방법이 있는것 같아요 촛불이 열렸다는 사실을 알게 되지만... 어쩐지 이해가 되지 않는다...

if ((TimeMinute( TimeCurrent() )==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute (TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0))

 
stater :

안녕하세요! 친절한 분들 답변 부탁드립니다 15분 초가 열렸는지 확인하는 방법 숨막히는 선을 사용했는데 알고보니 초가 항상 제시간에 열리지는 않습니다... 더 쉬운 방법이 있는것 같아요 촛불이 열렸다는 사실을 알게 되지만... 어쩐지 이해가 되지 않는다...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute (TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0))


https://www.mql5.com/ru/forum/131853/page4#504607
 
stater :

안녕하세요! 친절한 분들 답변 부탁드립니다 15분 초가 열렸는지 확인하는 방법 숨막히는 선을 사용했는데 알고보니 초가 항상 제시간에 열리지는 않습니다... 더 쉬운 방법이 있는것 같아요 촛불이 열렸다는 사실을 알게 되지만... 어쩐지 이해가 되지 않는다...

if ((TimeMinute(TimeCurrent())==0 && TimeSeconds(TimeCurrent())==0)|| (TimeMinute(TimeCurrent())==15 && TimeSeconds(TimeCurrent())==0) || (TimeMinute (TimeCurrent())==30 && TimeSeconds(TimeCurrent())==0) || (TimeMinute(TimeCurrent())==45 && TimeSeconds(TimeCurrent())==0))


 bool CheckOpenM15()
{
   static int PrevTime= 0 ;
   if (PrevTime== iTime ( NULL , PERIOD_M15 , 0 )) return (false);
   PrevTime= iTime ( NULL , PERIOD_M15 , 0 );
   return (true);
}
М15에 새 막대 가 나타나면 함수가 true를 반환합니다.