¿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?
¿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 |//+------------------------------------------------------------------+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());
}
//+------------------------------------------------------------------+
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]=(/*что-то там*/);
}
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()?
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.
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?
Sí, el terminal sólo husmea en las permitidas explícitamente.
Sí, el terminal sólo husmea en los autorizados.
Así que no es el terminal el que está hurgando, es la DLL.
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.
¿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.
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?
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:
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()?
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.