Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 618

 
Leo59:
Können Sie mir sagen, warum dies der Fall sein könnte? :
Fun_1() und Fun_2() sind ähnlich.
Ähnlich ohne Funktionstyp und ohne Rückgaben?
 
Leo59:
Können Sie mir bitte sagen, was die Ursache dafür sein könnte? :
Fun_1() und Fun_2() sind ähnlich.

akademisch - die Funktionen sind nicht rein und verändern den globalen Zustand.

kurz - beide Funktionen lesen und schreiben eine globale Variable oder Datei.

 
Maxim Kuznetsov:

akademisch - die Funktionen sind nicht rein und verändern den globalen Zustand.

kurz gesagt - beide Funktionen lesen und schreiben eine globale Variable oder Datei.

Ja, sie schreiben jeweils eine Datei. Und?
 
Leo59:
Ja, jeder von ihnen schreibt eine Datei. Und?

und arbeiten nicht zusammen :-)

PS: Es ist unmöglich, die Quelle der unterirdischen Klopfzeichen ohne Quellen genauer zu bestimmen. Irgendwo liegt ein Fehler vor - korrigieren Sie ihn

 
Platz sparen und Wahrnehmung verbessern - in einer Funktion. Es funktioniert immer noch nicht.

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:
Platz sparen und Wahrnehmung verbessern - in einer Funktion. Es funktioniert immer noch nicht.

für die Zukunft - wenn Sie das Ergebnis einer Funktion benötigen (zumindest die funktionierende/nicht funktionierende), machen Sie sie nicht ungültig. Bei oberflächlicher Betrachtung ist es schwer festzustellen, dass es ein Kriterium für "ausgelöst" gibt - es ist nichtig, egal wie man wirft, alles ist gut.

über die Rechte des Debuggers:

Sie haben eine Reihe von globalen Variablen Count_XXX, Range_XXX, die Sie konvertieren (plus dSSxx[] Arrays), verwenden Sie zu entscheiden, ob zu protokollieren oder nicht und dann übergeben Sie irgendwo, entweder durch Verweis oder durch Wert...

Offensichtlich ist etwas mit der Neuberechnung nicht in Ordnung - Count_dSS erhält 0, wenn Sie es erneut aufrufen. Drucken kann helfen, es herauszufinden, oder Haltepunkte und beobachten.

 
Maxim Kuznetsov:

für die Zukunft - wenn Sie das Ergebnis einer Funktion benötigen (ob sie nun funktioniert hat oder nicht), machen Sie sie nicht ungültig. Auf den ersten Blick ist es schwer zu bestimmen, was das Kriterium für "ausgelöst" ist - es ist nichtig, egal wie man es wirft, alles ist gut.

über die Rechte des Debuggers:

Sie haben eine Reihe von globalen Variablen Count_XXX, Range_XXX, die Sie konvertieren (plus Arrays dSSxx[]), basierend auf ihnen Sie entscheiden, ob zu protokollieren oder nicht und dann irgendwo entweder durch Verweis oder durch Wert übergeben...

Offensichtlich ist etwas mit der Neuberechnung nicht in Ordnung - Count_dSS erhält 0, wenn Sie es erneut aufrufen. Drucken kann helfen, es herauszufinden, oder Haltepunkte und beobachten.

Welchen Rückruf meinen Sie?
Eine vereinfachte Version:
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"
 
// Das Problem stellt sich im Wesentlichen wie folgt dar:
// Es gibt zwei dynamische Arrays A[][2] und B[][2]
// Wir suchen nach Übereinstimmungen mit dem ersten Dimensionsindex "0".
// Array A Array B
// 31 25 19 66
// 44 15 62 30
// 62 47 54 71
// 31 94
// Wir wollen bekommen:
// Array dSSd[][4] Array dSSw[][4]
// 31 25 31 94 31 94 31 25
// 62 47 62 30 62 30 62 47
 
Leo59:
Welchen Rückruf haben Sie im Sinn?
Eine vereinfachte Version:

Ich beziehe mich auf eine Funktion, die der ersten ähnlich ist (die im Detail unterschiedlich sein kann). Sie haben die gleiche Frage gestellt - warum funktionieren diese Funktionen getrennt, aber eine nach der anderen (unabhängig von der Reihenfolge) nicht. Genauer gesagt, nur die erste Funktion funktioniert und zeichnet etwas auf.

nun - den globalen Zustand ficken, d.h. der erste Aufruf der ersten dieser Funktionen hat entweder die globalen Variablen oder den Inhalt der Arrays verändert. Warum? Sie sollten es besser wissen, warum sollte es sich beim Schreiben in eine Datei ändern :-) Ehrlich - Durchbruch

Range_dSe1_Bal_W_one

Mir zum Beispiel fällt es schwer und ich zögere. Besorgen Sie sich einen Debugger oder stellen Sie schon jetzt Drucker an allen verdächtigen Stellen auf. Sie verstehen die Logik der Namensgebung und haben eine Vorstellung davon, wie sie funktionieren sollte (was nicht mit der Realität übereinstimmt :-) )

PS/ aus der Erklärung, was in der Eingabe und was draußen ist, sehe ich, dass anstelle von zwei Arrays dSSx[][4] genug ist und ein dSS[][3] :-)

 
Maxim Kuznetsov:

Ich beziehe mich auf eine Funktion, die der ersten ähnlich ist (die im Detail unterschiedlich sein kann). Sie haben die gleiche Frage gestellt - warum funktionieren diese Funktionen getrennt, aber eine nach der anderen (unabhängig von der Reihenfolge) nicht. Genauer gesagt, nur die erste Funktion funktioniert und zeichnet etwas auf.

Also - der globale Zustand ist gefickt, d.h. der erste Aufruf der ersten dieser Funktionen hat entweder globale Variablen oder Inhalte von Arrays verändert. Vielleicht wissen Sie besser, warum sie es beim Schreiben in die Datei ändern sollten :-). Ehrlich - Durchbruch

Mir zum Beispiel fällt es schwer und ich zögere. Besorgen Sie sich einen Debugger oder stellen Sie schon jetzt Drucker an allen verdächtigen Stellen auf. Sie verstehen die Logik der Namensgebung und haben eine Vorstellung davon, wie sie funktionieren sollte (was nicht mit der Realität übereinstimmt :-) )

PS/ aus der Erklärung, was in der Eingabe und was draußen ist, sehe ich, dass anstelle von zwei Arrays dSSx[][4] genug ist und ein dSS[][3] :-)

Maxim, danke, dass Sie nicht gleichgültig sind. Das Problem ist gelöst. Es stellte sich heraus, dass es sich um eine Frage des unzureichenden Speichers handelte.
Grund der Beschwerde: