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

 

MT4에서 MT5로 표시기 전송

DRAW_HISTOGRAM 두께 치수 문제

"1" 또는 "2"로 설정하면 크기가 변경되지만 "3" 또는 "4" = 크기가 여전히 "2"로 유지됨


MT4에서는 모든 것이 작동하지만 MT5에서는 그러한 문제가 발생하는 이유는 무엇입니까?

 #property indicator_separate_window
#property indicator_plots    4
#property indicator_buffers 4
#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrDodgerBlue
#property indicator_color3 clrLimeGreen
#property indicator_color4 clrFireBrick
#property indicator_width1 3
#property indicator_width2 3
#property indicator_width3 3
#property indicator_width4 3

MT4 결과


MT5의 결과는 "2"의 두께만 표시하지만 설정에서는 "3"입니다.



또한 OnInit() 에서 속성을 설정해도 도움이 되지 않습니다.

PlotIndexSetInteger (0, PLOT_LINE_WIDTH , 3);

 

디버깅 중 치명적인 오류 :

 struct sA
  {
   int                i;
   string             s;
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
public :
   sA                my_array[];
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   cA *ca;
   ca= new cA();
   ArrayResize (ca.my_array, 1 );
   ZeroMemory (ca.my_array);
   ArrayPrint (ca.my_array);
  }

결과:

2020.12.27 17:04:26.966 1 (EURUSD,M1)   Access violation at 0x000001FE5AF10199 read to 0xFFFFFFFFFFFFFFFF in 'D:\Alpari MT5\MQL5\Scripts\Test\1.ex5'
2020.12.27 17:04:26.967 1 (EURUSD,M1)      crash -->  000001FE5AF10199 8B4318            mov        eax, [rbx+0x18]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF1019C 4089442420        mov        [rsp+0x20], eax
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A1 41B910000000      mov        r9d, 0x10
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101A7 49B8B807F15AFE01  mov        r8, 0x1fe5af107b8
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B1 488D17            lea        rdx, [rdi]
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101B4 48B998D45F5FFE01  mov        rcx, 0x1fe5f5fd498
2020.12.27 17:04:26.967 1 (EURUSD,M1)                                  0000
2020.12.27 17:04:26.967 1 (EURUSD,M1)                 000001FE5AF101BE 49FF96A8120000    call       qword near [r14+0x12a8]  ; #11378 (terminal64.exe)
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
2020.12.27 17:04:26.967 1 (EURUSD,M1)   00: 0x000001FE5AF10199
2020.12.27 17:04:26.967 1 (EURUSD,M1)   01: 0x000001FE633F0010
2020.12.27 17:04:26.967 1 (EURUSD,M1)   
현재 최신 베타 버전
Документация по MQL5: Программы MQL5 / Ошибки выполнения
Документация по MQL5: Программы MQL5 / Ошибки выполнения
  • www.mql5.com
Ошибки выполнения - Программы MQL5 - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
표시기 핸들로 주 창이나 하위 창에서 표시 속성을 가져오는 방법을 생각해낸 사람이 있습니까? IndicatorCreate를 사용하여 생성된 임의의 타사 표시기에 대해 이야기하고 있으며 사용자의 요청에 따라 ChartIndicatorAdd 를 사용하여 차트에 추가할 수 있습니다.
 
Stanislav Korotky :
표시기 핸들로 주 창이나 하위 창에서 표시 속성을 가져오는 방법을 생각해낸 사람이 있습니까? IndicatorCreate를 사용하여 생성된 임의의 타사 표시기에 대해 이야기하고 있으며 사용자의 요청에 따라 ChartIndicatorAdd를 사용하여 차트에 추가할 수 있습니다.

아마도 표시기를 OBJ_CHART 로 밀어넣고 표시기가 어디에 있는지 확인할 수 있습니다.

 
Stanislav Korotky :
표시기 핸들로 주 창이나 하위 창에서 표시 속성을 가져오는 방법을 생각해낸 사람이 있습니까? IndicatorCreate를 사용하여 생성된 임의의 타사 표시기에 대해 이야기하고 있으며 사용자의 요청에 따라 ChartIndicatorAdd를 사용하여 차트에 추가할 수 있습니다.

비슷한 일을 했습니다.
여기에서 찾았습니다. 작동 여부는 기억나지 않습니다. 확인하시기 바랍니다.

 bool FindIndicatorByHandle( long handle, string &symbol, ENUM_TIMEFRAMES &timeframe, long &ChartId, int &sub_win, string &Name) {
   long chart_id = ChartFirst ();
   while (chart_id!=- 1 ) {
       int total_sub = ( int ) ChartGetInteger (chart_id, CHART_WINDOWS_TOTAL );
       int total_ind; 
       for ( int i= 0 ; i<total_sub; i++) {
         total_ind = ChartIndicatorsTotal (chart_id,i);
         for ( int j= 0 ; j<total_ind; j++) {
             string name = ChartIndicatorName (chart_id,i,j);
             if ( ChartIndicatorGet (chart_id,i,name)== handle) {
               ChartId=chart_id;
               symbol= ChartSymbol (chart_id);
               timeframe= ChartPeriod (chart_id);
               sub_win=i;
               Name=name;
               return true ;
            }
         }
      }
      chart_id= ChartNext (chart_id);
   }
   return false ;
}
코드로 판단하면 열려 있는 모든 차트에서 핸들로 지표를 찾습니다. 기호, 기간, 차트 ID, 하위 창 및 표시기 이름을 반환합니다.
 
fxsaber :

아마도 표시기를 OBJ_CHART 로 밀어넣고 표시기가 어디에 있는지 확인할 수 있습니다.

사용자가 지정하는 옵션을 만들어야 하는 동안 시도해 보겠습니다.

 
Nikolai Semko :

비슷한 일을 했습니다.
여기에서 찾았습니다. 작동 여부는 기억나지 않습니다. 확인하시기 바랍니다.

코드로 판단하면 열려 있는 모든 차트에서 핸들로 지표를 찾습니다. 기호, 기간, 차트 ID, 하위 창 및 표시기 이름을 반환합니다.

이것은 설명된 문제에 맞지 않습니다. IndicatorCreate에 의해 생성된 표시기는 어떤 창에도 배치되지 않습니다. 내부에 "앉아" 있으며 작업은 핸들로 창에 표시기를 배치하는 것입니다. 이제 MQL5는 ChartIndicatorAdd 함수를 사용하여 표시기 자체의 "속성"에 관계없이(오류 없이!) 기본 창과 하위 창 모두에 임의의 핸들을 추가할 수 있으며, 추가가 아닐 때 결과는 매우 이상해 보입니다. 예정된.

 

지표가 있는 더 큰 매복이 있습니다.

그들 중 일부는 하나의 입력 배열로 단순화된 방식으로 OnCalculate 핸들러를 구현하며, 계산을 위해 가격 유형을 선택할 수 있습니다. 타사 MQL5 프로그램에서 터키가 이러한 유형의 가격을 예상하고 있는지 확인하는 방법은 표시기를 생성할 때 모든 매개변수 다음에 전달되어야 하는 가격입니다. 그렇지 않은 것 같습니다. 그리고 이것이 완료되지 않으면 #property indicator_applied_price 에 따라 지표가 구축되며 외부에서도 액세스할 수 없습니다. 다음은 프로그래밍 방식으로 차트에 예제/AMA를 추가하는 간단한 EA입니다.

 int OnInit ()
{
   const int h = iCustom ( NULL , 0 , "Examples/AMA");
   if (h == INVALID_HANDLE )
  {
     Print (" iCustom failed: ", _LastError );
     return INIT_FAILED ;
  }

   if (! ChartIndicatorAdd ( 0 , 0 , h))
  {
     Print (" ChartIndicatorAdd failed: ", _LastError );
     return INIT_FAILED ;
  }
   ChartRedraw ();
  
   return INIT_SUCCEEDED ;
}

그 후에 차트 타임프레임 을 전환하면 2개의 AMA 표시기를 얻게 됩니다. 하나는 종가(프로그래밍 방식으로 생성)이고 두 번째는 시가(타임프레임 변경 및 #property indicator_applied_price PRICE_OPEN으로 인해 생성됨)입니다. 이 속성이 iCustom에서 선택되지 않은 이유를 분명히 합니다.

 

지표에 대한 주제를 계속하면서 MqlParam 매개변수의 문제를 찾아 우회하는 Expert Advisor를 첨부하겠습니다.

전문가의 임무는 동일한 매개변수를 사용하여 차트에 "Examples/Price_Channel" 표시기가 없는 경우 차트에 추가하는 것입니다.

이를 위해 iCustom/IndicatorCreate를 사용하여 인스턴스를 만들고 IndicatorParameters를 통해 매개변수 배열을 얻은 다음 IndicatorParameters가 차트에 이미 존재하는 지표에 대해 루프에서 폴링됩니다. 매개변수 배열에 일치하는 항목이 없으면 표시기가 차트에 추가되고 일치하는 항목이 있으면 새 핸들이 단순히 소멸됩니다.

문제는 매개변수 평등이 항상 예상대로 작동하지 않는다는 것입니다. 특히 이러한 실패 테스트 사례가 있습니다. 빈 차트에 Expert Advisor를 배치하고 마우스를 클릭하면 지표의 첫 번째 인스턴스가 생성됩니다. 그런 다음 차트의 시간대를 다른 것으로 전환하고(이전 표시기는 그대로 유지) 마우스로 다시 클릭합니다. 이상하게도 표시기의 두 번째 인스턴스가 생성됩니다.

실행 및 로그 분석에서 이는 매개변수의 표시기 이름과 행의 잘못된 부등식으로 인한 것임이 분명합니다. 줄은 260자이지만 터미널 0은 훨씬 더 일찍 위치합니다. 그 후 - 일부 서비스 정보 또는 쓰레기. 따라서 "==" 또는 StringCompare 행의 비교는 이 "쓰레기"를 고려하고 행의 부등식이 밝혀집니다.

문자열을 char 배열 로 변환하면 배열이 정확히 일치합니다. 짧은 배열로 변환하면 쓰레기가 보입니다. 일반적으로 문서에 설명되지 않은 일종의 일관성 없는 동작입니다.

Window N: 1
   0, Price Channel(22), 12
    [type] [integer_value] [double_value]                                                                                                                                                                                                                                                         [string_value]
[0]     14               0          0.000 "Indicators\Examples/Price_Channel"                                                                                                                                                                                                                                   
[1]      7              22          0.000 null                                                                                                                                                                                                                                                                  
ind1: 'Indicators\Examples/Price_Channel
ind2: 'Indicators\Examples/Price_Channel
260 0 / 260 0
Char arrays 34 34
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
 73 110 100 105  99  97 116 111 114 115  92  69 120  97 109 112 108 101 115  47  80 114 105  99 101  95  67 104  97 110 110 101 108   0
Short arrays 260 260
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0     0     0     0     0     0     0     0     0     0
[ 48]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 72]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[ 96]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[120]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0    13  3328 58074    86 13696    54     0     0 35120  3210     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     0     0     0     0 61841 38184 17648 16370     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[240]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[  0]    73   110   100   105    99    97   116   111   114   115    92    69   120    97   109   112   108   101   115    47    80   114   105    99
[ 24]   101    95    67   104    97   110   110   101   108     0   103   110    97   108     0    32    32    77    32    65    32    82    32    75
[ 48]    32    83     0    32    99   111   109   109    97    32   115   101   112    97   114    97   116   101   100    32   108   105   115   116
[ 72]    41     0    32   112   114   111   116   111   116   121   112   101   115    41     0     0   115     0     0     0     0     0     0     0
[ 96]   528     0     0     0     0    45     0     0     3     0     0     0   512     0     0     0  1160    45     0     0  7256 30655     0     0
[120]     0     0     0     0   512     0     0     0     0 65535  2272     0 29648    45     0     0     0     0     0     0     0     0     0     0
[144]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[168]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[192]     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[216]     3     0     0     0 26341 16284     1     0  1308    16     0     0 49814 30635     0     0     0     0     0     0 32016    37     0     0
[240]     2     0     0     0 50336 16481     1     0     2     0     0     0     3     0     0     0 45520    37     0     0
1 0

정확히 버그가 무엇인지 잘 모르겠습니다. MQL에서 문자열을 처리하는 원칙이나 다른 것입니다.

뉘앙스를 알고 있는 사람이 있으면 pliz가 팁을 제공합니다.

파일:
 
Stanislav Korotky :

뉘앙스를 알고 있는 사람이 있으면 pliz가 팁을 제공합니다.

안다고 해도 머리속으로 레이어 전체를 다시 올려야 하는 그런 종류의 기능입니다.

여기서 그는 자신의 존재를 결정했습니다. TF를 전환할 때 작동하는 것 같습니다.

Init_Sync
Init_Sync
  • www.mql5.com
Библиотека делает синхронизированными Init/Deinit индикаторов