prev_calculated - 페이지 4

 
Alexey Viktorov :

아니면 표시기 버퍼 초기화 문제에 대해 개발자의 주의를 끄는 것이 더 나을까요? MT4에는 왜 그런 문제가 없나요? 어쩌면 다시 완전한 이해가 아니겠습니까? 문제는 SOME의 차트에서 표시기를 제거한 후 버퍼를 강제로 초기화하더라도 모든 버퍼에 가비지가 포함되어 있지 않고 아무 것도 제거할 수 없다는 것입니다...

개인적으로 나는 목발을 반대하는 것이 아니라 이 목발이 너무 어렵지 않고 긍정적인 효과가 있는 경우에만 가능합니다. 그러나 후속 읽기와 함께 파일에 쓰는 것은 서투른 버팀목입니다.

"... 모든 버퍼가 아니라 일부 차트에서 지표를 제거한 후 ..."라고 상상하십니까? 차트에서 지표를 제거한 후 지표 버퍼 에 액세스할 수 있는 방법은 다음과 같습니다.

문제를 더 자세히 찾아보도록 하겠습니다. 우리는 표준 세트가 필요합니다: 코드 + 우리가 한 일 + 우리가 얻은 것 ...

 
Karputov Vladimir :

"... 모든 버퍼가 아니라 일부 차트에서 지표를 제거한 후 ..."라고 상상하십니까? 차트에서 지표를 제거한 후 지표 버퍼 에 액세스할 수 있는 방법은 다음과 같습니다.

문제를 더 자세히 찾아보도록 하겠습니다. 우리는 표준 세트가 필요합니다: 코드 + 우리가 한 일 + 우리가 얻은 것 ...

순전히 추측: 아마도 이전 버퍼가 차지했던 현재 버퍼 액세스 중에 동일한 메모리 영역을 치는 것일 수 있습니다.

나는 대화를 많이 탐구하지 않았습니다. 저를 걷어차지 마십시오. Alexey는 다시 시작할 때(터미널 켜기/끄기) 또는 prev_calculated = 0(prev_calculated > 0인 경우)일 때만 버퍼의 데이터가 버퍼에 남아 있기를 원합니까? 전에)?

 
Karputov Vladimir :

"... 모든 버퍼가 아니라 일부 차트에서 지표를 제거한 후 ..."라고 상상하십니까? 차트에서 지표를 제거한 후 지표 버퍼 에 액세스할 수 있는 방법은 다음과 같습니다.

문제를 더 자세히 찾아보도록 하겠습니다. 우리는 표준 세트가 필요합니다: 코드 + 우리가 한 일 + 우리가 얻은 것 ...

다음은 표시기 코드입니다.

/********************************************************************\
|                                               BalansEquityTest.mq5 |
|                                                           Viktorov |
|                                                  v4forex@yandex.ru |
\********************************************************************/

#property copyright "Viktorov"
#property link        "v4forex@yandex.ru"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers    6
#property indicator_plots      3
#property indicator_type1     DRAW_COLOR_LINE
#property indicator_color1     clrGold , clrGreen , clrRed
#property indicator_width1     2
#property indicator_label1     "Balance"
#property indicator_type2     DRAW_HISTOGRAM2
#property indicator_color2     clrCrimson
#property indicator_width2     2
#property indicator_label2     "EquityMin"
#property indicator_type3     DRAW_HISTOGRAM2
#property indicator_color3     clrDarkViolet
#property indicator_width3     2
#property indicator_label3     "EquityMax"

double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];

double maxEquity, minEquity;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 , balance, INDICATOR_DATA );
   SetIndexBuffer ( 1 , clrBalance, INDICATOR_COLOR_INDEX );
   SetIndexBuffer ( 2 , equityMin, INDICATOR_DATA );
   SetIndexBuffer ( 3 , equityMinB, INDICATOR_DATA );
   SetIndexBuffer ( 4 , equityMax, INDICATOR_DATA );
   SetIndexBuffer ( 5 , equityMaxB, INDICATOR_DATA );
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 2 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 3 , PLOT_EMPTY_VALUE , 0.0 );
   PlotIndexSetDouble ( 4 , PLOT_EMPTY_VALUE , 0.0 );
   ArrayInitialize (balance, 0.0 );    // принудительная
   ArrayInitialize (equityMax, 0.0 );  // инициализация
   ArrayInitialize (equityMaxB, 0.0 ); // всех
   ArrayInitialize (equityMin, 0.0 );  // буферов
   ArrayInitialize (equityMinB, 0.0 ); // индикатора
   ArraySetAsSeries (balance, true );    // все
   ArraySetAsSeries (clrBalance, true ); // буферы
   ArraySetAsSeries (equityMax, true );  // индикатора
   ArraySetAsSeries (equityMaxB, true ); // имеют
   ArraySetAsSeries (equityMin, true );  // флаг
   ArraySetAsSeries (equityMinB, true ); // AS_SERIES
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
   IndicatorSetString ( INDICATOR_SHORTNAME , "Show Money" );
