Errori, bug, domande - pagina 2465

 
Slava:

È possibile visualizzare i log del tester e i log dell'agente (i primi 24 sono sufficienti)?

Sì, certo. MT5 (build 2045) stesso problema.
E MT5 (build 2009) - tutto è OK.
Forse ci sono stati alcuni cambiamenti rispetto a MT5 (build 2009), in particolare nella logica di determinare se un agente locale è in esecuzione o meno (per esempio, l'ha portato alla logica di rilevamento degli agenti di rete)...

 

MT5. build 2055.
Le funzioni ChartGetDouble(0,CHART_PRICE_MAX) e ChartGetDouble(0,CHART_PRICE_MIN) vengono eseguite in modo errato (scrive degli zeri) quando si cambia il TF.
E scrive correttamente la prima volta quando si avvia l'indicatore. Poi quando TF viene spostata su TF mensile sempre a zero, su altri a volte all'inizio, poi viene normalizzata.

#property indicator_chart_window
#property indicator_plots   1 
#property indicator_buffers 1

int OnInit()
  {
  Print(EnumToString(_Period) +":  PriceMax="+string(ChartGetDouble(0,CHART_PRICE_MAX))+";  PriceMin="+string(ChartGetDouble(0,CHART_PRICE_MIN)));
   return(INIT_SUCCEEDED);
  }
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   return(rates_total);
  }

risultato:

2019.05.20 02:30:31.689 TestMinMax (NZDUSD,MN1) PERIOD_MN1:  PriceMax=0.8995;  PriceMin=0.3258  // первый раз нормально
2019.05.20 02:30:37.492 TestMinMax (NZDUSD,W1)  PERIOD_W1:  PriceMax=0.8995;  PriceMin=0.3258
2019.05.20 02:30:39.233 TestMinMax (NZDUSD,MN1) PERIOD_MN1:  PriceMax=0.0;  PriceMin=0.0
2019.05.20 02:30:41.838 TestMinMax (NZDUSD,H4)  PERIOD_H4:  PriceMax=0.6986;  PriceMin=0.6352
2019.05.20 02:30:43.237 TestMinMax (NZDUSD,MN1) PERIOD_MN1:  PriceMax=0.0;  PriceMin=0.0
2019.05.20 02:30:51.404 TestMinMax (NZDUSD,M1)  PERIOD_M1:  PriceMax=0.0;  PriceMin=0.0
2019.05.20 02:30:54.108 TestMinMax (NZDUSD,MN1) PERIOD_MN1:  PriceMax=0.0;  PriceMin=0.0
2019.05.20 02:30:57.420 TestMinMax (NZDUSD,M5)  PERIOD_M5:  PriceMax=0.0;  PriceMin=0.0
2019.05.20 02:31:00.537 TestMinMax (NZDUSD,M15) PERIOD_M15:  PriceMax=0.0;  PriceMin=0.0
2019.05.20 02:31:02.512 TestMinMax (NZDUSD,M30) PERIOD_M30:  PriceMax=0.679;  PriceMin=0.6477000000000001
2019.05.20 02:31:03.780 TestMinMax (NZDUSD,M15) PERIOD_M15:  PriceMax=0.6689000000000001;  PriceMin=0.649
2019.05.20 02:31:05.977 TestMinMax (NZDUSD,M5)  PERIOD_M5:  PriceMax=0.6593;  PriceMin=0.6502
2019.05.20 02:31:07.502 TestMinMax (NZDUSD,M1)  PERIOD_M1:  PriceMax=0.6541;  PriceMin=0.6508
2019.05.20 02:31:10.136 TestMinMax (NZDUSD,MN1) PERIOD_MN1:  PriceMax=0.0;  PriceMin=0.0
File:
 

https://www.mql5.com/ru/docs/basis/types/classes

offsetof – это специальная команда, которая непосредственно связана в атрибутом pack. Она позволяет получить смещение члена от начала структуры.

struct Parent{ 
      char              c;    // sizeof(char)=1 
};
     
struct Children pack(2) : Parent{ 
      short             s;   // sizeof(short)=2 
};

void OnStart(){ 
//--- объявим переменную типа Children 
   Children child;   
//--- узнаем смещения от начала структуры  
   Print("offsetof(child.c)=",offsetof(child.c)); 
   Print("offsetof(child.s)=",offsetof(child.s));
}   


All'inizio ero sorpreso, perché non sapevo che l'offsetof esistesse.
Ma la realtà ha messo tutto al suo posto:

'offsetof' - funzione non definita

 
Sergey Dzyublik:

https://www.mql5.com/ru/docs/basis/types/classes

All'inizio ero sorpreso perché non ero a conoscenza dell'esistenza dell'offsetof.
Ma la realtà ha messo tutto al suo posto:

'offsetof' - funzione non definita

