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

 
Alexey Viktorov #:

Контролировать можно, но не всегда нужно…

Хе, тогда начинать после выхода за пределы)))
 
Valeriy Yastremskiy #:
Хе, тогда начинать после выхода за пределы)))

Вот смотри… 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Alexey Viktorov, 2023.06.27 21:19

А в чём проблема? Объявите массив temp[] и в него копируйте по 30 элементов и в нём ищите индекс минимального\максимального значения. А если в конце будет меньше 30ти, то скопируется сколько осталось. И в этом случае, я лучше-бы использовал цикл while()


Зачем мне контролировать размер массива temp[]?

Размер массива откуда копируем в temp[] контролировать надо, не спорю… А зачем мне размер массива в котором ищем максимум\минимум?

 
Напомните, пожалуйста, если есть вызов веб сокет соединения из DLL, вызываемого экспертом, нужно ли разрешать адрес хоста в настройках терминала?
 
leonerd #:
Напомните, пожалуйста, если есть вызов веб сокет соединения из DLL, вызываемого экспертом, нужно ли разрешать адрес хоста в настройках терминала?

Да, терминал только по разрешенным явно тыркается.

 
Valeriy Yastremskiy #:

Да, терминал только по разрешенным явно тыркается.

дак тут не терминал полезет, а DLL

 
leonerd #:

дак тут не терминал полезет, а DLL

для dll не надо разрешенный хост в мт. в мт достаточно разрешить использование dll. а сама dll может творить абсолютно что угодно

 
Подскажите, чем открыть файл, кроме как 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]=(/*что-то там*/);
     }