//---
   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[])
  {
//---
if (prev_calculated == 0 )
   return (rates_total);

   double bal = AccountInfoDouble ( ACCOUNT_BALANCE );
   double equity = AccountInfoDouble ( ACCOUNT_EQUITY );
   if (rates_total > prev_calculated)
   {
    minEquity = 0 ;
    maxEquity = 0 ;
   }
   minEquity = fmin ((minEquity == 0 ? AccountInfoDouble ( ACCOUNT_BALANCE ) : minEquity), equity);
    maxEquity = fmax (maxEquity, equity);
    balance[ 0 ] = AccountInfoDouble ( ACCOUNT_BALANCE );
    clrBalance[ 0 ] = 0.0 ;
    equityMinB[ 0 ] = balance[ 0 ];
    equityMin[ 0 ] = minEquity;
    equityMaxB[ 0 ] = balance[ 0 ];
    equityMax[ 0 ] = maxEquity;
     if (balance[ 0 ] > balance[ 1 ])
     clrBalance[ 0 ] = 1.0 ;
     if (balance[ 0 ] < balance[ 1 ])
     clrBalance[ 0 ] = 2.0 ;
     Comment ( PositionsTotal ());
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+

조금 후에 비디오를 게시하겠습니다. 그러면 모든 것이 명확해질 것입니다. 손가락에 나는 이전보다 더 접근하기 쉽게 설명할 수 없습니다.


영상 다운로드 및 압축 풀기 어렵지 않으셨으면 합니다.

안타깝게도 어떤 이유에서인지 차트에서 지표를 삭제하고 첨부하는 바로 그 사실은 고정되지 않았지만 여전히 지표가 거기에 있었다가 사라졌다가 다시 있다는 사실이 있습니다. 이것은 단지 제거하고 다시 설정하는 것입니다.

표시등을 다시 설치한 후 데이터 창에 주의하십시오. 버퍼를 강제로 초기화한 후에도 공간 쓰레기가 남아 있습니다.

파일:
00.zip  2614 kb
 
Alexey Viktorov :

다음은 표시기 코드입니다.

그러한 실험을 수행하는 것이 필요합니다. 차트를 하나만 열어두고 지표를 넣고 제거하십시오. 그리고 터미널과 운영 체제에 대한 정보가 필요합니다(터미널의 "저널" 탭).
 
Karputov Vladimir :
그러한 실험을 수행하는 것이 필요합니다. 차트를 하나만 열어두고 지표를 넣고 제거하십시오. 그리고 터미널과 운영 체제에 대한 정보가 필요합니다(터미널의 "저널" 탭).

그리고 하나의 차트는 어떻습니까? 지표가 하나의 차트에만 있다는 사실만으로는 충분하지 않습니까?


추가:

OS가 표시기의 동작에 영향을 줄 수 있다고 믿지는 않지만 그럼에도 불구하고 여기에 시스템 및 터미널에 대한 정보가 있습니다.

2016.10 . 16 20 : 56 : 34.904 Terminal        D:\MetaTrader 5 \MetaTrader 5
2016.10 . 16 20 : 56 : 34.904 Terminal        Windows 7 Home Premium (x64 based PC), IE 11.00 , UAC, AMD FX- 4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+ 03 : 00
2016.10 . 16 20 : 56 : 34.904 Terminal        MetaTrader 5 build 1455 started (MetaQuotes Software Corp.)
 
Alexey Viktorov :
그리고 하나의 차트는 어떻습니까? 지표가 하나의 차트에만 있다는 사실만으로는 충분하지 않습니까?
  1. 문제를 좁히려고 합니다.
  2. 나는 그런 문제가 없습니다. 내 구성:
    2016.10 . 18 19 : 09 : 34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    2016.10 . 18 19 : 09 : 34.266 Terminal        Windows 10 Pro (x64 based PC), IE 11.00 , UAC, Intel Core i3- 3120 M  @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+ 02 : 00
    2016.10 . 18 19 : 09 : 34.266 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\ 038 C9E8FAFF9EA373522ECC6D5159962

 

닥스훈트... 상황이 구체화되기 시작했습니다. 다음 코드를 추가하세요.

  {
//---
   if (prev_calculated== 0 )
     {
       Print ( "prev_calculated==0" );

       return (rates_total);
     }

   double bal= AccountInfoDouble ( ACCOUNT_BALANCE );
 
Karputov Vladimir :
  1. 문제를 좁히려고 합니다.
  2. 나는 그런 문제가 없습니다. 내 구성:
    2016.10 . 18 19 : 09 : 34.239 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
    2016.10 . 18 19 : 09 : 34.266 Terminal        Windows 10 Pro (x64 based PC), IE 11.00 , UAC, Intel Core i3- 3120 M  @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+ 02 : 00
    2016.10 . 18 19 : 09 : 34.266 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\ 038 C9E8FAFF9EA373522ECC6D5159962

실행을 시작했는데 하나의 버퍼에서 표시기가 시작되면 거의 모든 역병의 역사가 숫자입니다.

표시기를 제거하고 잠시 후 다시 설정하면 버퍼가 비어 있습니다.

나중에 제거 및 준비를 반복합니다.

 

예비 결론:

1. 표시기 에서는 OnInit()의 표시기 배열 초기화에 의존할 수 없습니다.

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
...
   ArrayInitialize (balance, 0.0 );     // принудительная
   ArrayInitialize (equityMax, 0.0 );   // инициализация
   ArrayInitialize (equityMaxB, 0.0 ); // всех
   ArrayInitialize (equityMin, 0.0 );   // буферов
   ArrayInitialize (equityMinB, 0.0 ); // индикатора

...
//---
   return ( INIT_SUCCEEDED );
  }

2. 표시기에서는 전체 배열을 살펴보거나 OnCalculate() 에서 변경된 요소만 통과해야 합니다.

 
Karputov Vladimir :

닥스훈트... 상황이 구체화되기 시작했습니다. 다음 코드를 추가하세요.

  {
//---
   if (prev_calculated== 0 )
     {
       Print ( "prev_calculated==0" );

       return (rates_total);
     }

   double bal= AccountInfoDouble ( ACCOUNT_BALANCE );

이렇게 추가됨

Print ( "prev_calculated = " , prev_calculated);