Was meinen Siedamit ? Meinen Sie, dass man, um eine bestimmte Anzahl von Elementen von einem Array in ein anderes zu kopieren, etwa temp[], die Arraygröße vor dem Kopieren festlegen sollte ArrayResize(temp, new_size); ?????
Nein, ich meinte natürlich, dass die Arraygröße immer bekannt ist oder bekannt sein kann. Und sie kann und sollte bei Indexüberlauf kontrolliert werden.
Natürlich nicht, ich meinte, dass die Array-Größe immer bekannt ist oder bekannt sein kann. Und sie kann und muss auf Indexüberschreitung kontrolliert werden.
Man kann es kontrollieren, aber es ist nicht immer notwendig...
Was ist das Problem? Deklarieren Sie ein Array temp[] und kopieren Sie 30 Elemente hinein und suchen Sie den Index des minimalen/maximalen Wertes. Und wenn am Ende weniger als 30 übrig sind, wird kopiert, wie viele übrig sind. Und in diesem Fall würde ich lieber die while()-Schleife verwenden.
Warum sollte ich die Größe des temp[]-Arrays kontrollieren?
Sie sollten die Größe des Arrays kontrollieren, von dem aus wir nach temp[] kopieren, das bestreite ich nicht... Aber warum muss ich die Größe des Arrays kontrollieren, in dem wir nach dem Maximum\minimum suchen?
Erinnern Sie mich, bitte, wenn es einen Aufruf von Web-Socket-Verbindung von DLL von EA aufgerufen, ist es notwendig, Host-Adresse in Terminal-Einstellungen zu ermöglichen?
Könnten Sie mir bitte sagen, wo dieser Code nicht richtig funktioniert? Er liest die Datensätze nach dem Zufallsprinzip, findet nicht alles und liefert bei einem Neustart neue Ergebnisse.
//+------------------------------------------------------------------+//| 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());
}
//+------------------------------------------------------------------+
Was meinen Siedamit ? Meinen Sie, dass man, um eine bestimmte Anzahl von Elementen von einem Array in ein anderes zu kopieren, etwa temp[], die Arraygröße vor dem Kopieren festlegen sollte ArrayResize(temp, new_size); ?????
Nein, ich meinte natürlich, dass die Arraygröße immer bekannt ist oder bekannt sein kann. Und sie kann und sollte bei Indexüberlauf kontrolliert werden.
Natürlich nicht, ich meinte, dass die Array-Größe immer bekannt ist oder bekannt sein kann. Und sie kann und muss auf Indexüberschreitung kontrolliert werden.
Man kann es kontrollieren, aber es ist nicht immer notwendig...
Kontrolle ist möglich, aber nicht immer notwendig....
Hehe, dann fangen Sie an, nachdem Sie über))))) gegangen sind.
Hier ist ein Blick...
Forum über Trading, automatisierte Handelssysteme und das Testen von Handelsstrategien.
Fragen von Anfängern MQL5 MT5 MetaTrader 5
Alexey Viktorov, 2023.06.27 21:19
Was ist das Problem? Deklarieren Sie ein Array temp[] und kopieren Sie 30 Elemente hinein und suchen Sie den Index des minimalen/maximalen Wertes. Und wenn am Ende weniger als 30 übrig sind, wird kopiert, wie viele übrig sind. Und in diesem Fall würde ich lieber die while()-Schleife verwenden.
Warum sollte ich die Größe des temp[]-Arrays kontrollieren?
Sie sollten die Größe des Arrays kontrollieren, von dem aus wir nach temp[] kopieren, das bestreite ich nicht... Aber warum muss ich die Größe des Arrays kontrollieren, in dem wir nach dem Maximum\minimum suchen?
Ja, das Terminal durchsucht nur die ausdrücklich erlaubten Adressen.
Ja, das Terminal stöbert nur in den zugelassenen Systemen.
Es ist also nicht das Terminal, das herumschnüffelt, sondern die DLL.
Es ist also nicht das Terminal, das sich einmischt, sondern die DLL.
Eine DLL braucht keinen autorisierten Host in mt. Es reicht, die Verwendung einer DLL in mt. zu erlauben, und die DLL selbst kann absolut alles tun.
Könnten Sie mir bitte sagen, wo dieser Code nicht richtig funktioniert? Er liest die Datensätze nach dem Zufallsprinzip, findet nicht alles und liefert bei einem Neustart neue Ergebnisse.