Ich habe es versucht, aber bis die Zecken verschwunden sind, funktioniert nichts.
iask=0
Diese Funktion ist zu schnell.
Um die Leistung zu messen, müssen Sie mehrere Aufrufe in einer Schleife mit einer großen Anzahl von Iterationen durchführen und die Gesamtausführungszeit messen.
Um einen neuen Balken im EA zu überprüfen, habe ich Funktionen verwendet, die auf "CopyTime" und "CopyRates" basieren und die ich in den Foren gefunden habe. Ich bin zu dem Schluss gekommen, dass ihre Berechnung sehr viel Zeit in Anspruch nimmt.
Hier sind die Prüfdaten (interessant ist, dass der Aufruf des Indikators 171 ms dauert):
datetime New_Time[];//буффер для проверки нового бараvoidOnStart()
{
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
staticdatetime t;//записываем старое время ArraySetAsSeries(New_Time,true);//направление индексацииCopyTime(_Symbol,_Period,0,1,New_Time);//копируем время нового бара
t=New_Time[0];
}
uint time=GetTickCount()-start;
Print("New_Time = ",time," ms");
}
Und da kam mir die Idee, dass ich etwas anderes versuchen sollte. Zum Beispiel "TimeCurrent".
Ich habe den folgenden Code zur Optimierung erstellt:
voidOnStart()
{
int t;
int s;
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
MqlDateTime m;
TimeCurrent(m);
t=m.min;
s=m.sec;
}
uint time=GetTickCount()-start;
Print("time = ",time," ms");
}
Haben Sie den folgenden Code für die Optimierung in Expert Advisor:
staticdouble ind1;//записываю значенияstaticdouble ind2;// значенияstaticdouble indsmall;//индикаторовMqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
if (MIN==0 && SEC==0)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}
Ergebnis im Einzellauf ohne Prüfung auf einen neuen Balken, wenn die Indikatorwerte bei jedem Tick empfangen werden: 817,196 ms
Mit Prüfung eines neuen Balkens: 735 904 ms
Der Unterschied ist nicht besonders beeindruckend, es gibt eine gewisse Verbesserung, aber es ist nicht genug.
Ich erhalte den Indikator wie folgt:
int TSIHandle; // хэндл индикатора TSIdouble TSI[]; // динамические массивы для хранения численных значений TSIintOnInit()
{
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
return(0);
}
voidOnDeinit(constint reason)
{
//--- освобождаем хэндлы индикаторовIndicatorRelease(TSIHandle);
ArrayFree(TSI);
}
voidOnTick()
{
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
staticdouble tsismall;
if (MIN==0 && SEC==0)
{
//--- копируем значения индикаторов из индикаторных буферовif(CopyBuffer(TSIHandle,0,0,3,TSI)<0)
{
Alert("Ошибка копирования буферов индикатора Moving Average - номер ошибки:",GetLastError(),"!!");
return;
}
tsismall=TSI[1];
}
}
Ich habe versucht, Code mit Aufrufen von Handles in den Block zu setzen, in dem die Prüfung des neuen Taktes stattfindet, aber es erscheint ein Fehler, wenn ich
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
Ich habe returngibt nichts, kein Fehler, aber EA funktioniert nicht.
Ich nehme an, dass der Hendle-Aufruf, wenn es möglich ist, und im Allgemeinen der gesamte Hauptcode mit Ausnahme der statischen Variable innerhalb des bedingten Operators platziert werden sollte, der auf einen neuen Takt prüft.
Wenn ich mich nicht irre, habe ich irgendwo gelesen, dass auch dann, wenn wir einen Handle aufrufen, aber keinen Indikator in Puffern anfordern, dieser trotzdem berechnet wird.
Kann mir jemand sagen, wie man einen Indikator erstellt, der die Ergebnisse der Formel buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 ausgibt;
rus-lot: Wer kann vorschlagen, wie man einen Indikator erstellt, der die Ergebnisse einer einzigen Formel buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 anzeigt;
Sie müssen einen benutzerdefinierten Indikator schreiben. Um den Prozess zu vereinfachen, nehmen Sie einen der einfachsten Indikatoren -iMa- und schreiben Sie ihn ein wenig um. Hier ist ein weiteres Thema, in dem es um MarketInfo geht. Schreiben Sie den Code, fragen Sie nach, wenn etwas nicht funktioniert.
sgreen: Was ist mit den statischen Variablen passiert? Habe heute den alten Build des Terminals aktualisiert und jetzt gibt es Fehler beim Kompilieren:
unresolved static variable
Die statischen Mitgliederdaten der Klasse müssen nun platziert werden:
//+------------------------------------------------------------------+//| Класс "Анализатор текстов" |//+------------------------------------------------------------------+class СParser
{
public:
staticint s_words;
staticint s_symbols;
//--- конструктор и деструктор
Parser(void);
~Parser(void){};
};
...
//--- инициализация статических членов класса Parser на глобальном уровнеint CParser::s_words=0;int CParser::s_symbols=0;
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Im Skript habe ich dies getan:
Zeit=0
SymbolInfoTick am Montag.
Sie können dies mit diesem Code überprüfen:
Aber Sie brauchen Ticks pro Symbol.
Sie können dies mit diesem Code überprüfen:
Aber Sie brauchen Ticks pro Symbol.
Ja,"SymbolInfoTick", heute keine Prüfung.
Ich habe es versucht, aber es funktioniert nicht, bis die Zecken da sind.
iask=0Ja, SymbolInfoTick, heute keine Prüfung.
Ich habe es versucht, aber bis die Zecken verschwunden sind, funktioniert nichts.
iask=0Diese Funktion ist zu schnell.
Um die Leistung zu messen, müssen Sie mehrere Aufrufe in einer Schleife mit einer großen Anzahl von Iterationen durchführen und die Gesamtausführungszeit messen.
Umso interessanter ist es, dass es einen Beispielcode gibt. Wir warten auf das Ergebnis.
Um einen neuen Balken im EA zu überprüfen, habe ich Funktionen verwendet, die auf "CopyTime" und "CopyRates" basieren und die ich in den Foren gefunden habe. Ich bin zu dem Schluss gekommen, dass ihre Berechnung sehr viel Zeit in Anspruch nimmt.
Hier sind die Prüfdaten (interessant ist, dass der Aufruf des Indikators 171 ms dauert):
Und da kam mir die Idee, dass ich etwas anderes versuchen sollte. Zum Beispiel "TimeCurrent".
Ich habe den folgenden Code zur Optimierung erstellt:
Haben Sie den folgenden Code für die Optimierung in Expert Advisor:
Ergebnis im Einzellauf ohne Prüfung auf einen neuen Balken, wenn die Indikatorwerte bei jedem Tick empfangen werden: 817,196 ms
Mit Prüfung eines neuen Balkens: 735 904 ms
Der Unterschied ist nicht besonders beeindruckend, es gibt eine gewisse Verbesserung, aber es ist nicht genug.
Ich erhalte den Indikator wie folgt:
Ich habe versucht, Code mit Aufrufen von Handles in den Block zu setzen, in dem die Prüfung des neuen Taktes stattfindet, aber es erscheint ein Fehler, wenn ich
Ich habe return gibt nichts, kein Fehler, aber EA funktioniert nicht.
Ich nehme an, dass der Hendle-Aufruf, wenn es möglich ist, und im Allgemeinen der gesamte Hauptcode mit Ausnahme der statischen Variable innerhalb des bedingten Operators platziert werden sollte, der auf einen neuen Takt prüft.
Wenn ich mich nicht irre, habe ich irgendwo gelesen, dass auch dann, wenn wir einen Handle aufrufen, aber keinen Indikator in Puffern anfordern, dieser trotzdem berechnet wird.
Wer kann vorschlagen, wie man einen Indikator erstellt, der die Ergebnisse einer einzigen Formel buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000 anzeigt;
Sie müssen einen benutzerdefinierten Indikator schreiben. Um den Prozess zu vereinfachen, nehmen Sie einen der einfachsten Indikatoren -iMa- und schreiben Sie ihn ein wenig um. Hier ist ein weiteres Thema, in dem es um MarketInfo geht. Schreiben Sie den Code, fragen Sie nach, wenn etwas nicht funktioniert.
Was ist mit den statischen Variablen passiert? Habe heute den alten Build des Terminals aktualisiert und jetzt gibt es Fehler beim Kompilieren:
Die statischen Mitgliederdaten der Klasse müssen nun platziert werden: