Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1466

 
Подскажите, чем открыть файл, кроме как ShellExecuteW через импорт длл? Есть ли аналогичная функция в winapi.mqh?
 

Подскажите пожалуйста, где этот код работает не правильно? Читает записи рандомно, как хочет, не все находит, а при новом запуске даёт новые результаты. 

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2020, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
input int                  RULE1  = 0;
input int                  RULE2  = 0;
input int                  RULE3  = 0;
input int                  RULE4  = 0;
input bool                 FastComb  = 1;
input int                  FileLine= 20000;
input string               InpFileName="Report.csv";
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE pos_type;              // position type
   bool              waiting_transaction;    // waiting transaction, "true" -> it's forbidden to trade, we expect a transaction
   ulong             waiting_order_ticket;   // waiting order ticket, ticket of the expected order
   bool              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];
///////////////////////////
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   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);
     }
   else
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
  }
//+------------------------------------------------------------------+
 

Не могу понять что в итоге значит  rates_total и prev_calculated.

В документации написано:  Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.

Например   МА5, среднее от 5 баров, задать чтобы отобразилось на 100 барах. Тогда индикатор сделает расчёт с 104-го по 100-й бар и начнёт отрисовывать линию с 100-го бара. Тогда  rates_total=5, или 100, или 104?

 
Novichokkk #:

Не могу понять что в итоге значит  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]=(/*что-то там*/);
     }
 
Artyom Trishkin #:

rates_total - это количество баров графика, доступных для просчёта. Иными словами - это Bars().

prev_calculated - это сколько баров индикатор просчитал на прошлом вызове OnCalculate(). Необходим для организации экономных просчётов.

Если prev_calculated равен rates_total, то это значит, что ещё ничего не было просчитано, и нужно инициализировать буферы индикатора и выполнить полный расчёт всей истории.

В общем случае, можно использовать такую конструкцию:

Почему тогда так и не писать вместо  rates_total - Bars() ?

int limit=Bars()-prev_calculated;

Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет. 
 
Novichokkk #:

Почему тогда так и не писать вместо  rates_total - Bars() ?

Извините, конечно, за ламерство. Роюсь в документации, несколько книг по МКЛ5. Не все нюансы поясняются. В книгах тоже. Отдельно по языку в книгах понятно. Как конструкции собираюстя-капут, что откуда и для чего... вобщем вникаю. Тьма всяких проверок, перепроверок. Открыл простой машки код, дак там строк столько. А казалось всего-то надо, выгрузить массив (или обратиться к нему), рассчитать для одного значения с такого-то индекса в массиве по такой-то, и пройтись скользящим окном этими расчётами по массиву указав индексами от куда до куда. Да вывести на экран линию. А нет. 

Можете и такую конструкцию использовать. Но зачем? Когда уже есть предопределённые переменные в параметрах обработчика...

Bars() использовать необходимо тогда, когда он действительно нужен - при получении количества доступных баров по другому символу/таймфрейму.

 
Artyom Trishkin #:

Можете и такую конструкцию использовать. Но зачем? Когда уже есть предопределённые переменные в параметрах обработчика...

Bars() использовать необходимо тогда, когда он действительно нужен - при получении количества доступных баров по другому символу/таймфрейму.

Артём, иногда любой человек устаёт и делает ошибки. Не сочти за критику, но rates_total - Bars() всегда будет ноль…

А вообще, этому персонажу объяснять очень сложно. Жертва ЕГЭ…

 
Alexey Viktorov #:

Артём, иногда любой человек устаёт и делает ошибки. Не сочти за критику, но rates_total - Bars() всегда будет ноль…

А вообще, этому персонажу объяснять очень сложно. Жертва ЕГЭ…

Да, ты прав. Не думал, что вот так кто-то решит подсчитывать. Краем глаза увидел Bars в рассчёте, и решил, что это вместо rates_total.

Бывает, спасибо.

 
Artyom Trishkin #:
//--- Проверка и расчёт количества просчитываемых баров
   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]=(/*что-то там*/);
     }

Я понимаю, что вы хотели помочь человеку, но видимо по ошибке только запутали.

экономичный просчёт в данном случае выглядит немного по другому

for(int i=limit;i<rates_total;i++)
 
Aleksandr Slavskii #:

Я понимаю, что вы хотели помочь человеку, но видимо по ошибке только запутали.

экономичный просчёт в данном случае выглядит немного по другому

А что, Вы считаете, я написал не так? Обоснуйте, пожалуйста.

Чему равен limit, и откуда цикл будет в моём и Вашем примере.