오류, 버그, 질문 - 페이지 2465

 
Slava :

테스터 로그와 에이전트 로그를 볼 수 있나요(처음 24개면 충분)?

그렇지. MT5(빌드 2045) 동일한 문제입니다.
그리고 MT5(빌드 2009)는 괜찮습니다.
MT5(빌드 2009)와 비교하여 특히 로컬 에이전트가 실행 중인지 여부를 결정하는 논리(예: 네트워크 에이전트를 결정하는 논리로 이어짐)에서 일부 변경 사항이 있을 수 있습니다.

파일:
 

MT5. 빌드 2055
ChartGetDouble(0,CHART_PRICE_MAX) 및 ChartGetDouble(0, CHART_PRICE_MIN ) 함수는 타임프레임을 변경할 때 잘못 실행됩니다(0 쓰기).
그리고 처음으로 표시기가 시작될 때 올바르게 씁니다. 또한, 월별 TF에서 TF를 추정할 때 항상 0이고 다른 것에서는 초기에 때때로 정규화됩니다.

 #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);
  }

결과:

 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
파일:
 

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));
}   


처음에는 offsetof의 존재를 몰랐기 때문에 놀랐습니다.
그러나 현실은 모든 것을 제자리에 두었습니다.

'offsetof' - 함수가 정의되지 않았습니다.

 
Sergey Dzyublik :

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

처음에는 offsetof의 존재를 몰랐기 때문에 놀랐습니다.
그러나 현실은 모든 것을 제자리에 두었습니다.

'offsetof' - 함수가 정의되지 않았습니다.

그들은 스스로 썼다

 #include <TypeToBytes.mqh>

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

신호 섹션에서 신호를 열면 인포그래픽의 예를 볼 수 있습니다.



일반적으로 인포그래픽의 목적은 최종 사용자에게 분석된 개체의 속성 집합에 대한 장단점을 전달하는 것입니다.
그러나 이 인포그래픽의 본질은 100% 드로다운이 100% 결과로 차트에 표시될 때 명확하지 않습니다.
또한 한 차트의 틀 내에서 동일한 지표가 두 번 사용됩니다. 한 번은 긍정적인 용어로, 두 번째는 부정적인 용어로 사용됩니다("이익 거래" 및 "손실 거래"의 지표).

제안된 변경 사항:
1. "최대 인출", "최대 예금 부하", "손실 거래" 표시에 대한 카운트다운을 입력합니다(값이 낮을수록 차트의 표시기 값이 커짐).
2. 중복 지표 중 하나("이익 거래" 또는 "손실 거래")를 새 지표(예: 매수 대 매도 수량의 평균 편차 등)로 교체합니다.
3. "최대 인출액" 및 "최대 예금 부하"와 같은 특정 지표 의 경우 차트의 유비쿼터스 % 척도를 로그 또는 기타 표시 척도 로 교체하십시오. 목표는 신호의 매력도에 대한 지표의 영향을 높이는 것입니다.

 
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
}


구조체는 깊은 복사를 수행할 수 있지만 ArrayCopy 는 클래스에 복사 생성자가 있는 경우에도 아무 것도 할 수 없고 컴파일 오류가 발생 하는 이유는 무엇입니까?
"평범하지 않아, 공평하지 않아!" ©

 
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 
   );

거의 "동일한" 기능의 차이점:
1. ArrayInsert에 대한 기본 매개변수가 없습니다.
2. 매개 변수 설명에 "표준"이 없습니다.

동일한 매개변수(int, uint)에 대해 서로 다른 데이터 유형 을 사용하는 것은 호환성을 참조하여 이해할 수 있습니다.
 
Sergey Dzyublik :
ArrayInsert에 대한 기본 매개변수가 없습니다.
그는 거기에 필요하지 않습니다.
그러나 함수가 bool을 반환한다는 사실은 추가된 요소의 수를 반환해야 하지만 ...
 
Sergey Dzyublik :


구조체는 깊은 복사를 수행할 수 있지만 ArrayCopy 는 클래스에 복사 생성자가 있는 경우에도 아무 것도 할 수 없고 컴파일 오류가 발생 하는 이유는 무엇입니까?
"평범하지 않아, 공평하지 않아!" ©

가장 완벽한 ArrayCopy를 구현해야 했습니다.
가능성은 없지만 누군가에게 유용할 수 있습니다 ...

 #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
}


결과:

 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
 
좋은 시간입니다.
잔액 보고서에서 마지막 창에서 스왑 및 커미션과 같은 방식으로 이익이 고려되도록 만드는 방법을 알려주실 수 있습니까?
아니면 어떻게 할까요?
그렇지 않으면 이익을 보는 것이 편리하지 않으며 수수료와 스왑을 빼야한다는 것을 이해합니다. 끔찍하게 짜증나!