초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 618

 
Leo59 :
이 문제의 원인이 무엇인지 알려주십시오. :
Fun_1() 및 Fun_2() 함수는 유사합니다.
유사하게, 함수 유형이 없고 리턴이 없습니까?
 
Leo59 :
이 문제의 원인이 무엇인지 알려주십시오. :
Fun_1() 및 Fun_2() 함수는 유사합니다.

학업 - 기능은 순수하지 않으며 글로벌 상태를 변경합니다.

간단히 - 두 함수 모두 전역 변수 또는 파일을 읽고 씁니다 .

 
Maxim Kuznetsov :

학업 - 기능은 순수하지 않으며 글로벌 상태를 변경합니다.

간단히 - 두 함수 모두 전역 변수 또는 파일을 읽고 씁니다 .

예, 각각 파일을 작성합니다. 그래서 무엇?
 
Leo59 :
예, 각각 파일을 작성합니다. 그래서 무엇?

그리고 함께 일하지 마십시오 :-)

추신. 소스 코드 없이 지하 노크의 근원에 대해 더 정확하게 말하는 것은 불가능합니다. 어딘가에 오류가 있습니다 - 수정하십시오

 
하나의 기능으로 공간을 절약하고 인식을 개선합니다. 여전히 작동하지 않습니다.

 void Fun_Select_2()                                                   // dSSd Выбор сочетаний из массивов dSe1_Bal_D и dSe1_Bal_W с Proba>67
   {
     // 1. УДАЛЯЕМ старые файлы
     // 2. ПЕРЕБИРАЕМ в поиске соответствия
     // 3. ПЕЧАТАЕМ найденное в файл

     // 1. УДАЛЯЕМ старые файлы
     if (use_Print_Rep_dSS == 1 )                                         // =0 -> Условие отключено, =1 -> Печатать в log файл Промежуточные отчёты (dSS)
        {
         LogName= "Rep_dSSd " +EN;                                       // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
         // Если файл с таким именем существует, то удаляем его ... 
         ld=log_delete(LogName);                                       // ФЛАГ log файла, удаляемого в директории "logs\\" 
         if (ld== 1 )
               Alert ( "Старый файл dSSd УДАЛЁН" );
         LogName= "Rep_dSSw " +EN;                                       // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
         // Если файл с таким именем существует, то удаляем его ... 
         ld=log_delete(LogName);                                       // ФЛАГ log файла, удаляемого в директории "logs\\" 
         if (ld== 1 )
               Alert ( "Старый файл dSSw УДАЛЁН" );
        }

     // 2. ПЕРЕБИРАЕМ в поиске соответствия
     //    Находим соответствие между [1]-"Num1 А" и [4]-"Num1 B" в массивах dSe1_Bal_D и dSe1_Bal_W
     int t= 0 ;                                                           // Техническая переменная
     int d= 0 ;                                                           // Техническая переменная
     int w= 0 ;                                                           // Техническая переменная
     int D= 0 ;                                                           // Техническая переменная
     int W= 0 ;                                                           // Техническая переменная
     int S= 0 ;                                                           // Техническая переменная

     //    Если есть соответствие тогда записываем её в массив dSSd[][90]
    Count_dSSd= 0 ;                                                     // "Обнуляем" Счётчик записей (строк) в массиве dSSd[][90]
    Range_dSSd_one= 0 ;                                                 // "Обнуляем" Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
    Range_dSSd_two= 0 ;                                                 // "Обнуляем" Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

     for (d= 0 , t= 0 ; d<Range_dSe1_Bal_D_one; d++)
        {
         for (w= 0 ; w<Range_dSe1_Bal_W_one; w++)
             {
               if ( (dSe1_Bal_W[w][ 1 ]==dSe1_Bal_D[d][ 1 ]) && (dSe1_Bal_W[w][ 4 ]==dSe1_Bal_D[d][ 4 ]) )
                  {
                   Count_dSSd++;                                       // Счётчик записей (строк) в массиве dSSd[][90]
                   ArrayResize (dSSd, Count_dSSd, 200000 );             // Задайм новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for (S= 0 ,  D= 0 ;   D< 45 ;   D++, S++)
                        dSSd[t][S] = dSe1_Bal_D[d][D];                 // Значения строки массива dSe1_Bal_D
                   for (S= 45 , W= 0 ;   W< 45 ;   W++, S++)
                        dSSd[t][S] = dSe1_Bal_W[w][W];                 // Значения строки массива dSe1_Bal_W
                   t++;                                               // Увеличили индекс массива dSSd на "1"
                  }
             }
        }
    Range_dSSd_one = ArrayRange (dSSd, 0 );                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
    Range_dSSd_two = ArrayRange (dSSd, 1 );                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

     //    Если есть соответствие тогда записываем её в массив dSSw[][90]
    Count_dSSw= 0 ;                                                     // "Обнуляем" Счётчик записей (строк) в массиве dSSw[][90]
    Range_dSSw_one= 0 ;                                                 // "Обнуляем" Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
    Range_dSSw_two= 0 ;                                                 // "Обнуляем" Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];
     for (d= 0 , t= 0 ; d<Range_dSe1_Bal_D_one; d++)
        {
         for (w= 0 ; w<Range_dSe1_Bal_W_one; w++)
             {
               if ( (dSe1_Bal_W[w][ 1 ]==dSe1_Bal_D[d][ 1 ]) && (dSe1_Bal_W[w][ 4 ]==dSe1_Bal_D[d][ 4 ]) )

                  {
                   Count_dSSw++;                                       // Счётчик записей (строк) в массиве dSSw[][90]
                   ArrayResize (dSSw, Count_dSSw, 200000 );             // Задайм новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for (S= 0 ,  W= 0 ;   W< 45 ;   W++, S++)
                        dSSw[t][S] = dSe1_Bal_W[w][W];                 // Значения строки массива dSe1_Bal_W
                   for (S= 45 , D= 0 ;   D< 45 ;   D++, S++)
                        dSSw[t][S] = dSe1_Bal_D[d][D];                 // Значения строки массива dSe1_Bal_D
                   t++;                                               // Увеличили индекс массива dSSw на "1"
                  }
             }
        }
    Range_dSSw_one = ArrayRange (dSSw, 0 );                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
    Range_dSSw_two = ArrayRange (dSSw, 1 );                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];

     // 3. ПЕЧАТАЕМ найденное в файл
     int LH_Rep= 0 ;                                                     // Хэндл log файла, открытого в директории "logs\\" 
     if (use_Print_Rep_dSS == 1 )                                         // =0 -> Условие отключено, =1 -> Печатать в log файл Промежуточные отчёты (dSS)
        {
         if (Count_dSSd> 0 )
             {
              LogName= "Rep_dSSd " +EN;                                 // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
              LH_Rep=log_open(LogName);                               // Хэндл log файла, открытого в директории "logs\\" 
              Fun_Rep_mass90(LH_Rep, dSSd, Count_dSSd);               // Функция F 135 Запись Массива  mass90[][90] в Промежуточный отчёт в *.csv файл
              log_close(LH_Rep);                                       // Закрываем лог-файл этого эксперта
               Alert ( "Записан ОТЧЁТ " , LogName);
             }
         if (Count_dSSw> 0 )
             {
              LogName= "Rep_dSSw " +EN;                                 // (Interum Report) Название ЛОГА + Название ЭТОГО ЭКСПЕРТА, передаваемое в log файл
              LH_Rep=log_open(LogName);                               // Хэндл log файла, открытого в директории "logs\\" 
              Fun_Rep_mass90(LH_Rep, dSSw, Count_dSSw);               // Функция F 135 Запись Массива  mass90[][90] в Промежуточный отчёт в *.csv файл
              log_close(LH_Rep);                                       // Закрываем лог-файл этого эксперта
               Alert ( "Записан ОТЧЁТ " , LogName);
             }
        }
   }
 
Leo59 :
하나의 기능으로 공간을 절약하고 인식을 개선합니다. 여전히 작동하지 않습니다.

미래를 위해 - 함수의 결과(최소한 작동 여부)가 필요할 수 있는 경우 무효화하지 마십시오. "운동" 기준이 무엇인지 얼핏 보기에는 결정하기 어렵습니다. 모든 것을 어떻게 던지더라도 무효입니다.

디버거로:

재계산(dSSxx[] 배열 포함)하는 전역 변수 Count_XXX, Range_XXX가 있고, 이를 기반으로 로그에 쓸지 여부를 결정한 다음 참조 또는 값으로 어딘가에 전달합니다.

그들이 다시 호출될 때 재계산에 문제가 있음이 분명합니다. Count_dSS는 0으로 판명되었습니다. Print는 그것을 알아내거나 중단점을 보고 관찰하는 데 도움이 될 수 있습니다.

 
Maxim Kuznetsov :

미래를 위해 - 함수의 결과(최소한 작동 여부)가 필요할 수 있는 경우 무효화하지 마십시오. "운동" 기준이 무엇인지 얼핏 보기에는 결정하기 어렵습니다. 모든 것을 어떻게 던지더라도 무효입니다.

디버거로:

재계산(dSSxx[] 배열 포함)하는 전역 변수 Count_XXX, Range_XXX가 있고, 이를 기반으로 로그에 쓸지 여부를 결정한 다음 참조 또는 값으로 어딘가에 전달합니다.

그들이 다시 호출될 때 재계산에 문제가 있음이 분명합니다. Count_dSS는 0으로 판명되었습니다. Print는 그것을 알아내거나 중단점을 보고 관찰하는 데 도움이 될 수 있습니다.

어떤 콜백을 의미합니까?
간소화된 버전:
 double    dSSd[][ 90 ];                   // Динамический Массив SelectSort соответствия пары массива dSe1_Bal_W паре массива dSe1_Bal_D
int       Count_dSSd= 0 ;                 // Счётчик записей (строк) в массиве dSSd[][90]
int       Range_dSSd_one= 0 ;             // = ArrayRange(dSS, 0);  Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
int       Range_dSSd_two= 0 ;             // = ArrayRange(dSS, 1);  Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

double    dSSw[][ 90 ];                   // Динамический Массив SelectSort соответствия пары массива dSe1_Bal_W паре массива dSe1_Bal_D
int       Count_dSSw= 0 ;                 // Счётчик записей (строк) в массиве dSSw[][90]
int       Range_dSSw_one= 0 ;             // = ArrayRange(dSS, 0);  Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
int       Range_dSSw_two= 0 ;             // = ArrayRange(dSS, 1);  Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];

int init()
   {
     ArrayResize (dSSd, 200000 , 200000 );                                 // Задаём новый размер массива с резервированием памяти на 200000 записей (строк)  
     ArrayResize (dSSw, 200000 , 200000 );                                 // Задаём новый размер массива с резервированием памяти на 200000 записей (строк)  
    Fun_Select_2();
     return ( 0 );
   }

void Fun_Select_2()                                                   
   {
     //    Находим соответствие между [1]-"Num1 А" и [4]-"Num1 B" в массивах dSe1_Bal_D и dSe1_Bal_W
     int t= 0 ;                                                           // Техническая переменная
     int d= 0 ;                                                           // Техническая переменная
     int w= 0 ;                                                           // Техническая переменная
     int D= 0 ;                                                           // Техническая переменная
     int W= 0 ;                                                           // Техническая переменная
     int S= 0 ;                                                           // Техническая переменная

     //    Если есть соответствие тогда записываем её в массив dSSd[][90]

     for (d= 0 , t= 0 ; d<Range_dSe1_Bal_D_one; d++)
        {
         for (w= 0 ; w<Range_dSe1_Bal_W_one; w++)
             {
               if ( (dSe1_Bal_W[w][ 1 ]==dSe1_Bal_D[d][ 1 ]) && (dSe1_Bal_W[w][ 4 ]==dSe1_Bal_D[d][ 4 ]) )
                  {
                   Count_dSSd++;                                       // Счётчик записей (строк) в массиве dSSd[][90]
                   ArrayResize (dSSd, Count_dSSd, 200000 );             // Задаём новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for (S= 0 ,  D= 0 ;   D< 45 ;   D++, S++)
                        dSSd[t][S] = dSe1_Bal_D[d][D];                 // Значения строки массива dSe1_Bal_D
                   for (S= 45 , W= 0 ;   W< 45 ;   W++, S++)
                        dSSd[t][S] = dSe1_Bal_W[w][W];                 // Значения строки массива dSe1_Bal_W
                   t++;                                               // Увеличили индекс массива dSSd на "1"
                  }
             }
        }
    Range_dSSd_one = ArrayRange (dSSd, 0 );                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSd[][90];
    Range_dSSd_two = ArrayRange (dSSd, 1 );                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSd[][90];

     //    Если есть соответствие тогда записываем её в массив dSSw[][90]
   for (d= 0 , t= 0 ; d<Range_dSe1_Bal_D_one; d++)
        {
         for (w= 0 ; w<Range_dSe1_Bal_W_one; w++)
             {
               if ( (dSe1_Bal_W[w][ 1 ]==dSe1_Bal_D[d][ 1 ]) && (dSe1_Bal_W[w][ 4 ]==dSe1_Bal_D[d][ 4 ]) )
                  {
                   Count_dSSw++;                                       // Счётчик записей (строк) в массиве dSSw[][90]
                   ArrayResize (dSSw, Count_dSSw, 200000 );             // Задаём новый размер массива с резервированием памяти на 100000 записей (строк)  
                   for (S= 0 ,  W= 0 ;   W< 45 ;   W++, S++)
                        dSSw[t][S] = dSe1_Bal_W[w][W];                 // Значения строки массива dSe1_Bal_W
                   for (S= 45 , D= 0 ;   D< 45 ;   D++, S++)
                        dSSw[t][S] = dSe1_Bal_D[d][D];                 // Значения строки массива dSe1_Bal_D
                   t++;                                               // Увеличили индекс массива dSSw на "1"
                  }
             }
        }
    Range_dSSw_one = ArrayRange (dSSw, 0 );                             // Размер первого измерения (число строк)    с индексом_измерения=[0] массива dSSw[][90];
    Range_dSSw_two = ArrayRange (dSSw, 1 );                             // Размер второго измерения (число столбцов) с индексом_измерения=[1] массива dSSw[][90];
   }

// Получаенный результат:

// Count_dSSd     = 280
// Range_dSSd_one = 280
// Range_dSSd_two = 90
// Массив dSSd заполнен правильными значениями

// Count_dSSw     = 280
// Range_dSSw_one = 0
// Range_dSSw_two = 90
// Массив dSSw заполнен "0"
 
// 작업의 본질은 다음과 같습니다.
// 두 개의 동적 배열 A[][2]와 B[][2]가 있습니다.
// 첫 번째 차원 인덱스 "0"에서 일치 항목을 찾습니다.
// 배열 A 배열 B
// 31 25 19 66
// 44 15 62 30
// 62 47 54 71
// 31 94
// 우리가 얻고자 하는 것은:
// 배열 dSSd[][4] 배열 dSSw[][4]
// 31 25 31 94 31 94 31 25
// 62 47 62 30 62 30 62 47
 
Leo59 :
어떤 콜백 을 의미합니까?
간소화된 버전:

첫 번째 것과 유사한 기능을 의미합니다(세부 사항이 다를 수 있음). 왜 이러한 기능이 별도로 작동하지만 순서에 관계없이 하나씩 작동하지 않는지에 대한 질문이 있습니다. 보다 정확하게는 작동하며 첫 번째 항목만 거기에 무언가를 기록합니다.

글쎄요 - pokh@#eno 전역 상태, 즉 이러한 함수의 첫 번째 호출에서 전역 변수나 배열의 내용이 변경되었습니다. 왜요? 파일에 쓸 때 이것을 변경해야 하는 이유를 더 잘 알고 있을 것입니다 :-) 솔직히 - 돌파구

Range_dSe1_Bal_W_one

예를 들어, 그것은 나에게 어렵고 꺼려합니다. 이미 디버거를 가져오거나 모든 의심스러운 장소에 지문을 찍습니다. 당신은 또한 이름의 논리를 이해하고 그것이 어떻게 작동해야 하는지에 대한 아이디어를 가지고 있습니다(실제로 현실과 일치하지 않습니다 :-))

PS/ 입력에 있는 것과 출력에 있는 것에 대한 설명에서 두 개의 배열 dSSx[][4] 대신 하나의 dSS[][3]이면 충분합니다 :-)

 
Maxim Kuznetsov :

첫 번째 것과 유사한 기능을 의미합니다(세부 사항이 다를 수 있음). 왜 이러한 기능이 별도로 작동하지만 순서에 관계없이 하나씩 작동하지 않는지에 대한 질문이 있습니다. 보다 정확하게는 작동하며 첫 번째 항목만 거기에 무언가를 기록합니다.

글쎄요 - pokh@#eno 전역 상태, 즉 이러한 함수의 첫 번째 호출에서 전역 변수나 배열의 내용이 변경되었습니다. 왜요? 파일에 쓸 때 이것을 변경해야 하는 이유를 더 잘 알고 있을 것입니다 :-) 솔직히 - 돌파구

예를 들어, 그것은 나에게 어렵고 꺼려합니다. 이미 디버거를 가져오거나 모든 의심스러운 장소에 지문을 찍습니다. 당신은 또한 이름의 논리를 이해하고 그것이 어떻게 작동해야 하는지에 대한 아이디어를 가지고 있습니다(실제로 현실과 일치하지 않습니다 :-))

PS/ 입력에 있는 것과 출력에 있는 것에 대한 설명에서 두 개의 배열 dSSx[][4] 대신 하나의 dSS[][3]이면 충분합니다 :-)

Maxim, 무관심하지 않아 주셔서 감사합니다. 문제가 해결되었습니다. 모든 것이 기억력 부족이라는 것이 밝혀졌습니다.
사유: