새 시간 프레임 차트로 변경할 때마다 내 표시기가 사라집니다. - 페이지 2

 

설명해 주셔서 감사합니다.

이제 더 잘 보입니다.

SCFX

 

안녕,

나는 그 미친 오류로 머리를 긁적입니다.

시간 프레임을 변경하면 여전히 4행 코드의 이 간단한 표시기가 사라집니다.

미친듯이 여기 게시된 제안을 이미 적용했지만 여전히 실패했습니다.

기분이 너무 나빠...

도와주세요.

많은 감사,

SCFX

 //+------------------------------------------------------------------+
//|                                                        H_roc.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_minimum -3.5
//#property indicator_maximum 3.5
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1   "boring"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1   1
//--- input parameters
//--- indicator buffers
double          boring[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,boring);
   
          
//---
   return (INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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 limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 300 ;
//---
 
 for ( int i= 1 ;i<=limit  ;i++)
{   if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50
     ) 
      boring[i]=Close[i];
    
}  
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+
 
scfx :

안녕,

나는 그 미친 오류로 머리를 긁적입니다.

시간 프레임을 변경하면 여전히 4행 코드의 이 간단한 표시기가 사라집니다.

미친듯이 여기 게시된 제안을 이미 적용했지만 여전히 실패했습니다.

기분이 너무 나쁨...

도와주세요.

많은 감사,

SCFX



2014.06.15 11:26:39.908 'test.mq4'에서 0분할 (59,44)
 
angevoyageur :
2014.06.15 11:26:39.908 'test.mq4'에서 0분할 (59,44)


답장해주셔서 감사합니다.

내 저널에는 그런 공지가 없지만 TF를 변경하면 이 표시기가 제거됩니다.

나는 아직 그것을 고칠 수 없습니다.

SCFX

2014.05.18 08:41:31.080 커스텀 인디케이터 H_889_boring GBPUSD,H1: 삭제됨
2014.05.18 08:41:25.441 사용자 지정 표시기 H_889_boring GBPUSD,H4: 성공적으로 로드됨

 
scfx :

나는 아직 그것을 고칠 수 없습니다.

SCFX

그것은 당신이 열심히 노력하지 않기 때문입니다.

다른 사람이 당신을 대신해 하게 하면 아무 것도 배울 수 없습니다. 유일한 방법은 스스로 하여 이해할 수 있도록 하는 것입니다. 스스로 하는 유일한 방법은 코드의 각 줄을 검토하고, 분해하고, 알아내는 것뿐입니다. 정확히 무엇을 하고 있으며 이를 수행하는 몇 가지 방법이 있습니다.

 for ( int i= 1 ;i<=limit  ;i++)
{   if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50
     ) // what is this parentheses doing here ? How can you expect to write code that works if you are this sloppy about it ?
      boring[i]=Close[i];
    
}  

다음은 문제의 원인을 찾는 데 도움이 될 수 있는 모든 것입니다.

  • 저널 탭을 확인했다고 하고 그 옆에 있는 전문가 탭을 보셨나요?
  • 지난 주에 귀하의 코드로 인해 배열이 범위를 벗어났다고 이미 말씀드린 바 있습니다. 이것이 의미하는 바를 알아보기 위해 찾아보았습니까?
  • 메타에디터에는 디버거를 사용하여 코드를 디버그하는 방법을 배울 수 있는 디버거가 있습니다.
  • Print()를 사용하면 코드가 실행될 때 변수의 값이 무엇인지 확인할 수 있습니다.

전문가 탭을 클릭했다면 지표가 이 선에서 0분할을 했으며 시간 프레임을 변경하는 것과는 아무 관련이 없다고 알려줍니다.

 if (   MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50

따라서 이것은 이 High[i]-Low[i]가 어떤 이유로 0이었음을 의미해야 합니다. 차트의 표시기를 보면 표시기가 값 중 일부를 그린 다음 눈금이 하나만 있는 막대에서 멈춘 것을 볼 수 있습니다. high[i] == low[i] 틱이 하나만 있으면 0 나누기가 발생합니다.

이제 high[i]-low[i]가 0이면 사용되지 않는지 확인하십시오.

   int limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 300 ;
//---
   for ( int i= 1 ;i<=limit  ;i++)
   {
     if (High[i] - Low[i] == 0 ) continue ; // --------------- skip this bar
    
     if ( MathAbs (Close[i]-Open[i])/(High[i]-Low[i])< 0.50 ) 
    {boring[i]=Close[i];
   }}
//--- return value of prev_calculated for next call
   return (rates_total);
  }

이제 전문가 탭에서 코드가 더 이상 0으로 나누지 않았지만 이 줄에 범위를 벗어난 배열 오류가 생성되었음을 알려줍니다.

 if (high[i] - low[i] == 0 )  

루프를 테스트하기 위해 모든 계산과 조건을 제거하면 어떻게 될까요?

   int limit=rates_total-prev_calculated;
   if (limit<= 0 ) limit= 300 ;
//---

   for ( int i= 1 ;i<=limit  ;i++)
   { 
    boring[i]=Close[i];
   }
//--- return value of prev_calculated for next call
   return (rates_total);
  }

이제 전문가 탭에서 어레이가 다시 범위를 벗어났다고 보고합니다. 이번에는 다음 줄에 있습니다.

boring[i]=Close[i];

이제 루프에서 price 배열이 사용될 때마다 코드로 인해 배열이 범위를 벗어납니다. 따라서 루프의 문제와 왜 Close[i], Low[i], High[i]가 범위를 벗어났는지 알아내십시오. 표시기가 차트의 끝까지 그리는 것을 볼 수 있으므로 오류는 가장 높은 배열 인덱스의 끝에 있어야 합니다.

   int limit=rates_total-prev_calculated; // what is the value of limit in this calculation when prev_calulated == 0 ?
   if (limit<= 0 ) limit= 300 ;
//---

   for ( int i= 1 ;i<=limit;i++) // how does the value of limit compare with the highest available Close[] array index ?

먼저 올바르게 작동하는 루프를 코딩하는 방법을 배우지 않고 지표를 만들려고 하는 것 같습니다. 이를 수행하는 방법에 대한 많은 예가 있습니다. 포함된 표시기의 코드를 보고 작동 방식을 정확히 이해할 때까지 실험한 다음 계산을 수행하기 전에 올바르게 작동하는 간단한 단일 선을 그리는 표시기를 만들어 보십시오.
 

@scfx

고칠 수 있는 사람은 당신뿐입니다. 또는 https://www.mql5.com/en/job으로 이동합니다.

거기에 작업을 게시합니다.

 
SDC :
...

당신이 옳더라도 그렇게 가혹할 필요는 없습니다. 제발 SDC.
 
angevoyageur :

당신이 옳더라도 그렇게 가혹할 필요는 없습니다. 제발 SDC.

lol 나는 내 게시물을 약간 수정했습니다 ;)

 

죄송합니다. 잘못 안내했습니다. 죄송합니다. 표시기는 다음과 같이 코딩할 수 있습니다.

 int limit = - 1 ;
   if ( prev_calculated == 0 ) limit =  rates_total - 3000 ; // will calculate 3000 Bars
   if ( prev_calculated > 0 )   limit = rates_total-prev_calculated;

 for ( int i= limit; i>=0; i--)
   {
     if (High[i] - Low[i] == 0 ) continue ; // --------------- skip this bar
    

// Please test it, check if it's OK;
// Put the indicator in a backtest EA, say MACDSample, to check it
 

차트에 막대가 3000개 미만이면 여전히 범위를 벗어 납니다.

사유: