prev_hesaplanmış - sayfa 4

 
Alexey Viktorov :

Veya geliştiricilerin dikkatini gösterge arabelleklerini başlatma sorununa çekmek daha iyi olabilir mi? MT4'te neden böyle bir sorun yok? Belki yine tam bir anlayış değil? Sorun şu ki, SOME'da göstergeyi grafikten çıkardıktan sonra arabelleklerin zorunlu başlatılmasıyla bile, tüm arabellekler çöp içermez ve ondan hiçbir şey kaldırılamaz...

Şahsen ben koltuk değneklerine karşı değilim, ancak bu koltuk değnekleri çok zor değilse ve olumlu bir etkisi varsa. Ancak bir dosyaya sonradan okuma ile yazmak, beceriksiz bir koltuk değneğidir.

Bunu nasıl hayal ediyorsunuz: "... göstergeyi tüm arabelleklerde değil, SOME'daki grafikten çıkardıktan sonra ..." ? Bu şekilde, göstergeyi grafikten çıkardıktan sonra gösterge arabelleklerine erişiminiz olur mu?

Sorunu daha ayrıntılı bulmaya çalışalım. Standart bir kümeye ihtiyacımız var: kod + ne yaptık + ne elde ettik ...

 
Karputov Vladimir :

Bunu nasıl hayal ediyorsunuz: "... göstergeyi tüm arabelleklerde değil, SOME'daki grafikten çıkardıktan sonra ..." ? Bu şekilde, göstergeyi grafikten çıkardıktan sonra gösterge arabelleklerine erişiminiz olur mu?

Sorunu daha ayrıntılı bulmaya çalışalım. Standart bir kümeye ihtiyacımız var: kod + ne yaptık + ne elde ettik ...

Tamamen bir tahmin: belki önceki arabellekler tarafından işgal edilen mevcut arabellek erişimi sırasında aynı bellek alanına çarpıyor.

Sohbete fazla dalmadım, beni tekmeleme, Alexey yeniden başlatırken (terminal açık/kapalı) veya yalnızca prev_calculated = 0 (prev_calculated > 0 durumunda) arabelleklerdeki verilerin arabelleklerde kalmasını istiyor mu? önceki)?

 
Karputov Vladimir :

Bunu nasıl hayal ediyorsunuz: "... göstergeyi tüm arabelleklerde değil, SOME'daki grafikten çıkardıktan sonra ..." ? Bu şekilde, göstergeyi grafikten çıkardıktan sonra gösterge arabelleklerine erişiminiz olur mu?

Sorunu daha ayrıntılı bulmaya çalışalım. Standart bir kümeye ihtiyacımız var: kod + ne yaptık + ne elde ettik ...

İşte gösterge kodu

/********************************************************************\
|                                               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);
  }
//+------------------------------------------------------------------+

Biraz sonra bir video yayınlayacağım, o zaman her şey netleşecek. Parmaklarda eskisinden daha erişilebilir açıklayamam.


Umarım videoyu indirip açmayı zorlaştırmazsınız.

Ne yazık ki, bir nedenden dolayı, göstergenin tablodan silinmesi ve eklenmesi gerçeği sabit değildi, ancak yine de göstergenin orada olduğu, sonra gittiği ve tekrar orada olduğu gerçeği var. Bu sadece onu kaldırmak ve geri ayarlamaktır.

Gösterge yeniden yüklendikten sonra veri penceresine dikkat edin. Arabelleklerin zorla başlatılmasından sonra bile, uzay çöpü orada kalır.

Dosyalar:
00.zip  2614 kb
 
Alexey Viktorov :

İşte gösterge kodu

Böyle bir deney yapmak gerekir: sadece bir tabloyu açık bırakın ve üzerine göstergeyi koyun ve kaldırın. Ve terminal ve işletim sistemi hakkında bilgiye ihtiyacınız var (terminalin "Journal" sekmesi).
 
Karputov Vladimir :
Böyle bir deney yapmak gerekir: sadece bir tabloyu açık bırakın ve üzerine göstergeyi koyun ve kaldırın. Ve terminal ve işletim sistemi hakkında bilgiye ihtiyacınız var (terminalin "Journal" sekmesi).

Peki ya bir çizelge? Göstergenin sadece bir grafikte olması yeterli değil mi?


katma:

İşletim sisteminin göstergenin davranışını etkileyebileceğine inanmasam da, yine de sistem ve terminal hakkında bilgiler

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 :
Peki ya bir çizelge? Göstergenin sadece bir grafikte olması yeterli değil mi?
  1. Sorunu daraltmaya çalışıyorum.
  2. bende böyle bir problem yok Benim yapılandırmam:
    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

 

Dachshunds... Durum şekillenmeye başlıyor. Bu kodu ekleyin:

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

       return (rates_total);
     }

   double bal= AccountInfoDouble ( ACCOUNT_BALANCE );
 
Karputov Vladimir :
  1. Sorunu daraltmaya çalışıyorum.
  2. bende böyle bir problem yok Benim yapılandırmam:
    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

Yürütmeye başladım, ancak gösterge bir arabellekte başlatıldığında, neredeyse tüm veba sayılarının geçmişi.

Göstergeyi çıkardıktan ve bir süre sonra tekrar ayarladıktan sonra arabellekler boşalır.

Daha sonra kaldırma ve evrelemeyi tekrarlayacağım.

 

Ön sonuçlar:

1. Göstergelerde, OnInit() içindeki gösterge dizilerinin başlatılmasına güvenemezsiniz:

//+------------------------------------------------------------------+
//| 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. Göstergelerde, tüm diziden veya yalnızca OnCalculate() içindeki değiştirilen öğelerden geçmek gerekir.

 
Karputov Vladimir :

Dachshunds... Durum şekillenmeye başlıyor. Bu kodu ekleyin:

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

       return (rates_total);
     }

   double bal= AccountInfoDouble ( ACCOUNT_BALANCE );

Bu şekilde eklendi

Print ( "prev_calculated = " , prev_calculated);