Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1467

 
Valeriy Yastremskiy #:
Hehe, a continuación, iniciar después de ir más allá)))))

Aquí hay una mirada...

Foro sobre el comercio, los sistemas automatizados de comercio y probar estrategias de negociación.

Preguntas de los principiantes MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2023.06.27 21:19

¿Cuál es el problema? Declare un array temp[] y copie 30 elementos en él y busque el índice del valor mínimo/máximo. Y si al final habrá menos de 30, copiará cuantos quedan. Y en este caso, prefiero usar el bucle while().


¿Por qué debo controlar el tamaño del array temp[]?

Debería controlar el tamaño del array desde donde copiamos a temp[], no lo discuto... Pero ¿por qué necesito controlar el tamaño del array donde buscamos el máximo/mínimo?

 
Recuérdame, por favor, si hay una llamada de conexión de socket web desde DLL llamada por EA, ¿es necesario permitir la dirección de host en la configuración del terminal?
 
leonerd configuración del terminal?

Sí, el terminal sólo husmea en las permitidas explícitamente.

 
Valeriy Yastremskiy #:

Sí, el terminal sólo husmea en los autorizados.

Así que no es el terminal el que está hurgando, es la DLL.

 
leonerd #:

Así que no es el terminal el que va a intervenir, sino la DLL.

Una dll no necesita un host autorizado en mt. basta con permitir el uso de una dll en mt. y la propia dll puede hacer absolutamente cualquier cosa.

 
¿Puedes decirme cómo abrir un archivo, excepto ShellExecuteW a través de la importación de dll? ¿Existe una función similar en winapi.mqh?
 

¿Podríais decirme dónde no funciona correctamente este código? Lee los registros aleatoriamente como quiere, no encuentra todo y da nuevos resultados en un nuevo inicio.

//+------------------------------------------------------------------+
//|                                                      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());
  }
//+------------------------------------------------------------------+
 

Al final no entiendo qué significan rates_total y prev_calculated.

La documentación dice: El primer parámetro rates_total contiene el número de barras de que dispone el indicador para el cálculo, y corresponde al número de barras disponibles en el gráfico.

Por ejemplo MA5, media de 5 barras, configurado para mostrar 100 barras. Entonces el indicador calculará desde la barra 104 hasta la 100 y empezará a dibujar la línea a partir de la barra 100. ¿Entonces rates_total=5, o 100, o 104?

 
Novichokkk número de barras de que dispone el indicador para el cálculo y corresponde al número de barras disponibles en el gráfico.

Por ejemplo MA5, media de 5 barras, configurado para mostrar 100 barras. Entonces el indicador calculará desde la barra 104 a la 100 y empezará a dibujar la línea a partir de la barra 100. ¿Entonces rates_total=5, o 100, o 104?

rates_total es el número de barras del gráfico disponibles para el cálculo. En otras palabras, es Bars().

prev_calculated es cuántas barras ha calculado el indicador en la anterior llamada a OnCalculate(). Es necesario para organizar los cálculos económicos.

Si prev_calculated es igual a rates_total, significa que aún no se ha calculado nada, y es necesario inicializar los buffers del indicador y realizar un cálculo completo de todo el histórico.

En general, podemos utilizar la siguiente construcción:

//--- Проверка и расчёт количества просчитываемых баров
   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 es el número de barras del gráfico disponibles para el cálculo. En otras palabras, es Bars().

prev_calculated es cuántas barras ha calculado el indicador en la anterior llamada OnCalculate(). Es necesario organizar los cálculos económicos.

Si prev_calculated es igual a rates_total, significa que todavía no se ha calculado nada, y es necesario inicializar los buffers del indicador y realizar un cálculo completo de todo el histórico.

En general, podemos utilizar la siguiente construcción:

¿Por qué no escribir en lugar de rates_total - Bars()?

int limit=Bars()-prev_calculated;

Lo siento, por supuesto, por ser un cojo. Estoy cavando a través de la documentación, varios libros sobre MKL5. No se explican todos los matices. Tampoco en los libros. Por separado sobre el lenguaje en los libros es clara. Cómo se ensamblan las construcciones-caput, qué de dónde y para qué.... Me estoy poniendo a ello. Un montón de comprobaciones y dobles comprobaciones. Abrí un código mashki simple, y hay tantas líneas. Y parecía que lo único que hay que hacer es descargar un array (o acceder a él), calcular para un valor desde tal índice del array hasta tal otro, y pasar por una ventana deslizante con estos cálculos sobre el array indicando por índices desde dónde hasta dónde. Sí para mostrar la línea en la pantalla. No.