J'ai essayé sur deux indicateurs. Les deux fonctionnaient bien, mais plus maintenant.
2) il y a souvent des problèmes lorsqu'on essaie de tester le run avec la connexion aux cores (fonctionne au nième run). voir l'image.
LeXpert: Un groupe de télépathes se penche déjà sur votre problème.
Il n'est pas nécessaire d'être télépathe pour comprendre que la fonction iCustom() ne fonctionne pas comme elle le devrait.
pour le tester, vous pouvez exécuter le code de l'Expert Advisor : 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") ; sinon for (int i = 0 ; i < 5 ; i++) Print("buffer[", i, "] = ", buffer[i] ;
et le message "Failed to get Custom Moving Average indicator values" s'affiche.
i.e., CopyBuffer donne une erreur (retourne -1) pour le handle de l'indicateur iCustom(). si nous prenons l'indicateur standard iMA(), le même code fonctionne !
Urain: Regardez la direction d'indexation du tableau résultant, peut-être doit-il être étendu.
tout va bien avec la direction de l'indexation et dans les versions précédentes cela fonctionnait aussi. en 448 et 450 cela ne fonctionnait pas. J'ai suggéré à plusieurs reprises que les développeurs devraient tester la fonctionnalité principale du terminal de manière plus approfondie, mais de build en build ils obtiennent des erreurs critiques différentes au lieu de critiques. C'est-à-dire qu'une chose est réparée et qu'une autre qui fonctionnait normalement se casse et qu'il n'y a pas de fin en vue.
Le glissement avant la copie des données, il faut du temps pour calculer l'indicateur, donc même si la poignée revient correctement, les données n'ont pas encore été calculées,
En général, il est recommandé d'appeler les indicateurs dans l'inite, et de demander les données déjà dans OnTick() ou d'autres fonctions spéciales.
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]);
Encore une fois, vous copiez 5 données à partir de la barre zéro, mais dans le tampon de copie, la barre zéro est quelque part autour de 1970 (dépend des paramètres de la barre maximale), c'est pourquoi j'ai dit de regarder l'indexation du tableau.
Le glissement avant la copie des données, il faut du temps pour calculer l'indicateur, donc bien que la poignée revienne correctement, les données n'ont pas encore été calculées.
Sleep(1000) ; // 1 sec après avoir appelé iCustom() a aidé, MAIS. Dois-je prendre le temps de retard maintenant ? Comment puis-je savoir combien de temps le processus de calcul va prendre ? c'est une erreur de donner la poignée d'indicateur correcte pointant vers des déchets ! et cela devait fonctionner correctement avant car il n'y avait pas de tel problème.
Urain:
en général, il est recommandé d'appeler les indicateurs dans les initiales, et de demander les données déjà dans OnTick() ou d'autres fonctions spéciales.
C'est un bon conseil pour moi, merci ) car si j'avais fait comme ça, je n'aurais pas vu le problème....
Encore une fois, vous copiez 5 données de la barre zéro, mais dans copyBuffer la barre zéro est quelque part autour de 1970 (dépend des paramètres de la barre maximale), c'est pourquoi j'ai dit de regarder l'indexation du tableau.
D'après ce que j'ai compris de la documentation d'aide, dans CopyBuffer() la barre zéro est en fait "le temps présent", et déjà quand vous le copiez, le tableau est étendu.
Sleep(1000) ; // 1 sec. après avoir appelé iCustom() a aidé, MAIS... Comment puis-je savoir combien de temps le processus de calcul va prendre ? c'est une erreur de donner la poignée d'indicateur correcte indiquant les déchets ! et cela devait fonctionner correctement avant, car il n'y avait pas un tel problème.
Vous n'avez pas besoin d'ajuster le délai de la fonction Sleep(), si vous divisez par le temps l'appel iCustom et l'accès aux valeurs de cet indicateur. En outre, il existe la fonction BarsCalculated()
Je ne sais pas si c'est un bug, mais je pense qu'il y a des erreurs dans le code des bibliothèques pour tous les types de manœuvres (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) pour le maître, voirCSignalTEMA::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);
}
Également dans la bibliothèque SignalMA dans
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)
{
.....
}
Je ne sais pas si c'est un bug, mais je pense qu'il y a des erreurs dans le code des bibliothèques pour tous les types de manœuvres (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) pour le maître, voir CSignalTEMA::ShortCondition()
Également dans la bibliothèque SignalMA dans
Merci beaucoup. Sera corrigé. (Maudit copié-collé)
Laquelle ?
J'ai essayé sur deux indicateurs. Les deux fonctionnaient bien, mais plus maintenant.
2) il y a souvent des problèmes lorsqu'on essaie de tester le run avec la connexion aux cores (fonctionne au nième run). voir l'image.
Un groupe de télépathes se penche déjà sur votre problème.
Il n'est pas nécessaire d'être télépathe pour comprendre que la fonction iCustom() ne fonctionne pas comme elle le devrait.
pour le tester, vous pouvez exécuter le code de l'Expert Advisor :
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") ;
sinon
for (int i = 0 ; i < 5 ; i++) Print("buffer[", i, "] = ", buffer[i] ;
et le message "Failed to get Custom Moving Average indicator values" s'affiche.
i.e., CopyBuffer donne une erreur (retourne -1) pour le handle de l'indicateur iCustom(). si nous prenons l'indicateur standard iMA(), le même code fonctionne !
Regardez la direction d'indexation du tableau résultant, peut-être doit-il être étendu.
tout va bien avec la direction de l'indexation et dans les versions précédentes cela fonctionnait aussi. en 448 et 450 cela ne fonctionnait pas.
J'ai suggéré à plusieurs reprises que les développeurs devraient tester la fonctionnalité principale du terminal de manière plus approfondie,
mais de build en build ils obtiennent des erreurs critiques différentes au lieu de critiques.
C'est-à-dire qu'une chose est réparée et qu'une autre qui fonctionnait normalement se casse et qu'il n'y a pas de fin en vue.
Le glissement avant la copie des données, il faut du temps pour calculer l'indicateur, donc même si la poignée revient correctement, les données n'ont pas encore été calculées,
En général, il est recommandé d'appeler les indicateurs dans l'inite, et de demander les données déjà dans OnTick() ou d'autres fonctions spéciales.
Encore une fois, vous copiez 5 données à partir de la barre zéro, mais dans le tampon de copie, la barre zéro est quelque part autour de 1970 (dépend des paramètres de la barre maximale), c'est pourquoi j'ai dit de regarder l'indexation du tableau.
Le glissement avant la copie des données, il faut du temps pour calculer l'indicateur, donc bien que la poignée revienne correctement, les données n'ont pas encore été calculées.
Sleep(1000) ; // 1 sec après avoir appelé iCustom() a aidé, MAIS. Dois-je prendre le temps de retard maintenant ? Comment puis-je savoir combien de temps le processus de calcul va prendre ?
c'est une erreur de donner la poignée d'indicateur correcte pointant vers des déchets ! et cela devait fonctionner correctement avant car il n'y avait pas de tel problème.
en général, il est recommandé d'appeler les indicateurs dans les initiales, et de demander les données déjà dans OnTick() ou d'autres fonctions spéciales.
C'est un bon conseil pour moi, merci ) car si j'avais fait comme ça, je n'aurais pas vu le problème....
Encore une fois, vous copiez 5 données de la barre zéro, mais dans copyBuffer la barre zéro est quelque part autour de 1970 (dépend des paramètres de la barre maximale), c'est pourquoi j'ai dit de regarder l'indexation du tableau.
D'après ce que j'ai compris de la documentation d'aide, dans CopyBuffer() la barre zéro est en fait "le temps présent", et déjà quand vous le copiez, le tableau est étendu.
Sleep(1000) ; // 1 sec. après avoir appelé iCustom() a aidé, MAIS... Comment puis-je savoir combien de temps le processus de calcul va prendre ?
c'est une erreur de donner la poignée d'indicateur correcte indiquant les déchets ! et cela devait fonctionner correctement avant, car il n'y avait pas un tel problème.
Les options suivantes de l'indicateur (encerclées en rouge) peuvent-elles être définies par programme ?
Je n'ai pas trouvé de moyen de le faire.
Je ne sais pas si c'est un bug, mais je pense qu'il y a des erreurs dans le code des bibliothèques pour tous les types de manœuvres (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) pour le maître, voirCSignalTEMA::ShortCondition()
Également dans la bibliothèque SignalMA dans
Je ne sais pas si c'est un bug, mais je pense qu'il y a des erreurs dans le code des bibliothèques pour tous les types de manœuvres (SignalFrAMA, SignalAMA, SignalMA, SignalDEMA, SignalTEMA) pour le maître, voir CSignalTEMA::ShortCondition()
Également dans la bibliothèque SignalMA dans
https://www.mql5.com/ru/forum/1111/page391#comment_67358
Donnez la ligne complète de l'appel.
/i:<chemin du dossier MQL5>.
Donnez la chaîne d'appel complète.
Voici toutes les options essayées :
Après chaque tentative, une vérification a été effectuée pour voir si le fichier existait sur le chemin
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Scripts\sInstallerTestScript.ex5L'intrus sur le chemin
D:\Users\Дмитрий\AppData\Roaming\MetaQuotes\Terminal\44 D6FB562C883F0C70690F3306A3851D\MQL5\Include\InstallerTestInclude\IncInstallerTest.mqhexiste.
Le contrôle d'existence a été effectué par la fonction :