Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 618

 
Leo59 :
Lütfen bana buna neyin sebep olabileceğini söyle? :
Fun_1() ve Fun_2() işlevleri benzerdir.
Benzer şekilde, işlev türü olmadan ve dönüş olmadan?
 
Leo59 :
Lütfen bana buna neyin sebep olabileceğini söyle? :
Fun_1() ve Fun_2() işlevleri benzerdir.

akademik - işlevler saf değildir ve küresel durumu değiştirir.

kısaca - her iki işlev de genel bir değişken veya dosyaya okur ve yazar .

 
Maxim Kuznetsov :

akademik - işlevler saf değildir ve küresel durumu değiştirir.

kısaca - her iki işlev de genel bir değişken veya dosyaya okur ve yazar .

Evet, her biri bir dosya yazar. Ne olmuş?
 
Leo59 :
Evet, her biri bir dosya yazar. Ne olmuş?

ve birlikte çalışmayın :-)

not. kaynak kodları olmadan yeraltı darbelerinin kaynağı hakkında daha kesin bir şey söylemek mümkün değildir. Bir yerde bir hata var - düzeltin

 
Yerden tasarruf etmek ve algıyı iyileştirmek için - tek bir işlevde. Hala çalışmıyor.

 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 :
Yerden tasarruf etmek ve algıyı iyileştirmek için - tek bir işlevde. Hala çalışmıyor.

gelecek için - işlevin sonucuna (en azından çalışılmış / çalışılmamış) ihtiyaç duyulabilirse, onu geçersiz kılmayın. "Antrenman" kriterinin ne olduğunu üstünkörü bir bakışla belirlemek zordur - aynı zamanda geçersizdir, nasıl atarsanız atın her şey yolundadır.

hata ayıklayıcı olarak:

yeniden hesapladığınız (artı dSSxx[] dizileri), günlüğe yazıp yazmamaya karar verdiğiniz ve ardından referansa veya değere göre bir yere ilettiğiniz Count_XXX, Range_XXX bir sürü global değişkeniniz var.

Tekrar çağrıldıklarında, yeniden hesaplamalarında bir sorun olduğu açıktır - Count_dSS 0 çıkıyor. Print, anlamaya veya kesme noktalarına ve izlemeye yardımcı olabilir.

 
Maxim Kuznetsov :

gelecek için - işlevin sonucuna (en azından çalışılmış / çalışılmamış) ihtiyaç duyulabilirse, onu geçersiz kılmayın. "Antrenman" kriterinin ne olduğunu üstünkörü bir bakışla belirlemek zordur - aynı zamanda geçersizdir, nasıl atarsanız atın her şey yolundadır.

hata ayıklayıcı olarak:

yeniden hesapladığınız (artı dSSxx[] dizileri), günlüğe yazıp yazmamaya karar verdiğiniz ve ardından referansa veya değere göre bir yere ilettiğiniz Count_XXX, Range_XXX bir sürü global değişkeniniz var.

Tekrar çağrıldıklarında, yeniden hesaplamalarında bir sorun olduğu açıktır - Count_dSS 0 çıkıyor. Print, anlamaya veya kesme noktalarına ve izlemeye yardımcı olabilir.

Geri arama ne demek?
Basitleştirilmiş sürüm:
 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"
 
// Görevin özü aşağıdaki gibidir:
// A[2] ve B[][2] dinamik dizileri var
// "0" ilk boyut dizinindeki eşleşmeleri arayın
// Dizi A Dizi B
// 31 25 19 66
// 44 15 62 30
// 62 47 54 71
// 31 94
// Şunu elde etmek istiyoruz:
// Dizi dSSd[][4] Dizi dSSw[][4]
// 31 25 31 94 31 94 31 25
// 62 47 62 30 62 30 62 47
 
Leo59 :
Geri arama ne demek?
Basitleştirilmiş sürüm:

Birincisine benzer bir işlevi kastediyorum (ayrıntılarda farklılık gösterebilir). Böyle bir sorunuz vardı - neden bu işlevler ayrı ayrı çalışıyor, ancak birbiri ardına (sıradan bağımsız olarak) çalışmıyor. Daha doğrusu çalışır ve yalnızca ilki orada bir şeyler kaydeder.

iyi falan - pokh@#eno global bir durum, yani bu fonksiyonların ilkinin ilk çağrısında ya global değişkenler ya da dizilerin içerikleri değişti. Niye ya? bir dosyaya yazarken bunu neden değiştirmeniz gerektiğini muhtemelen daha iyi biliyorsunuzdur :-) Dürüst olmak gerekirse - ara verin

Range_dSe1_Bal_W_one

ve benzeri, örneğin, benim için zor ve isteksiz. Zaten bir hata ayıklayıcı alın veya tüm şüpheli yerlere parmak izi koyun. Ayrıca isimlerin mantığını anlıyorsunuz ve nasıl çalışması gerektiğine dair bir fikriniz var (ki bu gerçekle pek örtüşmüyordu :-))

PS/ girişte ve çıkışta ne olduğunun açıklamasından, iki dizi dSSx[][4] yerine bir dSS[][3] yeterli olduğunu görüyorum :-)

 
Maxim Kuznetsov :

Birincisine benzer bir işlevi kastediyorum (ayrıntılarda farklılık gösterebilir). Böyle bir sorunuz vardı - neden bu işlevler ayrı ayrı çalışıyor, ancak birbiri ardına (sıradan bağımsız olarak) çalışmıyor. Daha doğrusu çalışır ve yalnızca ilki orada bir şeyler kaydeder.

iyi falan - pokh@#eno global bir durum, yani bu fonksiyonların ilkinin ilk çağrısında ya global değişkenler ya da dizilerin içerikleri değişti. Niye ya? bir dosyaya yazarken bunu neden değiştirmeniz gerektiğini muhtemelen daha iyi biliyorsunuzdur :-) Dürüst olmak gerekirse - ara verin

ve benzeri, örneğin, benim için zor ve isteksiz. Zaten bir hata ayıklayıcı alın veya tüm şüpheli yerlere parmak izi koyun. Ayrıca isimlerin mantığını anlıyorsunuz ve nasıl çalışması gerektiğine dair bir fikriniz var (ki bu gerçekle pek örtüşmüyordu :-))

PS/ girişte ve çıkışta ne olduğunun açıklamasından, iki dizi dSSx[][4] yerine bir dSS[][3] yeterli olduğunu görüyorum :-)

Maxim, kayıtsız kalmadığın için teşekkürler. Sorun çözüldü. Her şeyin bir hafıza eksikliği olduğu ortaya çıktı.