Cosa intendetedire ? Pensate che per copiare un certo numero di elementi da un array a un altro, un certo temp[], si debba impostare la dimensione dell'array prima della copia ArrayResize(temp, new_size); ?????
No, naturalmente, intendevo dire che la dimensione dell'array è sempre nota o può essere nota. E può e deve essere controllata per l'overrun degli indici.
Certo che no, intendevo dire che la dimensione dell'array è sempre nota o può essere nota. E può e deve essere controllata per evitare l'overrun dell'indice.
Qual è il problema? Dichiarare un array temp[] e copiare 30 elementi in esso e cercare l'indice del valore minimo/massimo. E se alla fine ci saranno meno di 30 elementi, copierà quanti ne sono rimasti. In questo caso, preferirei usare il ciclo while().
Perché dovrei controllare la dimensione dell'array temp[]?
Dovreste controllare la dimensione dell'array da cui copiamo a temp[], non lo metto in dubbio... Ma perché devo controllare la dimensione dell'array in cui cerchiamo il massimo e il minimo?
Ricordatemi, per favore, se c'è una chiamata di connessione web socket dalla DLL chiamata da EA, è necessario consentire l'indirizzo host nelle impostazioni del terminale?
Potreste dirmi dove questo codice non funziona correttamente? Legge i record in modo casuale, non trova tutto e fornisce nuovi risultati a un nuovo avvio.
//+------------------------------------------------------------------+//| 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());
}
//+------------------------------------------------------------------+
Cosa intendetedire ? Pensate che per copiare un certo numero di elementi da un array a un altro, un certo temp[], si debba impostare la dimensione dell'array prima della copia ArrayResize(temp, new_size); ?????
No, naturalmente, intendevo dire che la dimensione dell'array è sempre nota o può essere nota. E può e deve essere controllata per l'overrun degli indici.
Certo che no, intendevo dire che la dimensione dell'array è sempre nota o può essere nota. E può e deve essere controllata per evitare l'overrun dell'indice.
Si può controllare, ma non è sempre necessario...
Controllare è possibile, ma non sempre necessario....
Hehe, poi iniziare dopo essere andati oltre)))))
Ecco un'occhiata...
Forum sul trading, sui sistemi di trading automatico e sulla verifica delle strategie di trading.
Domande dei principianti MQL5 MT5 MetaTrader 5
Alexey Viktorov, 2023.06.27 21:19
Qual è il problema? Dichiarare un array temp[] e copiare 30 elementi in esso e cercare l'indice del valore minimo/massimo. E se alla fine ci saranno meno di 30 elementi, copierà quanti ne sono rimasti. In questo caso, preferirei usare il ciclo while().
Perché dovrei controllare la dimensione dell'array temp[]?
Dovreste controllare la dimensione dell'array da cui copiamo a temp[], non lo metto in dubbio... Ma perché devo controllare la dimensione dell'array in cui cerchiamo il massimo e il minimo?
Sì, il terminale cerca solo quelli consentiti in modo esplicito.
Sì, il terminale si occupa solo di quelli autorizzati.
Quindi non è il terminale a frugare, ma la DLL.
Quindi non è il terminale a essere coinvolto, ma la DLL.
Una DLL non ha bisogno di un host autorizzato in mt. è sufficiente consentire l'uso di una DLL in mt. e la DLL stessa può fare assolutamente tutto.
Potreste dirmi dove questo codice non funziona correttamente? Legge i record in modo casuale, non trova tutto e fornisce nuovi risultati a un nuovo avvio.