찻주전자의 질문 - 페이지 235

 
lazarev-dm :

이렇게 변경됨

일하는 것 같다

귀하의 어레이는 직렬이 아닙니다.

그래서 여기 있습니다 -

Buffer[i+ 1 ]=Buffer[i]+delta;

미래를 엿보다


0 bar는 다시 계산되지 않습니다 - 같은 이유로 - 당신은 시작했습니다 - 그것은 0에서 시작하지 않습니다

 
sergeev :

귀하의 어레이는 직렬이 아닙니다.

그래서 여기 있습니다 -

미래를 엿보다


0 bar는 다시 계산되지 않습니다 - 같은 이유로 - 당신은 시작했습니다 - 그것은 0에서 시작하지 않습니다

나는 0 바가 공식에 의해 계산되지 않습니다

Buffer[ 0 ]=price[ 0 ]; 

그런 다음 가격 움직임을 기반으로 지표가 추세를 따라 잡을 것입니다.

예를 들어, 가격이 지표를 떠났고 움직이지 않을 경우 지표는 " 기간 " 양초의 가격을 따라잡을 것입니다. 이것은 저에게 일종의 MA 대안입니다.

 

lazarev-d-m :

그것은 나를 위해 MA에 대한 일종의 대안입니다.

미래에 대한 1개의 막대를 보면 이 대안을 휴지통에 안전하게 버릴 수 있습니다.
 

나의 첫 번째 지표. 문자를 0에서 100으로 조정하고 싶습니다. 제대로 하고 있습니까? 그리고 현재 막대를 다시 계산하지 않도록 하는 방법(테스터에서는 트위치하지만 차트에서는 안됨)

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1   "Main"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- indicator buffers
double          MainBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,MainBuffer, INDICATOR_DATA );
   IndicatorSetString ( INDICATOR_SHORTNAME , "NormSymbol" );
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
   ArrayInitialize (MainBuffer, EMPTY_VALUE );

//---
   return ( 0 );
  }
  
//+------------------------------------------------------------------+
//| 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[])
  {
   
   int first,bar,nLowBar= 0 ,nHighBar= 0 ;
   int nVizCount = ( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS );
   if (prev_calculated== 0 ) // проверка на первый старт расчёта индикатора
     {
      first= 0 ; // стартовый номер для расчёта всех баров
     }
   else
     {
      first=prev_calculated- 1 ; // стартовый номер для расчёта новых баров
     }


//---- основной цикл расчёта индикатора
   for (bar=first; bar<rates_total; bar++)
     {
      nLowBar = ArrayMinimum (low, bar, nVizCount);
      nHighBar= ArrayMaximum (high, bar, nVizCount);
       if (nLowBar> 0 && nHighBar> 0 && high[nHighBar]-low[nLowBar]!= 0 )
        {
         MainBuffer[bar]=((close[bar] -low[nLowBar])/(high[nHighBar]-low[nLowBar]))* 100 ;
        }
       else
        {
         MainBuffer[bar]= EMPTY_VALUE ;
        }
     }

  
//--- return value of prev_calculated for next call

   return (rates_total);
  }
 
Konstantin83 : 현재 막대가 다시 계산되지 않도록 하는 방법

현재 막대 의 여는 시간을 기억하고 들어오는 틱의 시간과 비교하십시오. 값이 일치하지 않는 경우에만 현재 막대의 값을 다시 계산합니다.

이것은 내가 초기화 블록에 넣을 것입니다:

   nVizCount = ( int ) ChartGetInteger ( 0 , CHART_VISIBLE_BARS );
   

변수는 프로그램의 전역 수준에서 선언됩니다.

 int first,bar,nLowBar= 0 ,nHighBar= 0 , nVizCount; 
 
Yedelkin :

현재 막대 의 여는 시간을 기억하고 들어오는 틱의 시간과 비교하십시오. 값이 일치하지 않는 경우에만 현재 막대의 값을 다시 계산합니다.

이것은 내가 초기화 블록에 넣을 것입니다:

고맙습니다. 일반적으로 모든 것이 정확합니까?
 
Konstantin83 : 일반적으로 모든 것이 정확합니까?

예, 나는 다른 것을 눈치 채지 못했습니다. 기사는 유사한 구조를 제안합니다. 0으로 나누기 테스트가 있습니다.

예, 다시 계산하지 않으려면 내가 기억하는 한 여전히 prev_calculated와 Rates_total을 비교할 수 있습니다.

 
Yedelkin :

예, 나는 다른 것을 눈치 채지 못했습니다. 기사는 유사한 구조를 제안합니다. 0으로 나누기 테스트가 있습니다.

예, 다시 계산하지 않으려면 내가 기억하는 한 여전히 prev_calculated와 Rates_total을 비교할 수 있습니다.

표시기로 터미널을 닫고 터미널을 시작 했는데 표시기가 선을 그리지 않는 이유를 아십니까? 다른 시간대로 전환하면 그려집니다.
 
Konstantin83 : 표시기로 터미널을 닫고 터미널을 시작 했는데 표시기가 선을 그리지 않는 이유를 아십니까? 다른 시간대로 전환하면 그려집니다.

시작 시 터미널은 "상승"하고 데이터베이스를 서버와 동기화하는 데 약간의 시간이 필요합니다. 표시기가 동시에 시작되면 표시기를 계산하기 위한 데이터가 아직 없을 수 있습니다. 가장 멍청한 솔루션을 시도하십시오. OnInit()에 몇 초의 지연을 삽입하십시오.

좋은 방법으로, 문제 영역을 검색할 때 모든 중요한 정보를 인쇄하는 것이 바람직합니다. 유형

 if (nLowBar< 0 ) Print ( "Ошибка, nLowBar=" ,nLowBar, ", prev_calculated=" ,prev_calculated,", bar=",bar);
 

Yedelkin :

forward666 : 시각화 필요

현재 시간 모드에서 거래에 대한 도움을 아직 찾지 못했습니다. 데모 계정에서 포지션을 열고 닫으십시오.

여기에서 찾았습니다: https://www.mql5.com/ru/forum/6343/page96#comment_419028