Подскажите пожалуйста, где этот код работает не правильно? Читает записи рандомно, как хочет, не все находит, а при новом запуске даёт новые результаты.
//+------------------------------------------------------------------+//| ProjectName |//| Copyright 2020, CompanyName |//| http://www.companyname.net |//+------------------------------------------------------------------+inputint RULE1 = 0;
inputint RULE2 = 0;
inputint RULE3 = 0;
inputint RULE4 = 0;
inputbool FastComb = 1;
inputint FileLine= 20000;
inputstring InpFileName="Report.csv";
//+------------------------------------------------------------------+//| Structure Positions |//+------------------------------------------------------------------+struct STRUCT_POSITION
{
ENUM_POSITION_TYPE pos_type; // position typebool waiting_transaction; // waiting transaction, "true" -> it's forbidden to trade, we expect a transactionulong waiting_order_ticket; // waiting order ticket, ticket of the expected orderbool transaction_confirmed; // transaction confirmed, "true" -> transaction confirmed//--- Constructor
STRUCT_POSITION()
{
pos_type = WRONG_VALUE;
waiting_transaction = false;
waiting_order_ticket = 0;
transaction_confirmed = false;
}
};
STRUCT_POSITION SPosition[];
///////////////////////////struct Report
{
long Pass;
double Result;
double Profit;
double Payoff;
double ProfitFactor;
double RecoveryFactor;
double SharpeRatio;
long Custom;
double EquityDD;
long Trades;
long Field1;
long Field2;
long Field3;
long Field4;
long Field5;
long Field6;
long Field7;
long Field8;
long Field9;
};
long ProfitComb[20001][10];
/////////////////////////////+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+intOnInit()
{
if(FastComb)
{
ArrayInitialize(ProfitComb,-1);
ReportListComb();
int FindComb=0;
for(int i=0; i<=FileLine; i++)
{
if(RULE1==ProfitComb[i][1] && RULE2==ProfitComb[i][2] && RULE3==ProfitComb[i][3] && RULE4==ProfitComb[i][4])
{
FindComb=1;
break;
}
}
if(FindComb==0 && RULE1!=0)
return(INIT_PARAMETERS_INCORRECT);
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+void ReportListComb()
{
Report ReportStr[];
ResetLastError();
ArrayResize(ReportStr,FileLine);
string subfolder="Data";
int file_handle=FileOpen(subfolder+"\\Report.csv",FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI|FILE_COMMON,';');
if(file_handle!=INVALID_HANDLE)
{
int i=0;
while(!FileIsEnding(file_handle))
{
i++;
ReportStr[i].Pass=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Result=StringToDouble(FileReadString(file_handle));
ReportStr[i].Profit=FileReadNumber(file_handle);
ReportStr[i].Payoff=FileReadNumber(file_handle);
ReportStr[i].ProfitFactor=FileReadNumber(file_handle);
ReportStr[i].RecoveryFactor=FileReadNumber(file_handle);
ReportStr[i].SharpeRatio=FileReadNumber(file_handle);
ReportStr[i].Custom=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].EquityDD=FileReadNumber(file_handle);
ReportStr[i].Trades=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field1=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field2=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field3=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field4=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field5=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field6=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field7=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field8=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ReportStr[i].Field9=StringToInteger(DoubleToString(FileReadNumber(file_handle),0));
ProfitComb[i][1]=ReportStr[i].Field1;
ProfitComb[i][2]=ReportStr[i].Field2;
ProfitComb[i][3]=ReportStr[i].Field3;
ProfitComb[i][4]=ReportStr[i].Field4;
ProfitComb[i][5]=ReportStr[i].Field5;
ProfitComb[i][6]=ReportStr[i].Field6;
ProfitComb[i][7]=ReportStr[i].Field7;
ProfitComb[i][8]=ReportStr[i].Field8;
ProfitComb[i][9]=ReportStr[i].Field9;
}
FileClose(file_handle);
}
elsePrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
}
//+------------------------------------------------------------------+
Не могу понять что в итоге значит rates_total и prev_calculated.
В документации написано: Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.
Например МА5, среднее от 5 баров, задать чтобы отобразилось на 100 барах. Тогда индикатор сделает расчёт с 104-го по 100-й бар и начнёт отрисовывать линию с 100-го бара. Тогда rates_total=5, или 100, или 104?
Не могу понять что в итоге значит rates_total и prev_calculated.
В документации написано: Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.
Например МА5, среднее от 5 баров, задать чтобы отобразилось на 100 барах. Тогда индикатор сделает расчёт с 104-го по 100-й бар и начнёт отрисовывать линию с 100-го бара. Тогда rates_total=5, или 100, или 104?
rates_total - это количество баров графика, доступных для просчёта. Иными словами - это Bars().
prev_calculated - это сколько баров индикатор просчитал на прошлом вызове OnCalculate(). Необходим для организации экономных просчётов.
Если prev_calculated равен rates_total, то это значит, что ещё ничего не было просчитано, и нужно инициализировать буферы индикатора и выполнить полный расчёт всей истории.
В общем случае, можно использовать такую конструкцию:
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated;
if(limit>1)
{
// Присваиваем limit значение количества доступных баров-1
limit=rates_total-1;
// Вот тут нужно инициализировать все буферы пустыми значениямиArrayInitialize(Buffer0,EMPTY_VALUE);
ArrayInitialize(Buffer1,0);
ArrayInitialize(Buffer2,clrNONE);
// ... и т.д.
}
//--- Экономный просчёт индикатораfor(int i=limit;i>=0;i--)
{
Buffer0[i]=(/*что-то там*/);
}
rates_total - это количество баров графика, доступных для просчёта. Иными словами - это Bars().
prev_calculated - это сколько баров индикатор просчитал на прошлом вызове OnCalculate(). Необходим для организации экономных просчётов.
Если prev_calculated равен rates_total, то это значит, что ещё ничего не было просчитано, и нужно инициализировать буферы индикатора и выполнить полный расчёт всей истории.
В общем случае, можно использовать такую конструкцию:
Почему тогда так и не писать вместо rates_total - Bars() ?
Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет.
Почему тогда так и не писать вместо rates_total - Bars() ?
Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет.
Можете и такую конструкцию использовать. Но зачем? Когда уже есть предопределённые переменные в параметрах обработчика...
Bars() использовать необходимо тогда, когда он действительно нужен - при получении количества доступных баров по другому символу/таймфрейму.
//--- Проверка и расчёт количества просчитываемых баровint limit=rates_total-prev_calculated;
if(limit>1)
{
// Присваиваем limit значение количества доступных баров-1
limit=rates_total-1;
// Вот тут нужно инициализировать все буферы пустыми значениямиArrayInitialize(Buffer0,EMPTY_VALUE);
ArrayInitialize(Buffer1,0);
ArrayInitialize(Buffer2,clrNONE);
// ... и т.д.
}
//--- Экономный просчёт индикатораfor(int i=limit;i>=0;i--)
{
Buffer0[i]=(/*что-то там*/);
}
Я понимаю, что вы хотели помочь человеку, но видимо по ошибке только запутали.
экономичный просчёт в данном случае выглядит немного по другому
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Подскажите пожалуйста, где этот код работает не правильно? Читает записи рандомно, как хочет, не все находит, а при новом запуске даёт новые результаты.
Не могу понять что в итоге значит rates_total и prev_calculated.
В документации написано: Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.
Например МА5, среднее от 5 баров, задать чтобы отобразилось на 100 барах. Тогда индикатор сделает расчёт с 104-го по 100-й бар и начнёт отрисовывать линию с 100-го бара. Тогда rates_total=5, или 100, или 104?
Не могу понять что в итоге значит rates_total и prev_calculated.
В документации написано: Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.
Например МА5, среднее от 5 баров, задать чтобы отобразилось на 100 барах. Тогда индикатор сделает расчёт с 104-го по 100-й бар и начнёт отрисовывать линию с 100-го бара. Тогда rates_total=5, или 100, или 104?
rates_total - это количество баров графика, доступных для просчёта. Иными словами - это Bars().
prev_calculated - это сколько баров индикатор просчитал на прошлом вызове OnCalculate(). Необходим для организации экономных просчётов.
Если prev_calculated равен rates_total, то это значит, что ещё ничего не было просчитано, и нужно инициализировать буферы индикатора и выполнить полный расчёт всей истории.
В общем случае, можно использовать такую конструкцию:
rates_total - это количество баров графика, доступных для просчёта. Иными словами - это Bars().
prev_calculated - это сколько баров индикатор просчитал на прошлом вызове OnCalculate(). Необходим для организации экономных просчётов.
Если prev_calculated равен rates_total, то это значит, что ещё ничего не было просчитано, и нужно инициализировать буферы индикатора и выполнить полный расчёт всей истории.
В общем случае, можно использовать такую конструкцию:
Почему тогда так и не писать вместо rates_total - Bars() ?
Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет.Почему тогда так и не писать вместо rates_total - Bars() ?
Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет.Можете и такую конструкцию использовать. Но зачем? Когда уже есть предопределённые переменные в параметрах обработчика...
Bars() использовать необходимо тогда, когда он действительно нужен - при получении количества доступных баров по другому символу/таймфрейму.
Можете и такую конструкцию использовать. Но зачем? Когда уже есть предопределённые переменные в параметрах обработчика...
Bars() использовать необходимо тогда, когда он действительно нужен - при получении количества доступных баров по другому символу/таймфрейму.
Артём, иногда любой человек устаёт и делает ошибки. Не сочти за критику, но rates_total - Bars() всегда будет ноль…
А вообще, этому персонажу объяснять очень сложно. Жертва ЕГЭ…
Артём, иногда любой человек устаёт и делает ошибки. Не сочти за критику, но rates_total - Bars() всегда будет ноль…
А вообще, этому персонажу объяснять очень сложно. Жертва ЕГЭ…
Да, ты прав. Не думал, что вот так кто-то решит подсчитывать. Краем глаза увидел Bars в рассчёте, и решил, что это вместо rates_total.
Бывает, спасибо.
Я понимаю, что вы хотели помочь человеку, но видимо по ошибке только запутали.
экономичный просчёт в данном случае выглядит немного по другому
Я понимаю, что вы хотели помочь человеку, но видимо по ошибке только запутали.
экономичный просчёт в данном случае выглядит немного по другому
А что, Вы считаете, я написал не так? Обоснуйте, пожалуйста.
Чему равен limit, и откуда цикл будет в моём и Вашем примере.