Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 737

 
Alexey Viktorov:
Quelle est la dimensionnalité du tableau NewsArr dans la deuxième dimension ?

Malheureusement, je ne comprends pas. Quelle est la deuxième dimension ?

Ah, je crois que j'ai compris : NewsArr prend les valeurs 0,1,2 et 3. Ça ?

Cela doit être : string NewsArr[4][1000] ;

 
novichok2018:

Malheureusement, je ne comprends pas. Quelle est la deuxième dimension ?

Ah, je crois que j'ai compris : NewsArr prend les valeurs 0,1,2 et 3. Ça ?

Cela doit être : string NewsArr[4][1000];

Première dimension et deuxième dimension.

Mais c'est probablement la mauvaise réponse.
 
Alexey Viktorov:

La première dimension et la deuxième dimension.

Mais vous avez dû mal répondre.

Où dois-je chercher la dimensionnalité de la deuxième dimension ?

Ou bien la dimensionnalité de la première dimension est de 4 et celle de la seconde de 1000 ?
 
novichok2018:

Et où cherchez-vous la dimensionnalité de la deuxième dimension ?

Ou bien la première dimension est-elle de 4 et la seconde de 1000 ?

Oui. Mais il y a un problème dans ce post.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes les questions des débutants sur MQL4, aide et discussion sur les algorithmes et les codes.

novichok2018, 2019.01.16 15:52

C'est probablement une question idiote puisque personne n'y répond, mais comment gérer autrement l'arrêt et la reprise d'EA après la compilation ?

La plateforme donne un message :array out of range (284,17).

Ligne 284 : NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh) ; laposition 17 ouvre un crochet avec NomNews, qui est globalement initié par 0.

J'ai changé 0 en 1, sans succès.
J'aichangé la ligne if(NomNews==300)break ; 300 en 360000, en vain.

Je le compile - il fonctionne bien pendant quelques minutes. Et que faire ?

Lorsque le nombre de valeurs dans la deuxième dimension est de 1000 et que

if(NomNews==300)break;
Il ne peut pas y avoir de dépassement de tableau dans la deuxième dimension.


 
psyman:

Je n'ai pas de points d'ancrage, seulement un mouvement vertical, et je règle l'horizontale une fois sur la largeur de l'écran. Ce n'est pas un problème de compter de l'autre côté, mais il est surprenant que la même action soit effectuée différemment selon les fonctions.


Et une autre question - si je veux sortir Bid comme texte d'étiquette, quelle fonction dois-je utiliser pour le faire de manière optimale -OnChartEvent ouOnCalculate ?

OBJ_LABEL a un point d'ancrage même si vous ne l'avez pas défini. Par défaut, il s'agit du coin supérieur gauche. L'offre est modifiée dans OnCalculate et vous pouvez modifier le texte de l'étiquette à cet endroit.

 
Alexey Viktorov:

Oui. Mais il y a quelque chose de confus dans ce message

Lorsque le nombre de valeurs dans la deuxième dimension est de 1000 et que

Il ne peut pas y avoir de tableau hors limites dans la deuxième dimension.


Non, il ne semble pas y avoir de confusion. Voici le message copié : 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5 : array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

J'ai montré la ligne 284 ci-dessus.
 
novichok2018:

Non, je ne pense pas avoir fait quelque chose de mal. Voici le message copié : 2019.01.16 20:14:11.110 OnNews_M5_EURUSD EURUSD,M5 : array out of range in 'OnNews_M5_EURUSD.mq4' (284,17).

J'ai montré la ligne 284 ci-dessus.

La position 17 ouvre un crochet avec NomNews, qui est globalement initié par 0.

Donc, vous avez une taille de cellule de tableau à zéro dimension dans la deuxième dimension...

 
Artyom Trishkin:

Donc, la taille des cellules de votre tableau dans la deuxième dimension est de zéro...

C'est ici que se trouveNomNews :

datetime TimeNewsFunck(int nomf)

{

chaîne de caractères s=NewsArr[0][nomf] ;

string time=StringConcatenate(StringSubstr(s,0,4), ".",StringSubstr(s,5,2), ".",StringSubstr(s,8,2), " ",StringSubstr(s,11,2), " :",StringSubstr(s,14,4)) ;

return((datetime)(StringToTime(time) + GMTplus*3600))

}

//345678901234567890////////////////////////////////////////////////////////////////////////////////

void UpdateNews()

{

string TEXT=ReadCBOE() ;

int sh = StringFind(TEXT, "pageStartAt>")+12 ;

int sh2= StringFind(TEXT,"</tbody>") ;

TEXT=StringSubstring(TEXT,sh,sh2-sh) ;


sh=0 ;

while(!IsStopped())

{

sh = StringFind(TEXT, "event_timestamp",sh)+17 ;

sh2= StringFind(TEXT, "onclick",sh)-2 ;

if(sh<17 || sh2<0)break ;

NewsArr[0][NomNews]=StringSubstr(TEXT,sh,sh2-sh) ;


sh = StringFind(TEXT,flagCur,sh)+10 ;

sh2= sh+3 ;

si(sh<10 || sh2<3)break ;

NewsArr[1][NomNews]=StringSubstr(TEXT,sh,sh2-sh) ;

if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][NomNews])<0)continue ;


sh = StringFind(TEXT, "title",sh)+7 ;

sh2= StringFind(TEXT, "Volatility",sh)-1 ;

if(sh<7 || sh2<0)break ;

NewsArr[2][NomNews]=StringSubstr(TEXT,sh,sh2-sh) ;

if(StringFind(NewsArr[2][NomNews], "High")>=0 && !HighNews)continue ;

if(StringFind(NewsArr[2][NomNews], "Moderate")>=0 && !MidleNews)continue ;

if(StringFind(NewsArr[2][NomNews], "Low")>=0 && !LowNews)continue ;


sh=StringFind(TEXT, "left event",sh)+12 ;

int sh1=StringFind(TEXT, "Speaks",sh) ;

sh2=StringFind(TEXT,"<",sh) ;

if(sh<12 || sh2<0)break ;

if(sh1<0 || sh1>sh2)NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh2-sh) ;

else NewsArr[3][NomNews]=StringSubstr(TEXT,sh,sh1-sh) ;


NomNews++ ;

if(NomNews==300)break ;

}

}

Valeurs comprises entre 0 et 300. Régler globalement à 4 ?

 
novichok2018:


Valeurs comprises entre 0 et 300. Dois-je le régler globalement sur 4 ?

Il donne toujours un message à 12 minutes.

 
novichok2018:

Donne toujours un message à la 12e minute de fonctionnement.

Tout cela me fait dire que NomNews entre dans la boucle While déjà dans un état supérieur à 999. Vous devez alors trouver pourquoi cela se produit et réinitialiser cette variable quelque part.

Pour le vérifier, écrivez-le au début de la boucle :

if(NomNews > 999)
{
   Print(NomNews);
   break;
}