Lei stesso ha scritto

#include <TypeToBytes.mqh>

Print("offsetof(child.c)=",_OFFSET(child, c)); 
Print("offsetof(child.s)=",_OFFSET(child, s));
 

Se apri un segnale dalla sezione Segnali, puoi vedere un esempio di infografica:



Normalmente, lo scopo di un'infografica è di trasmettere all'utente finale i pro e i contro di una serie di proprietà dell'oggetto analizzato.
Tuttavia, l'essenza di questa infografica non è chiara, quando un drawdown del 100% viene visualizzato come un risultato del 100% sul grafico.
Anche lo stesso indicatore è usato due volte all'interno dello stesso grafico: una volta in termini positivi e la seconda volta in termini negativi (indicatori di "Profitable Trades" e "Losing Trades").

Modifiche proposte:
1. Introdurre un conto alla rovescia per gli indicatori "Massimo drawdown", "Massimo carico di deposito", "Operazioni perdenti" (più piccolo è il valore - più grande è il valore dell'indicatore sul grafico);
2. Sostituite uno degli indicatori duplicati ("Compravendite redditizie" o "Compravendite perdenti") con un nuovo indicatore (per esempio, la deviazione media della quantità di compravendita, o qualcos'altro);
3. Per certi indicatori, come "Maximum drawdown" e "Maximum deposit load", sostituite l'onnipresente scala % sul grafico con una scala logaritmica o altra scala di visualizzazione. L'obiettivo è quello di aumentare l'impatto dell'indicatore sull'attrattiva del segnale.

 
class A{
   int  data;
};

struct Wrap{
   A arr[];
};
   
   
void OnStart(){  
   Wrap data_1;
   ArrayResize(data_1.arr, 10);
   
   Wrap data_2 = data_1;
   PRINT(ArraySize(data_2.arr));      // result: 10
   
   A arr[];
   PRINT(ArrayCopy(arr, data_1.arr)); //'arr' - structures or classes containing objects are not allowed
}


Perché le strutture possono fare una copia profonda, maArrayCopy, anche quando la classe ha un costruttore di copia, non può fare nulla e dà un errore di compilazione?
"Non è normale, non è giusto!" ©

 
bool  ArrayInsert( 
   void&        dst_array[],          // receiving array 
   const void&  src_array[],          // source array 
   uint         dst_start,            // receiver array index to be inserted 
   uint         src_start=0,          // source array index to be copied 
   uint         count=WHOLE_ARRAY     // number of elements to insert 
   );
int  ArrayCopy( 
   void&        dst_array[],         // destination array 
   const void&  src_array[],         // source array 
   int          dst_start=0,         // index starting from which write into destination array 
   int          src_start=0,         // first index of a source array 
   int          count=WHOLE_ARRAY    // number of elements 
   );

Differenze in funzioni quasi "identiche":
1. nessun parametro predefinito per ArrayInsert.
2. mancanza di una descrizione "standard" dei parametri.

L'uso di diversi tipi di dati per gli stessi parametri (int, uint) può essere compreso, riferendosi alla compatibilità.
 
Sergey Dzyublik:
Nessun parametro predefinito per ArrayInsert.
Non è necessario lì.
Ma il fatto che la funzione restituisca un bool, quando dovrebbe restituire il numero di elementi aggiunti...
 
Sergey Dzyublik:


Perché le strutture possono fare una copia profonda, maArrayCopy, anche quando la classe ha un costruttore di copia, non può fare nulla e dà un errore di compilazione?
"Non è normale, non è giusto!" ©

Ho dovuto implementare io stesso un ArrayCopy completo.
Non credo, ma forse qualcuno può trovarlo utile...

#define  PRINT(x) ; Print(#x, ":", string(x))

template<typename T>
uint  ArrayCopy_bypass( 
   T&            dst_array[],         // destination array 
   const T&      src_array[],         // source array 
   uint          dst_start=0,         // index starting from which write into destination array 
   uint          src_start=0,         // first index of a source array 
   uint          count=WHOLE_ARRAY    // number of elements 
   )
{
   uint src_size = ArraySize(src_array);
   uint dst_size = ArraySize(dst_array);
   bool src_array_is_dynamic = ArrayIsDynamic(src_array);
   bool dst_array_is_dynamic = ArrayIsDynamic(dst_array);
   
   // validate input parameters
   if(src_size <= src_start 
      || ( !dst_array_is_dynamic && (dst_size <= dst_start))){
      return 0;
   }
   
   uint max_allowed_array_size = uchar(INT_MAX);
   uint same_array_check_min_count_limit = 5;
   
   //--- the same array could be passed to dst_array and src_array parameters
   bool same_array_is_used = true;
   bool dst_array_resize_was_applied = false;
   if (src_size != dst_size || src_array_is_dynamic != dst_array_is_dynamic){
      same_array_is_used = false;
   }
   
   //--- normalize copy count based on src_array data
   if(count == uint(WHOLE_ARRAY) || count > src_size - src_start){
      count = src_size - src_start;
   }
   
   //--- normalize copy count based on dst_start data
   uint dst_required_size = dst_start + count;
   if (dst_required_size > max_allowed_array_size){
      return 0;
   }
   
   if(dst_size <= dst_required_size){
      if(dst_array_is_dynamic){
         ArrayResize(dst_array, dst_required_size);
         dst_array_resize_was_applied = true;
         
         dst_size = ArraySize(dst_array);
         src_size = ArraySize(src_array);
         
         if(same_array_is_used && src_size != dst_size){
            same_array_is_used = false;
         }
      }    
      count = dst_size - dst_start;
   }
   
   //--- check copy count
   if(count == 0){
      return 0;
   }
   
   //--- the same array could be passed to dst_array and src_array parameters, let's confirm it
   if(count >= same_array_check_min_count_limit 
         && same_array_is_used 
         && !dst_array_resize_was_applied)
   {
      if(dst_array_is_dynamic && dst_size + 1 <= max_allowed_array_size){
         ArrayResize(dst_array, dst_size + 1);
         dst_array_resize_was_applied = true;
         
         if(ArraySize(src_array) != dst_size + 1){
            same_array_is_used = false;
         }
         ArrayResize(dst_array, dst_size);
      }
   }
   
   //copy arrays
   if(same_array_is_used){
      T src_copy[];
      ArrayResize(src_copy, count);
      
      for(uint i = 0; i < count; i++){
         src_copy[i] = src_array[src_start + i];
      }
      
      for(uint i = 0; i < count; i++){
         dst_array[dst_start + i] = src_copy[i];
      }
   }else{
      for(uint i = 0; i < count; i++){
         dst_array[dst_start + i] = src_array[src_start + i];
      }
   }
   return count;
}
   
   
class A{
   uchar data;
};
   
   
void OnStart(){
   uchar test_data[10] = {0,1,2,3,4,5,6,7,8,9};
   
   PRINT("TEST 1 (Static)");     
   uchar data_1[8]; 
   
   PRINT(ArrayCopy_bypass(data_1, test_data));
   ArrayPrint(data_1);
   
   PRINT(ArrayCopy_bypass(data_1, test_data, 1, 0, 1));
   ArrayPrint(data_1);
   
   PRINT(ArrayCopy_bypass(data_1, test_data, 5));
   ArrayPrint(data_1);
   
   PRINT(ArrayCopy_bypass(data_1, test_data, 30, 8, 5));
   ArrayPrint(data_1);
   
   
   PRINT("TEST 2 (DYNAMIC)");  
   uchar data_2[]; 
   
   PRINT(ArrayCopy_bypass(data_2, test_data));
   ArrayPrint(data_2);
   
   PRINT(ArrayCopy_bypass(data_2, test_data, 1, 0, 1));
   ArrayPrint(data_2);
   
   PRINT(ArrayCopy_bypass(data_2, test_data, 5));
   ArrayPrint(data_2);
   
   PRINT(ArrayCopy_bypass(data_2, test_data, 30, 8, 5));
   ArrayPrint(data_2);
   
   
   A data_a1[10];
   A data_a2[];
   ArrayCopy_bypass(data_a2, data_a1);            //10
   //PRINT(ArrayCopy(data_a2, data_a1));          //'data_a2' - structures or classes containing objects are not allowed
}


Risultato:

2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      TEST 1 (Static):TEST 1 (Static)
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_1,test_data):8
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 1 2 3 4 5 6 7
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_1,test_data,1,0,1):1
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 0 2 3 4 5 6 7
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_1,test_data,5):3
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 0 2 3 4 0 1 2
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_1,test_data,30,8,5):0
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 0 2 3 4 0 1 2
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      TEST 2 (DYNAMIC):TEST 2 (DYNAMIC)
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_2,test_data):10
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 1 2 3 4 5 6 7 8 9
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_2,test_data,1,0,1):1
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 0 2 3 4 5 6 7 8 9
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_2,test_data,5):10
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 0 2 3 4 0 1 2 3 4 5 6 7 8 9
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      ArrayCopy_bypass(data_2,test_data,30,8,5):2
2019.05.21 00:27:59.870 Test_ArrayCopy (EURUSD,H1)      0 0 2 3 4 0 1 2 3 4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 9
 
Buon pomeriggio.
Qualcuno può dirmi come fare in modo che il rapporto di bilancio nell'ultima finestra Profit includa anche swap e commissioni!
O come farlo?
Non è conveniente guardare il profitto e poi ci si rende conto che la commissione e gli swap devono essere sottratti. È terribilmente fastidioso!