Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1087

 
rabanik:
Bon après-midi. Veuillez m'aider à écrire le code suivant, pour un EA. Je veux le faire à travers un tableau (si vous avez une meilleure option, s'il vous plaît aidez). En général, l'EA envoie des messages, mais je veux qu'il les envoie à travers un tableau (temporaire). C'est-à-dire qu'au début de l'envoi du message, le Conseiller Expert vérifie si le message a été envoyé auparavant (vérifie si le message est stocké dans le tableau), si non, il envoie le message, si le message est trouvé, alors l'envoi est omis. J'espère que c'est clair) Merci beaucoup !

Etes-vous sûr de l'énoncé du problème ?

Simplement, il y a des options :

- Ne répétez pas le dernier message

- pour ignorer le message périmé (un certain délai est fixé), c'est-à-dire que le message doit être répété.

P.S. La première variante est un cas particulier de la seconde, mais elle est beaucoup plus facile à mettre en œuvre. Votre définition du problème est également un cas particulier de la deuxième variante avec décalage infini.

Si cela vous intéresse, voici la solution de votre problème.

Nous définissons deux tableaux : un tableau de texte, qui stocke les messages, et un tableau d'index, pour la recherche de messages.

Le tableau d'index est de type int. Dans la première dimension, nous écrivons la somme de contrôle du message texte. Dans le second - le numéro de ligne du premier tableau. Un tableau d'index est trié par la première dimension.

Nous recevons un nouveau message. Lisez sa somme de contrôle. La fonction ArrayBsearch() permet de trouver ce message. S'il n'est pas trouvé, alors le message est original. Ajoutez-le au tableau de messages et, somme de contrôle avec référence au tableau d'index, en n'oubliant pas de le trier.

Quelles sont les options pour la somme de contrôle ? Je prendrais celle-ci : prendre en compte le nombre de caractères et la somme de contrôle du texte. La somme de contrôle du texte, par exemple, est la somme des codes de caractères. Compte tenu des changements récents, il ne peut dépasser 65 536*256. C'est-à-dire que la somme de contrôle du message peut ressembler à ceci :

le nombre de caractères multiplié par 10 millions et ajouter la somme de contrôle du texte.

 

pro ! il y a un problème avec la ligne sur l'angle.

J'ai construit unTRENDBYANGLE en utilisant des coordonnées.

ObjectCreate(0,"anglestok",OBJ_TRENDBYANGLE,0,0,0);
ObjectSet("anglestok",OBJPROP_TIME1,X1); ObjectSet("anglestok",OBJPROP_PRICE1,Y1);
ObjectSet("anglestok",OBJPROP_TIME2,X2); ObjectSet("anglestok",OBJPROP_PRICE2,Y2);

- J'ai besoin d'un angle.

anglestok= ObjectGetDouble(0,"anglestok",OBJPROP_ANGLE);

L'aide dit que la ligne créée par le programme - l'angle de ZERO est ok.

J'ai réexécuté le même code aux mêmes coordonnées sans toucher la ligne - il apparaît le nombre correct de degrés, et non zéro. pourquoi, comment faire correctement du premier coup ?

ou j'ai donné une coordonnée - je demande l'angle - il dit 0. puis j'en donne une autre - il dit l'angle des coordonnées précédentes. non-sens

 
Pour quels cas met-on const après la description de la signature de la fonction ? Je ne trouve aucune information à ce sujet.
void qwe(int abc) const {...}
 
Je n'ai pas l'impression de trouver de vrais connaisseurs ici, je me suis juste inscrit pour rien =/.
 
K_i_r_i_t_o:
J'ai déplacé ce commentaire au début parce que personne n'a répondu, mais j'en ai vraiment besoin =/
Est-il possible d'implémenter ceci :si j'appuie sur n'importe quelle touche, une partie du code de l'indicateur est activée (responsable de la création d'un objet avec un clic de souris), puis si un événement se produit (la deuxième partie du code, l'événement peut être, la création du même objet par exemple), alors la première partie du code est désactivée (et si ne pas faire cela, l'objet est créé par chaque clic), et fonctionne également lorsque vous appuyez sur la touche, et ainsi de suite autour)
Vous pouvez. Ajouter le bloc OnChartEvent. Dans ce document, notez les pressions et les mesures nécessaires et décrivez la réaction à celles-ci en fonction de votre idée.
 
SunnYtheDreamer:
Vous pouvez. Ajouter le bloc OnChartEvent. Dans celui-ci, notez les pressions et les mesures nécessaires et décrivez la réaction à celles-ci, selon votre idée.
Ilest impossible d'implémenter la désactivation d'une partie du code pendant la période précédant l'appui sur la touche =/ Il existe une variante plus simple, mais il y a un problème,lorsque l'on appuie sur la touche, jedoisretourner sa valeur au début de la première instruction if.
#define  VK_D 0x44
void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam) // параметр события типа string 
{ 
 Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);

