Ich habe es an einigen Blinkern ausprobiert. Beide haben gut funktioniert, jetzt nicht mehr.
2) es gibt oft Probleme beim Versuch, einen Testlauf mit Verbindung zu den Kernen durchzuführen (funktioniert beim n-ten Durchlauf). siehe Bild.
TheXpert: Eine Gruppe von Telepathen befasst sich bereits mit Ihrem Problem.
Man muss kein Telepath sein, um zu verstehen, dass iCustom() nicht so funktioniert, wie es sollte.
um es zu testen, können Sie den Code des Expert Advisors ausführen: double buffer[]; ResetLastError(); int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA); //int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN); Print("MA_handle = ", MA_handle, " error = ", GetLastError()); int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer); if (copy == -1) Print("Failed to get Custom Moving Average indicator"); sonst for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
und die Meldung "Failed to get Custom Moving Average indicator values" wird angezeigt.
D.h. CopyBuffer gibt einen Fehler (-1) für den iCustom()-Indikator-Handle zurück. Wenn wir den Standard-iMA()-Indikator nehmen, funktioniert derselbe Code!
Urain: Sehen Sie sich die Indizierungsrichtung des resultierenden Arrays an, vielleicht muss es erweitert werden.
Mit der Indizierungsrichtung ist alles in Ordnung, und in früheren Builds funktionierte dies auch. In 448 und 450 funktionierte es nicht. Ich habe schon oft vorgeschlagen, dass die Entwickler die Hauptfunktionen des Terminals gründlicher testen sollten, aber von Build zu Build erhalten sie unterschiedliche kritische Fehler anstelle von kritischen Fehlern. D.h. eine Sache ist behoben und eine andere Sache, die normalerweise funktionierte, geht kaputt und es ist kein Ende in Sicht. Ich schätze, ich werde nie eine stabile Version kommen sehen (((
Der Schlupf vor dem Kopieren von Daten, dauert es Zeit, um den Indikator zu berechnen, so dass, obwohl der Griff korrekt zurückkehrt, die Daten noch nicht berechnet worden,
Im Allgemeinen wird empfohlen, Indikatoren in der Inite aufzurufen und Daten bereits in OnTick() oder anderen speziellen Funktionen abzufragen.
double buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);Print("MA_handle = ", MA_handle, " error = ", GetLastError());
Sleep(100);
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Неудачная попытка получить значения индикатора Custom Moving Average");
elsefor (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i]);
wieder, Sie kopieren 5 Daten von Null bar, aber in der copybuffer Null bar ist irgendwo um 1970 (hängt von max bar Einstellungen), das ist, warum ich sagte Blick auf die Array-Indizierung.
Der Schlupf vor dem Kopieren von Daten, dauert es Zeit, um den Indikator zu berechnen, so dass, obwohl der Handle korrekt zurückkehrt, die Daten noch nicht berechnet worden sind.
Sleep(1000); // 1 Sekunde nach dem Aufruf von iCustom() hat geholfen, ABER. Soll ich die Verzögerungszeit jetzt ablesen? Woher soll ich wissen, wie lange der Berechnungsprozess dauern wird? es ist falsch, den korrekten Indikatorgriff zu geben, der auf Müll zeigt! und es muss vorher richtig funktioniert haben, weil es kein solches Problem gab.
Urain:
Im Allgemeinen wird empfohlen, die Indikatoren in der Initis aufzurufen und die Daten bereits in OnTick() oder anderen speziellen Funktionen abzufragen.
Das ist ein guter Tipp für mich, danke ), denn wenn ich es so gemacht hätte, hätte ich das Problem nicht gesehen...
Wieder sind Sie kopieren 5 Daten von null bar, aber in copyBuffer null bar ist irgendwo um 1970 (hängt von max bar Einstellungen), das ist, warum ich sagte, schauen Sie sich die Indizierung des Arrays.
Soweit ich aus der Hilfedokumentation verstehe, ist in CopyBuffer() der Nullbalken tatsächlich "Gegenwart", und schon beim Kopieren wird das Array erweitert.
Sleep(1000); // 1 Sek. nach Aufruf von iCustom() hat geholfen, ABER... Was soll ich jetzt mit der Verzögerungszeit anfangen? Woher soll ich wissen, wie lange der Berechnungsprozess dauern wird? Es ist falsch, den richtigen Blinker zu setzen, der auf den Müll hinweist! Und es muss vorher richtig funktioniert haben, denn es gab kein solches Problem.
Sie brauchen die Verzögerungszeit für die Funktion Sleep() nicht anzupassen, wenn Sie den iCustom-Aufruf und den Zugriff auf die Werte dieses Indikators durch die Zeit teilen. Darüber hinaus gibt es die Funktion BarsCalculated()
Ich weiß nicht, ob dies ein Fehler ist, aber ich denke, es gibt Fehler im Code der Bibliotheken für alle Arten von Muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) für den Master, sieheCSignalTEMA::ShortCondition()
//| "Voting" that price will grow. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will grow. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::LongCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)<0.0)
{
//--- the close price is below the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)>0.0 && DiffMA(idx)>0.0)
{
//--- the open price is above the indicator (i.e. there was an intersection), but the indicator is directed upwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is above the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)>0.0)
{
//--- the indicator is directed upwardsif(DiffOpenMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is above the indicatorif(DiffLowMA(idx)<0.0)
{
//--- the low price is below the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
//+------------------------------------------------------------------+//| "Voting" that price will fall. |//| INPUT: no. |//| OUTPUT: number of "votes" that price will fall. |//| REMARK: no. |//+------------------------------------------------------------------+int CSignalTEMA::ShortCondition()
{
int result=0;
int idx =StartIndex();
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
//--- the close price is above the indicatorif(IS_PATTERN_USAGE(1) && DiffOpenMA(idx)<0.0 && DiffMA(idx)<0.0)
{
//--- the open price is below the indicator (i.e. there was an intersection), but the indicator is directed downwards
result=m_pattern_1;
//--- consider that this is an unformed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is usedif(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)<0.0)---------------------------------------->ДОЛЖЕН БЫТЬ ЗНАК "БОЛЬШЕ"!!!
{
//--- the open price is above the indicator (i.e. there was an intersection)
result=m_pattern_2;
//--- suggest to enter the market at the "roll back"
m_base_price=m_symbol.NormalizePrice(MA(idx));
}
else
{
//--- the open price is below the indicatorif(DiffHighMA(idx)>0.0)
{
//--- the high price is above the indicator
result=m_pattern_2;
//--- consider that this is a formed "piercing" and suggest to enter the market at the current price
m_base_price=0.0;
}
}
}
}
//--- return the resultreturn(result);
}
Auch in der SignalMA-Bibliothek in
int CSignalMA::ShortCondition()
{
.......
//--- analyze positional relationship of the close price and the indicator at the first analyzed barif(DiffCloseMA(idx)>0.0)
{
.......
}
else
{
//--- the close price is below the indicator (the indicator has no objections to buying)if(IS_PATTERN_USAGE(0))
result=m_pattern_0;
//--- if the model 2 is used
То что ниже не корректно:
if(DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(IS_PATTERN_USAGE(2) && DiffOpenMA(idx)<0.0)
{
.....
}
Последние 2 условия должны выглядеть так:
if(IS_PATTERN_USAGE(2) && DiffMA(idx)<0.0)
{
//--- the indicator is directed downwardsif(DiffOpenMA(idx)>0.0)
{
.....
}
Ich weiß nicht, ob dies ein Fehler ist, aber ich denke, es gibt Fehler im Code der Bibliotheken für alle Arten von Muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) für den Master, siehe CSignalTEMA::ShortCondition()
Auch in der SignalMA-Bibliothek in
Ich danke Ihnen vielmals. Wird korrigiert. (Verdammter Kopierschutz)
Welcher ist es?
Ich habe es an einigen Blinkern ausprobiert. Beide haben gut funktioniert, jetzt nicht mehr.
2) es gibt oft Probleme beim Versuch, einen Testlauf mit Verbindung zu den Kernen durchzuführen (funktioniert beim n-ten Durchlauf). siehe Bild.
Eine Gruppe von Telepathen befasst sich bereits mit Ihrem Problem.
Man muss kein Telepath sein, um zu verstehen, dass iCustom() nicht so funktioniert, wie es sollte.
um es zu testen, können Sie den Code des Expert Advisors ausführen:
double buffer[];
ResetLastError();
int MA_handle = iCustom(NULL, 0, "Examples\\Custom Moving Average", 21, 0, MODE_SMMA);
//int MA_handle = iMA(NULL, 0, 21, 0, MODE_SMMA, PRICE_MEDIAN);
Print("MA_handle = ", MA_handle, " error = ", GetLastError());
int copy = CopyBuffer(MA_handle, 0, 0, 5, buffer);
if (copy == -1) Print("Failed to get Custom Moving Average indicator");
sonst
for (int i = 0; i < 5; i++) Print("buffer[", i, "] = ", buffer[i];
und die Meldung "Failed to get Custom Moving Average indicator values" wird angezeigt.
D.h. CopyBuffer gibt einen Fehler (-1) für den iCustom()-Indikator-Handle zurück. Wenn wir den Standard-iMA()-Indikator nehmen, funktioniert derselbe Code!
Sehen Sie sich die Indizierungsrichtung des resultierenden Arrays an, vielleicht muss es erweitert werden.
Mit der Indizierungsrichtung ist alles in Ordnung, und in früheren Builds funktionierte dies auch. In 448 und 450 funktionierte es nicht.
Ich habe schon oft vorgeschlagen, dass die Entwickler die Hauptfunktionen des Terminals gründlicher testen sollten,
aber von Build zu Build erhalten sie unterschiedliche kritische Fehler anstelle von kritischen Fehlern.
D.h. eine Sache ist behoben und eine andere Sache, die normalerweise funktionierte, geht kaputt und es ist kein Ende in Sicht. Ich schätze, ich werde nie eine stabile Version kommen sehen (((
Der Schlupf vor dem Kopieren von Daten, dauert es Zeit, um den Indikator zu berechnen, so dass, obwohl der Griff korrekt zurückkehrt, die Daten noch nicht berechnet worden,
Im Allgemeinen wird empfohlen, Indikatoren in der Inite aufzurufen und Daten bereits in OnTick() oder anderen speziellen Funktionen abzufragen.
wieder, Sie kopieren 5 Daten von Null bar, aber in der copybuffer Null bar ist irgendwo um 1970 (hängt von max bar Einstellungen), das ist, warum ich sagte Blick auf die Array-Indizierung.
Der Schlupf vor dem Kopieren von Daten, dauert es Zeit, um den Indikator zu berechnen, so dass, obwohl der Handle korrekt zurückkehrt, die Daten noch nicht berechnet worden sind.
Sleep(1000); // 1 Sekunde nach dem Aufruf von iCustom() hat geholfen, ABER. Soll ich die Verzögerungszeit jetzt ablesen? Woher soll ich wissen, wie lange der Berechnungsprozess dauern wird?
es ist falsch, den korrekten Indikatorgriff zu geben, der auf Müll zeigt! und es muss vorher richtig funktioniert haben, weil es kein solches Problem gab.
Im Allgemeinen wird empfohlen, die Indikatoren in der Initis aufzurufen und die Daten bereits in OnTick() oder anderen speziellen Funktionen abzufragen.
Das ist ein guter Tipp für mich, danke ), denn wenn ich es so gemacht hätte, hätte ich das Problem nicht gesehen...
Wieder sind Sie kopieren 5 Daten von null bar, aber in copyBuffer null bar ist irgendwo um 1970 (hängt von max bar Einstellungen), das ist, warum ich sagte, schauen Sie sich die Indizierung des Arrays.
Soweit ich aus der Hilfedokumentation verstehe, ist in CopyBuffer() der Nullbalken tatsächlich "Gegenwart", und schon beim Kopieren wird das Array erweitert.
Sleep(1000); // 1 Sek. nach Aufruf von iCustom() hat geholfen, ABER... Was soll ich jetzt mit der Verzögerungszeit anfangen? Woher soll ich wissen, wie lange der Berechnungsprozess dauern wird?
Es ist falsch, den richtigen Blinker zu setzen, der auf den Müll hinweist! Und es muss vorher richtig funktioniert haben, denn es gab kein solches Problem.
Können die folgenden Indikatoroptionen (rot eingekreist) programmatisch gesetzt werden?
Ich habe keine Möglichkeit gefunden, dies zu tun.
Ich weiß nicht, ob dies ein Fehler ist, aber ich denke, es gibt Fehler im Code der Bibliotheken für alle Arten von Muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) für den Master, sieheCSignalTEMA::ShortCondition()
Auch in der SignalMA-Bibliothek in
Ich weiß nicht, ob dies ein Fehler ist, aber ich denke, es gibt Fehler im Code der Bibliotheken für alle Arten von Muvings (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) für den Master, siehe CSignalTEMA::ShortCondition()
Auch in der SignalMA-Bibliothek in
https://www.mql5.com/ru/forum/1111/page391#comment_67358
Geben Sie den vollen Wortlaut des Anrufs an.
/i:<Pfad zum MQL5-Ordner>.
Geben Sie die vollständige Zeichenkette an.
Hier sind alle ausprobierten Optionen:
Nach jedem Versuch wurde geprüft, ob die Datei unter dem folgenden Pfad existiert
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Scripts\sInstallerTestScript.ex5Der Einbrecher auf dem Weg
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Include\InstallerTestInclude\IncInstallerTest.mqhexistiert.
Die Existenzprüfung wurde von der Funktion durchgeführt: