Avant de déplacer le marqueur de prix, la position horizontale est calculée sur la largeur actuelle de l'écran.
x=width -70;
Lorsque j'ouvre la barre latérale, le marqueur se déplace vers la droite au-delà de la limite de l'écran. Si j'appuie sur le bouton d'actualisation dans le journal, je peux voir l'indicateur fonctionner, mais le marqueur ne revient pas, il n'apparaît qu'au deuxième essai. Il s'avère que OnCalculate n'est pas appelé à chaque fois ? Comment faire pour que la fonction fonctionne en permanence ?
Avant de déplacer le marqueur de prix, la position horizontale est calculée sur la largeur actuelle de l'écran.
Lorsque j'ouvre la barre latérale, le marqueur se déplace vers la droite au-delà de la limite de l'écran. Si j'appuie sur le bouton d'actualisation dans le journal, je peux voir l'indicateur fonctionner, mais le marqueur ne revient pas, il n'apparaît qu'au deuxième essai. Il s'avère que OnCalculate n'est pas appelé à chaque fois ? Comment faire pour que cette fonction fonctionne toujours ?
effectuer l'interrogation et le redécoupage dansOnChartEvent - CHARTEVENT_CHART_CHANGE
Si l'indicateur dessine des flèches sur le graphique et que les flèches ne sont pas des objets, est-il possible d'obtenir les paramètres de ce dessin à partir du graphique lui-même ou d'une autre manière ? Je ne peux pas obtenir de données à partir des tampons et même exécuter l'indicateur pour le tester normalement.
Si l'indicateur dessine des flèches sur le graphique et que les flèches ne sont pas des objets, est-il possible d'obtenir les paramètres de ce dessin à partir du graphique lui-même ou d'une autre manière ? Je ne peux pas obtenir de données à partir des tampons et même exécuter l'indicateur pour le tester normalement.
Vérifiez le permis de travail pour un conseiller. Et où est la sortie dans l'impression ? Ce morceau de code semble renvoyer quelque chose, puisqu'il n'y a pas d'erreurs, alors le problème est en dehors de ce morceau de code. Dans cette pièce, sauf que la division par 0 peut se produire
Code entier ? Oui maintenant .
//+------------------------------------------------------------------+//| Stop_Ma_v5.1.mq4 |//| Copyright 2018, axe44 |//| http://axe44.opentraders.ru/bio/ |//+------------------------------------------------------------------+#property copyright"Copyright 2018,@ axe44"#property link"gerchikco.com/registration/?ref=sfaCLYmR"#property version"5.10"#property strict//--- Inputsexterndouble Lots = 0.1 ; // Lots лотexternbool Z_schet = 1 ; // Z_schet з-тенденцияexternint Expir = 20 ; // Expir истечение в часахexterndouble klot = 1.5 ; // klot - множитель тенденцииexternint StopLoss = 200 ; // StopLoss лосьexternint TakeProfit = 300 ; // TakeProfit язьexternint BULevel = 0 ; // BULevel уровень БУexternint BUPoint = 3 ; // BUPoint пункты БУexternint Spred = 4 ; // Spred спред externint TrailingStop = 0 ; // TrailingStop тралinputENUM_TIMEFRAMES TF1 = PERIOD_M15 ; //TF1 Время АТРexternint Stop = 14 ; // Stop Периуд Stop//extern int Atr_Procent = 20; //Atr_Procent Максимальный процент АТР для работыinputENUM_TIMEFRAMES TF2 = PERIOD_M15 ; //TF2 Время Ма открытия\закрытия //extern int Pr = 50; // Pr Процент разницы движения.externint MA = 14 ; //MA Периуд MAexternint MaM = 3 ; //MaM способ расчёта Ма externint StartHour = 0 ; //StartHour час начала торговлиexternint StartMin = 30 ; //StartMin минута начала торговлиexternint EndHour = 23 ; //EndHour час окончания торговлиexternint EndMin = 30 ; //EndMin минута окончания торговлиexternint Slip = 30 ; //Slip реквотexternint Magic = 124 ; //Magic магикexternint TesterMinPercentProfitTrades= 50 ;
externint AutoLot = 1 ; // автолотdouble atr,ma,rm,pm,minatr,lot,hma,lma,min,max,zn,C,pribul;
double NormalP[ 302 ];
int i,count,prom,index,psd,usd;
datetime t= 1 ,day,hour;
bool ww,nn,bb,ss;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit ()
{
//---if ( Digits == 3 || Digits == 5 )
{
TakeProfit*= 10 ;
StopLoss*= 10 ;
TrailingStop*= 10 ;
BUPoint*= 10 ;
BULevel*= 10 ;
Slip*= 10 ;
Spred*= 10 ;
}
//---return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| расчёт лота |//+------------------------------------------------------------------+double MoneyManagement()
{
double DynamicLot= 0 ;
double Free_Equity= AccountEquity ();
if (Free_Equity<= 0 ) return ( 0 );
double TickValue= MarketInfo ( Symbol (), MODE_TICKVALUE );
double LotStep= MarketInfo ( Symbol (), MODE_LOTSTEP );
double MinLot= MarketInfo ( Symbol (), MODE_MINLOT );
double MxLot= MarketInfo ( Symbol (), MODE_MAXLOT );
if (TickValue*LotStep!= 0 ) DynamicLot= MathFloor ((Free_Equity* MathMin (AutoLot/ 10 , 100 )/ 1000 )/StopLoss*TickValue/LotStep)*LotStep;
if (DynamicLot<MinLot)DynamicLot=MinLot;
if (DynamicLot>MxLot)DynamicLot=MxLot;
return (DynamicLot);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit ( constint reason)
{
Comment ( "" );
}
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 30.04.2009 |//| Описание : Возвращает флаг разрешения торговли по времени. |//+----------------------------------------------------------------------------+//| Параметры: |//| hb - часы времени начала торговли |//| mb - минуты времени начала торговли |//| he - часы времени окончания торговли |//| me - минуты времени окончания торговли |//+----------------------------------------------------------------------------+bool isTradeTimeInt( int hb= 0 , int mb= 0 , int he= 0 , int me= 0 )
{
datetime db, de; // Время начала и окончания работыint hc; // Часы текущего времени торгового сервера
db= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " +( string )hb+ ":" +( string )mb);
de= StrToTime ( TimeToStr ( TimeCurrent (), TIME_DATE )+ " " +( string )he+ ":" +( string )me);
hc= TimeHour ( TimeCurrent ());
if (db>=de)
{
if (hc>=he) de+= 24 * 60 * 60 ; else db-= 24 * 60 * 60 ;
}
if ( TimeCurrent ()>=db && TimeCurrent ()<=de) return ( True );
elsereturn ( False );
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void PutOrder( int type, double price)
{
int r= 0 ;
color clr=Green;
double sl= 0 ,tp= 0 ;
if (type== 1 || type== 3 || type== 5 )
{
clr=Red;
if (StopLoss> 0 ) sl= NormalizeDouble (price+StopLoss* Point , Digits );
if (TakeProfit> 0 ) tp= NormalizeDouble (price-TakeProfit* Point , Digits );
}
if (type== 0 || type== 2 || type== 4 )
{
clr=Blue;
if (StopLoss> 0 ) sl= NormalizeDouble (price-StopLoss* Point , Digits );
if (TakeProfit> 0 ) tp= NormalizeDouble (price+TakeProfit* Point , Digits );
}
if (AutoLot> 0 ){lot=MoneyManagement();}
if (AutoLot<= 0 ){lot=Lots;}
r= OrderSend ( NULL ,type,lot, NormalizeDouble (price, Digits ),Slip,sl,tp, "" ,Magic, TimeCurrent ()+Expir* 60 * 60 ,clr);
return ;
}
//+------------------------------------------------------------------+//| история |//+------------------------------------------------------------------+double history()
{
if ( OrderSelect ( OrdersHistoryTotal ()- 1 , SELECT_BY_POS , MODE_HISTORY ))
{
pribul= OrderProfit ();
}
return (pribul);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int CountOrders( int type)
{
count= 0 ;
for ( i= OrdersTotal ()- 1 ;i>= 0 ;i--)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
{
if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic)
{
if ( OrderType ()==type) count++;
}
}
}
return (count);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+int CountTrades()
{
count= 0 ;
for ( i= OrdersTotal ()- 1 ;i>= 0 ;i--)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
{
if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic)
{
if ( OrderType ()< 2 ) count++;
}
}
}
return (count);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double Znomer()
{
zn= 0 ; // z-число
psd= 0 ; // кол. положительных сделок
usd= 0 ; // количество отрицательных сделок
ww= 0 ; // боол переменная
nn= 0 ; // боол переменная
C= 0 ; // C = количество чередований между отрицательными и положительными сделками
index= OrdersHistoryTotal ();
if ( OrdersHistoryTotal ()> 302 ) index= 301 ; // берём не более 301 сделкиif (index< 30 ) return ( 0 ); // берём не менее 30
count= OrdersHistoryTotal (); // считаем от скольки
prom=count-index; // выделяем только последние сделкиif (prom< 0 ) prom= 0 ; // исключаем ошибкиfor ( i=count;i>prom;i--)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_HISTORY )== true )
{
if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic)
{ // далее магия
pribul= OrderProfit ();
if (ww== 0 &&pribul> 1 ){C++;ww= 1 ;nn= 0 ;} // подсчитываем смену тенденцииif (nn== 0 &&pribul< 1 ){C++;ww= 0 ;nn= 1 ;} // подсчитываем смену тенденции if (pribul> 1 ){psd++;} //прибыльные сделкиif (pribul< 1 ){usd++;} // убыточные сделки
}
}
}
/*/*
Величина Z = (A * (C — 0.5) — B)/ ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок,
когда прибыльная сделка сменяет убыточную либо наоборот).
*/
index=psd+usd;
if (index< 30 ) return ( 0 );
zn=(index*(C- 0.5 )-( 2 *psd*usd))/
(((( 2 *psd*usd)*(( 2 *psd*usd)-C))/
(C- 1 ))*(((( 2 *psd*usd)*(( 2 *psd*usd)-C))/
(C- 1 ))* 0.5 ));
return (zn);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void Trailing()
{
bool mod;
for ( i= OrdersTotal ()- 1 ;i>= 0 ;i--)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
{
if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic)
{
if ( OrderType ()== OP_BUY )
{
if ( Bid - OrderOpenPrice ()>TrailingStop* Point )
{
if (( OrderStopLoss ()<( Bid -TrailingStop* Point )) || ( OrderStopLoss ()== 0 ))
{
mod= OrderModify ( OrderTicket (), OrderOpenPrice (), Bid -TrailingStop* Point , OrderTakeProfit (), 0 ,Yellow);
return ;
}
}
}
if ( OrderType ()== OP_SELL )
{
if (( OrderOpenPrice ()- Ask )>TrailingStop* Point )
{
if (( OrderStopLoss ()>( Ask +TrailingStop* Point )) || ( OrderStopLoss ()== 0 ))
{
mod= OrderModify ( OrderTicket (), OrderOpenPrice (), Ask +TrailingStop* Point , OrderTakeProfit (), 0 ,Yellow);
return ;
}
}
}
}
}
}
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void BU()
{
bool m;
for ( i= OrdersTotal ()- 1 ;i>= 0 ;i--)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
{
if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic)
{
if ( OrderType ()== OP_BUY )
{
if ( OrderOpenPrice ()<=( Bid -(BULevel+BUPoint)* Point ) && OrderOpenPrice ()> OrderStopLoss ())
{
m= OrderModify ( OrderTicket (), OrderOpenPrice (), OrderOpenPrice ()+BUPoint* Point , OrderTakeProfit (), 0 ,Yellow);
}
}
if ( OrderType ()== OP_SELL )
{
if ( OrderOpenPrice ()>=( Ask +(BULevel+BUPoint)* Point ) && ( OrderOpenPrice ()< OrderStopLoss () || OrderStopLoss ()== 0 ))
{
m= OrderModify ( OrderTicket (), OrderOpenPrice (), OrderOpenPrice ()-BUPoint* Point , OrderTakeProfit (), 0 ,Yellow);
}
}
}
}
}
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+void CloseAll( int ot=- 1 )
{
bool cl;
for ( i= OrdersTotal ()- 1 ;i>= 0 ;i--)
{
if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
{
if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==Magic)
{
if ( OrderType ()== 0 && (ot== 0 || ot==- 1 ))
{
RefreshRates ();
cl= OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Bid , Digits ),Slip,White);
}
if ( OrderType ()== 1 && (ot== 1 || ot==- 1 ))
{
RefreshRates ();
cl= OrderClose ( OrderTicket (), OrderLots (), NormalizeDouble ( Ask , Digits ),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick ()
{
if (t!= Time [ 0 ]&&( Ask - Bid )<Spred* Point )
{
ww= 1 ;
nn= 1 ;
t= Time [ 0 ];
if (TrailingStop> 0 ) Trailing();
if (BULevel> 0 ) BU();
rm = iMA ( NULL ,TF2,MA, 0 ,MaM, 0 , 1 )- iMA ( NULL ,TF2,MA, 0 ,MaM, 1 , 1 );
pm = iMA ( NULL ,TF2,MA, 0 ,MaM, 0 , 2 )- iMA ( NULL ,TF2,MA, 0 ,MaM, 1 , 2 );
// Stop//---- maximums counting
hma = High [ iHighest ( NULL , 0 , MODE_HIGH ,Stop, 1 )];
lma = Low [ iLowest ( NULL , 0 , MODE_LOW ,Stop, 1 )];
//----//Print("hma ",hma);//Print("lma ",lma);//if ( Znomer()!=0) {zn=Znomer();Print("== Z-счёт равен = ",zn);}
}
if (ww== 1 && pm< 0 && rm> 0 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin)) { if ( Ask <hma)PutOrder( 4 ,hma);
if ( Bid >lma)PutOrder( 5 ,lma);
ww= 0 ;} // Если цена раньше падала а теперь растётif (nn== 1 && pm> 0 && rm< 0 && isTradeTimeInt(StartHour,StartMin,EndHour,EndMin)) { if ( Ask <hma)PutOrder( 4 ,hma);
if ( Bid >lma)PutOrder( 5 ,lma);
nn= 0 ;}
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| Tester function |//+------------------------------------------------------------------+doubleOnTester ()
{
double PercentProfitTrades = 0 ;
if ( TesterStatistics ( STAT_PROFIT_TRADES ) > 0 )
PercentProfitTrades = TesterStatistics ( STAT_PROFIT_TRADES ) / TesterStatistics ( STAT_TRADES ) * 100 ;
if (PercentProfitTrades >= TesterMinPercentProfitTrades)
return ( NormalizeDouble (( TesterStatistics ( STAT_PROFIT ) / TesterStatistics ( STAT_EQUITY_DD )), 2 ));
elsereturn ( 0 );
}
//+------------------------------------------------------------------+
La ligne 378 est la même impression, lorsqu'elle est activée, l'EA ne fonctionne plus.
Je soupçonne qu'il y a une erreur dans la conception du code aux lignes 221 et 223 . Personne n'utilise l'énumération historique, il y a peu d'exemples, donc une erreur est possible. Il y a un exemple sur la page https://www.mql5.com/en/code/7452 , mais c'est trop compliqué pour moi là-bas. Division par zéro dans la fonction Znomer(), ligne 206, j'ai exclu.
J'attends avec impatience les instructions et les recommandations. Merci.
Включаемый файл Z_include.mqh содержит функцию, которая вычисляет на массиве данных следующие параметры: Max - максимальное значение;Min - минимальное значение;матожидание - среднее значение;стандартное отклонение - среднеквадратичное отклонение (несмещенную оценку);скос;эксцесс;Z-счет на массиве данных. Описание понятия Z -счет смотрите в...
La ligne 378 est la même impression, qui, une fois activée, fait que l'EA ne fonctionne plus.
Je soupçonne qu'il y a une erreur dans le formatage du code aux lignes 221 et 223 . Personne n'utilise le rejeu de l'histoire, il n'y a pas tant d'exemples, donc cela pourrait être une erreur. Il existe un exemple sur https://www.mql5.com/ru/code/7452 , mais il est trop compliqué pour moi. J'ai exclu ladivision par zéro dans la fonction Znomer(), ligne 206.
J'attends des instructions et des recommandations. Merci.
S'il n'y a pas une seule transaction sur le symbole et le majik regardés, ou s'il n'y a pas un seul profit ou une seule perte, ou s'il n'y a qu'une seule paire (C=1), nous obtiendrons la division par 0.
Avant la formule elle-même, vous devez vérifier que psd et usd sont > 0, et C !=1
Les paires rentables sont calculées avec un bénéfice > 1, une perte < 1, avec un bénéfice=1 ne sont pas analysées, c'est-à-dire que 1 doit aussi être inclus quelque part dans tel ou tel groupe.
Dans votre fonction, il serait préférable de sélectionner d'abord les numéros de transaction correspondant au symbole et au numéro magique, puis de vérifier si leur numéro a changé, si c'est le cas - recalculer zn, sinon - retourner zn (dans ce cas, zn n'est pas remis à zéro et la vérification != 0 ne sera pas nécessaire lors de l'impression).
Le hibou cesse de fonctionner, car il s'appuie sur les variables ww et nn, et lorsque votre fonction fonctionne, elles changent et brisent l'algorithme du hibou.
Rien n'aurait été compilé s'il y avait eu une erreur de conception du code.
Une autre question alors :-)
Avant de déplacer le marqueur de prix, la position horizontale est calculée sur la largeur actuelle de l'écran.
x=width -70;Lorsque j'ouvre la barre latérale, le marqueur se déplace vers la droite au-delà de la limite de l'écran. Si j'appuie sur le bouton d'actualisation dans le journal, je peux voir l'indicateur fonctionner, mais le marqueur ne revient pas, il n'apparaît qu'au deuxième essai. Il s'avère que OnCalculate n'est pas appelé à chaque fois ? Comment faire pour que la fonction fonctionne en permanence ?
Une autre question alors :-)
Avant de déplacer le marqueur de prix, la position horizontale est calculée sur la largeur actuelle de l'écran.
Lorsque j'ouvre la barre latérale, le marqueur se déplace vers la droite au-delà de la limite de l'écran. Si j'appuie sur le bouton d'actualisation dans le journal, je peux voir l'indicateur fonctionner, mais le marqueur ne revient pas, il n'apparaît qu'au deuxième essai. Il s'avère que OnCalculate n'est pas appelé à chaque fois ? Comment faire pour que cette fonction fonctionne toujours ?
effectuer l'interrogation et le redécoupage dansOnChartEvent - CHARTEVENT_CHART_CHANGE
Salutations. Tu peux me dire quelque chose ?
Si l'indicateur dessine des flèches sur le graphique et que les flèches ne sont pas des objets, est-il possible d'obtenir les paramètres de ce dessin à partir du graphique lui-même ou d'une autre manière ? Je ne peux pas obtenir de données à partir des tampons et même exécuter l'indicateur pour le tester normalement.
Salutations. Tu peux me dire quelque chose ?
Si l'indicateur dessine des flèches sur le graphique et que les flèches ne sont pas des objets, est-il possible d'obtenir les paramètres de ce dessin à partir du graphique lui-même ou d'une autre manière ? Je ne peux pas obtenir de données à partir des tampons et même exécuter l'indicateur pour le tester normalement.
Avez-vous le code de l'indicateur ?
Y a-t-il un code pour l'indicateur ?
pas de
Les tentatives d'obtenir des données de cet indicateur, ainsi que l'indicateur lui-même, ont été discutées ici.
https://www.mql5.com/ru/forum/160587/page165#comment_10221621
J'étudie les exemples du tutoriel et l'un d'entre eux échoue à compiler sur la ligne
MQL5_PROGRAM_NAME' - cannot convert enum mouse_2.mq5 29 52
Vérifiez le permis de travail pour un conseiller. Et où est la sortie dans l'impression ? Ce morceau de code semble renvoyer quelque chose, puisqu'il n'y a pas d'erreurs, alors le problème est en dehors de ce morceau de code. Dans cette pièce, sauf que la division par 0 peut se produire
Code entier ? Oui maintenant .
La ligne 378 est la même impression, lorsqu'elle est activée, l'EA ne fonctionne plus.
Je soupçonne qu'il y a une erreur dans la conception du code aux lignes 221 et 223 . Personne n'utilise l'énumération historique, il y a peu d'exemples, donc une erreur est possible. Il y a un exemple sur la page https://www.mql5.com/en/code/7452 , mais c'est trop compliqué pour moi là-bas.
Division par zéro dans la fonction Znomer(), ligne 206, j'ai exclu.
J'attends avec impatience les instructions et les recommandations. Merci.
pas de
Les tentatives d'obtenir des données de cet indicateur, ainsi que l'indicateur lui-même, ont été discutées ici.
https://www.mql5.com/ru/forum/160587/page165#comment_10221621
Désolé, je n'exécute pas le fichier .dll sur mon ordinateur par principe, allez-y sans moi.
Seulement les indicateurs ici. Lors de l'utilisation dans les paramètres, j'ai désactivé l'utilisation de la seconde.
Le code entier ? Oui, maintenant.
La ligne 378 est la même impression, qui, une fois activée, fait que l'EA ne fonctionne plus.
Je soupçonne qu'il y a une erreur dans le formatage du code aux lignes 221 et 223 . Personne n'utilise le rejeu de l'histoire, il n'y a pas tant d'exemples, donc cela pourrait être une erreur. Il existe un exemple sur https://www.mql5.com/ru/code/7452 , mais il est trop compliqué pour moi.
J'ai exclu ladivision par zéro dans la fonction Znomer(), ligne 206.
J'attends des instructions et des recommandations. Merci.
L'excès((2*psd*usd)*((2*psd*usd)-C))/(C-1)) dans la formule.
Dans la mesure où : ^0,5 n'est pas *0,5
S'il n'y a pas une seule transaction sur le symbole et le majik regardés, ou s'il n'y a pas un seul profit ou une seule perte, ou s'il n'y a qu'une seule paire (C=1), nous obtiendrons la division par 0.
Avant la formule elle-même, vous devez vérifier que psd et usd sont > 0, et C !=1
Les paires rentables sont calculées avec un bénéfice > 1, une perte < 1, avec un bénéfice=1 ne sont pas analysées, c'est-à-dire que 1 doit aussi être inclus quelque part dans tel ou tel groupe.
Dans votre fonction, il serait préférable de sélectionner d'abord les numéros de transaction correspondant au symbole et au numéro magique, puis de vérifier si leur numéro a changé, si c'est le cas - recalculer zn, sinon - retourner zn (dans ce cas, zn n'est pas remis à zéro et la vérification != 0 ne sera pas nécessaire lors de l'impression).
Le hibou cesse de fonctionner, car il s'appuie sur les variables ww et nn, et lorsque votre fonction fonctionne, elles changent et brisent l'algorithme du hibou.
Rien n'aurait été compilé s'il y avait eu une erreur de conception du code.