int      y     =(int)dparam;
datetime dt    =0;
double   price =0;  
int      window=0;
int i;
int x=(int)lparam;

if (id==CHARTEVENT_CLICK)
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

if(id==CHARTEVENT_KEYDOWN) 
{ switch(int(lparam)) 
{ case VK_D:
i=rand();
}}}}
 
K_i_r_i_t_o:
Je ne peux pas implémenter la désactivation d'une partie du code pour le point avant la frappe =/ Il y a un moyen plus facile, mais il y a un problème :i doitretourner sa valeur au début de la première instruction if lorsque la touche est pressée.
if (id==CHARTEVENT_CLICK)
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);

   if(id==CHARTEVENT_KEYDOWN) 
   {
      switch(int(lparam)) 
      {
         case VK_D: i=rand();
      }
   }
}
Ce code ne sera exécuté que si la souris est cliquée. Dans ce cas, après 3 lignes de code, l'événement de pression de la touche est vérifié. Et ces 3 lignes de code sont exécutées en quelques millisecondes, et même si l'id pendant l'appel courant OnChartEvent peut changer, la chance que pendant l'exécution de 3 lignes de code, la touche soit pressée = 0%. De toute évidence, il est inutile de vérifier id, à l'intérieur d'un bloc qui est déclenché à une certaine valeur d'id, et d'y attendre une valeur différente. Tout d'abord, vérifier l'appui sur la touche, dans un bloc séparé, enregistrer dans une variable le numéro de la touche ou simplement le fait d'appuyer sur la touche désirée. Et avec cette variable, activez ou désactivez le morceau de code situé dans le bloc pour le clic de la souris.
char key = -1; //эта переменная должна быть объявлена за пределами блока OnCharEvent
if(id==CHARTEVENT_KEYDOWN)
key = lparam;

if (id==CHARTEVENT_CLICK && key == 'D')
{
   ChartXYToTimePrice(0,x,y,window,dt,price);
   ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
   ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
   i=rand();
   key = -1;
}
 
SunnYtheDreamer:
Ce code ne s'exécutera que si la souris est cliquée, avec 3 lignes de code vérifiant un événement de frappe au clavier. Et ces 3 lignes de code sont exécutées en quelques millisecondes, et même si l'id pendant l'appel en cours OnChartEvent est capable de changer, la chance que pendant ce temps, l'exécution de 3 lignes de code, la touche soit pressée = 0%. De toute évidence, il est inutile de vérifier id, à l'intérieur d'un bloc qui est déclenché à une certaine valeur d'id, et d'y attendre une valeur différente. Tout d'abord, vérifier l'appui sur la touche, dans un bloc séparé, enregistrer dans une variable le numéro de la touche ou simplement le fait d'appuyer sur la touche désirée. Et avec cette variable, activez ou désactivez le morceau de code situé dans le bloc pour le clic de la souris.

Merci beaucoup !) C'est la ligne que je cherchais if (id==CHARTEVENT_CLICK && key == 'D'), je n'ai pas pu relier deux événements, cela n'a pas fonctionné if (id==CHARTEVENT_CLICK & id==CHARTEVENT_KEYDOWN) Merci beaucoup encore)

 

Bonjour, j'ai une fonction qui calcule la taille moyenne d'une bougie à partir des n dernières bougies. parfois elle sort les valeurs suivantes : "5e-05.0". je n'en ai pas besoin, à ma grande honte je ne sais pas combien elles sont et comment les couper. NormalizeDouble() n'aide pas. S'il vous plaît, dites-moi comment calculer ces nombres par programme pour les couper.

 
pycha:

Bonjour, j'ai une fonction qui calcule la taille moyenne d'une bougie à partir des n dernières bougies. parfois elle sort les valeurs suivantes : "5e-05.0". je n'en ai pas besoin, à ma grande honte je ne sais pas combien elles sont et comment les couper. NormalizeDouble() n'aide pas. S'il vous plaît, dites-moi comment calculer ces nombres par programme pour les couper.


5e-05 (5*10 à la puissance -5) = 0,00005.
Que couper, alors :
if(val >= 0.00001)
De telles petites bougies, 5 pips, ne peuvent se produire qu'à basse latitude, sur un compte à 5 chiffres, sur de faibles échelles de temps. Si vous ne vous occupez pas de scalping, mais que la moyenne est parfois si petite pour n bougies, alors l'implémentation de la fonction doit être suspecte.
Raison: