Для экономии места и улучшения восприятия - в одной функции. Всё равно не работает.
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_Wint 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_Dfor(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_Wfor(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: Для экономии места и улучшения восприятия - в одной функции. Всё равно не работает.
на будущее - если результат функции (хотя-бы сработала/нет) может понадобиться, то не делайте её void. Беглым взглядом сложно определить что есть критерий "сработки" - оно же void, как ни кинь всё хорошо.
на правах debugger:
у вас куча глобальных переменных Count_XXX, Range_XXX, которые вы перевычисляете ( плюс массивы dSSxx[]), на их основе решаете писать/нет в журнал и потом куда-то передаёте толи по ссылке, то-ли по значению..
очевидно что при повторном вызове что-то не так с их перевычислением - Count_dSS получается 0. Print может помочь разобраться или точки останова и watch.
на будущее - если результат функции (хотя-бы сработала/нет) может понадобиться, то не делайте её void. Беглым взглядом сложно определить что есть критерий "сработки" - оно же void, как ни кинь всё хорошо.
на правах debugger:
у вас куча глобальных переменных Count_XXX, Range_XXX, которые вы перевычисляете ( плюс массивы dSSxx[]), на их основе решаете писать/нет в журнал и потом куда-то передаёте толи по ссылке, то-ли по значению..
очевидно что при повторном вызове что-то не так с их перевычислением - Count_dSS получается 0. Print может помочь разобраться или точки останова и watch.
Какой повторный вызов Вы имеете ввиду? Упрощённый вариант:
double dSSd[][90]; // Динамический Массив SelectSort соответствия пары массива dSe1_Bal_W паре массива dSe1_Bal_Dint 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_Dint 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_Wint 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_Dfor(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_Wfor(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"
Leo59: Какой повторный вызов Вы имеете ввиду? Упрощённый вариант:
имею в виду функцию аналогичную первой (отличающуюся может быт деталями). У вас же такой был вопрос - почему эти функции по отдельности работают, а одна за другой (вне зависимости от очерёдности) нет. Точнее срабатывает и что-то там записывает только первая.
ну так вот - пох@#ено глобальное состояние, то есть при первом-же вызове первой из этих функций изменились или глоб.переменные или содержание массивов. Почему? вам наверное виднее, зачем это менять при записи в файл :-) Честно - прорываться через
Range_dSe1_Bal_W_one
и подобное, мне например тяжело и неохота. Возьмите уже отладчик или поставьте принтов на все подозрительные места. Вам понятна и логика наименований и есть какое-то представление как оно должно работать (не совпавшее правда с реальностью :-) )
PS/ из пояснения что на входе и что на выходе, вижу что вместо двух массивов dSSx[][4] довольно и одного dSS[][3] :-)
имею в виду функцию аналогичную первой (отличающуюся может быт деталями). У вас же такой был вопрос - почему эти функции по отдельности работают, а одна за другой (вне зависимости от очерёдности) нет. Точнее срабатывает и что-то там записывает только первая.
ну так вот - пох@#ено глобальное состояние, то есть при первом-же вызове первой из этих функций изменились или глоб.переменные или содержание массивов. Почему? вам наверное виднее, зачем это менять при записи в файл :-) Честно - прорываться через
и подобное, мне например тяжело и неохота. Возьмите уже отладчик или поставьте принтов на все подозрительные места. Вам понятна и логика наименований и есть какое-то представление как оно должно работать (не совпавшее правда с реальностью :-) )
PS/ из пояснения что на входе и что на выходе, вижу что вместо двух массивов dSSx[][4] довольно и одного dSS[][3] :-)
Максим, спасибо за то, что не остались равнодушным. Вопрос решён. Оказалось, всё дело в нехватке памяти.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
академично - функции не являются чистыми и изменяют глобальное состояние.
кратко - обе функции читают и записывают глобальную переменную или файл.
Да, каждая из них записывает файл. И что?
и не работают совместно :-)
PS. точнее сказать об источнике подземных стуков невозможно без исходников. Где-то там есть ошибка - правьте её
Для экономии места и улучшения восприятия - в одной функции. Всё равно не работает.
на будущее - если результат функции (хотя-бы сработала/нет) может понадобиться, то не делайте её void. Беглым взглядом сложно определить что есть критерий "сработки" - оно же void, как ни кинь всё хорошо.
на правах debugger:
у вас куча глобальных переменных Count_XXX, Range_XXX, которые вы перевычисляете ( плюс массивы dSSxx[]), на их основе решаете писать/нет в журнал и потом куда-то передаёте толи по ссылке, то-ли по значению..
очевидно что при повторном вызове что-то не так с их перевычислением - Count_dSS получается 0. Print может помочь разобраться или точки останова и watch.
на будущее - если результат функции (хотя-бы сработала/нет) может понадобиться, то не делайте её void. Беглым взглядом сложно определить что есть критерий "сработки" - оно же void, как ни кинь всё хорошо.
на правах debugger:
у вас куча глобальных переменных Count_XXX, Range_XXX, которые вы перевычисляете ( плюс массивы dSSxx[]), на их основе решаете писать/нет в журнал и потом куда-то передаёте толи по ссылке, то-ли по значению..
очевидно что при повторном вызове что-то не так с их перевычислением - Count_dSS получается 0. Print может помочь разобраться или точки останова и watch.
Упрощённый вариант:
// Есть два динамических массива А[][2] и B[][2]
// Ищем совпадения по первому измерению индекс "0"
// Массив А Массив В
// 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
Какой повторный вызов Вы имеете ввиду?
Упрощённый вариант:
имею в виду функцию аналогичную первой (отличающуюся может быт деталями). У вас же такой был вопрос - почему эти функции по отдельности работают, а одна за другой (вне зависимости от очерёдности) нет. Точнее срабатывает и что-то там записывает только первая.
ну так вот - пох@#ено глобальное состояние, то есть при первом-же вызове первой из этих функций изменились или глоб.переменные или содержание массивов. Почему? вам наверное виднее, зачем это менять при записи в файл :-) Честно - прорываться через
и подобное, мне например тяжело и неохота. Возьмите уже отладчик или поставьте принтов на все подозрительные места. Вам понятна и логика наименований и есть какое-то представление как оно должно работать (не совпавшее правда с реальностью :-) )
PS/ из пояснения что на входе и что на выходе, вижу что вместо двух массивов dSSx[][4] довольно и одного dSS[][3] :-)
имею в виду функцию аналогичную первой (отличающуюся может быт деталями). У вас же такой был вопрос - почему эти функции по отдельности работают, а одна за другой (вне зависимости от очерёдности) нет. Точнее срабатывает и что-то там записывает только первая.
ну так вот - пох@#ено глобальное состояние, то есть при первом-же вызове первой из этих функций изменились или глоб.переменные или содержание массивов. Почему? вам наверное виднее, зачем это менять при записи в файл :-) Честно - прорываться через
и подобное, мне например тяжело и неохота. Возьмите уже отладчик или поставьте принтов на все подозрительные места. Вам понятна и логика наименований и есть какое-то представление как оно должно работать (не совпавшее правда с реальностью :-) )
PS/ из пояснения что на входе и что на выходе, вижу что вместо двух массивов dSSx[][4] довольно и одного dSS[][3] :-)
Кто может объяснить, почему когда делаю скрин графика через функцию "ChartScreenShot()" , то отсутствуют некоторые графические элементы:
Ну а это сделано руками:
Кто может объяснить, почему когда делаю скрин графика через функцию "ChartScreenShot()" , то отсутствуют некоторые графические элементы:
Ну а это сделано руками: