Erreurs, bugs, questions - page 2741

 
Vladimir Pastushak:

MT 4 BILD 1262 Crashs terminaux


2020.05.13 18:05:09.335 Violation d'accès en écriture à 0x0335346E

2020.05.13 18:05:09.276 VR EURUSD,H4 : il reste 1 chaîne fuyante

2020.05.13 18:11:11.126 Violation d'accès en écriture à 0x033403B7

2020.05.13 18:37:13.585 Violation d'accès en écriture à 0x03093648


J'ai fait un mini code source pour reproduire le problème.

Envoyez-moi le code source par message privé et je le vérifierai.

 
Ilyas:

Le débogueur dans MT4 ne changera pas.

Nous sommes en train de revoir complètement le système de débogage et de profilage du code MQL, le nouveau système n'est pas compatible avec MT4.

Cool. Vous pouvez oublier le développement d'indicateurs sérieux pour MT4.

Merci, nous le saurons.

 
Andrey Khatimlianskii:

Indicateurs dans le flux de l'interface, tant qu'ils ne sont pas comptés, le terminal ne dessine rien. C'est pour ça que ça raccroche.

Quatre ne seront pas corrigés, très probablement.

Dans cinq indicateurs similaires fonctionnent, mais tout est normal, sans freeze.

 
MT5 (build 2419) fonctionnait avec le débogueur, est allé sur le navigateur pendant quelques minutes, puis est revenu sur MT et il était complètement vide pour une raison quelconque :
- pas de fenêtres, pas de panneaux, pas d'outils, rien...

 
MT5, comment désactiver par programme la mise à l'échelle des prix via Ctrl + Molette de la souris ?
Je crée un panneau, j'attrape programmatiquement Ctrl + Molette de la souris et je mets à l'échelle les éléments du panneau.
Cependant, le même événement déclenche la mise à l'échelle des prix et charge la légende "Waiting For Update", qui remplace complètement le panneau de manière indéfinie.

Exemple de code, ce qui est commenté est également utilisé dans le projet, mais n'affecte pas le problème décrit ci-dessus :
.
void HideChart(long achart, color BackClr){     
   //ChartSetInteger(achart, CHART_SHOW, false);
        //ChartSetInteger(achart, CHART_SHOW_OHLC, false);
        //ChartSetInteger(achart, CHART_SHOW_BID_LINE, false);
        //ChartSetInteger(achart, CHART_SHOW_ASK_LINE, false);
        //ChartSetInteger(achart, CHART_SHOW_LAST_LINE, false);
        //ChartSetInteger(achart, CHART_SHOW_PERIOD_SEP, false);
        //ChartSetInteger(achart, CHART_SHOW_GRID, false);
        //ChartSetInteger(achart, CHART_SHOW_VOLUMES, CHART_VOLUME_HIDE);
        //ChartSetInteger(achart, CHART_SHOW_OBJECT_DESCR, false);
        //ChartSetInteger(achart, CHART_SHOW_TRADE_LEVELS, false);
        //ChartSetInteger(achart, CHART_SHOW_DATE_SCALE, false);
        //ChartSetInteger(achart, CHART_SHOW_PRICE_SCALE, false);
        //ChartSetInteger(achart, CHART_FOREGROUND, false);
        //ChartSetInteger(achart, CHART_SHIFT, false);
        //ChartSetInteger(achart, CHART_MODE, CHART_LINE);

        //ChartSetInteger(achart, CHART_SCALE, 0);
        ChartSetInteger(achart, CHART_SCALEFIX, 0);
        ChartSetInteger(achart, CHART_SCALEFIX_11 , 0);
        ChartSetInteger(achart, CHART_SCALE_PT_PER_BAR, 0);
        ChartSetInteger(achart, CHART_EVENT_OBJECT_DELETE, 0);
        ChartSetInteger(achart, CHART_EVENT_OBJECT_CREATE, 0);

   	ChartSetInteger(achart, CHART_EVENT_MOUSE_WHEEL,1); 
        ChartSetInteger(achart, CHART_EVENT_MOUSE_MOVE, 0);
        ChartSetInteger(achart, CHART_MOUSE_SCROLL, 0);
        ChartSetInteger(achart, CHART_KEYBOARD_CONTROL, 0);
        ChartSetInteger(achart, CHART_QUICK_NAVIGATION, 0);
        
        //ChartSetInteger(achart, CHART_COLOR_BACKGROUND, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_FOREGROUND, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_CHART_LINE, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_ASK, BackClr);
        //ChartSetInteger(achart, CHART_COLOR_BID, BackClr);
        //ChartSetDouble(achart, CHART_FIXED_MAX, 1);
        //ChartSetDouble(achart, CHART_FIXED_MIN, 1);
        //ChartSetString(achart, CHART_COMMENT, "");
        //ChartSetInteger(achart, CHART_CROSSHAIR_TOOL, 0);
        //ChartSetInteger(achart, CHART_SHOW_ONE_CLICK, 0);
        //ChartSetInteger(achart, CHART_CONTEXT_MENU, 0);
        ChartRedraw(achart);
}

void OnInit() {
   HideChart(0, clrWhite);
} 
 

semble être un bogue ? la documentation dit qu'il est lisible, mais

Print(i," - ",ObjectGetInteger(0,name,OBJPROP_XDISTANCE)," - ",ObjectGetInteger(0,name,OBJPROP_XSIZE));

distribue

il y a du texte sur le graphique :

code complet joint

Dossiers :
 
Igor Zakharov:

Il semble qu'il s'agisse d'un bogue. La largeur de l'étiquette dans la documentation indique qu'elle est lisible, mais

La largeur n'est disponible qu'après le rendu complet de l'objet.
J'ai été confronté à ce problème récemment aussi.

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

bugs, erreurs, questions

Sergey Dzyublik, 2020.05.12 19:32

Lors de l'utilisation de OBJ_EDIT, un problème s'est posé : la nécessité de définir la taille de OBJPROP_XSIZE et OBJPROP_YSIZE de manière à ce que tout le texte tienne dans les dimensions de l'objet correspondant.

Question : comment déterminer les tailles OBJPROP_XSIZE et OBJPROP_YSIZE pour adapter le texte entier ?
J'ai envisagé deux options :
1. créer l'objet OBJ_LABLE, lire les dimensions, supprimer l'objet OBJ_LABLE.
Ne convient pas car la cotation n'est possible qu'après la création effective de l'objet et n'est pas possible lorsque l'objet se trouve dans la file d'attente ChartRedraw.

2. en utilisant TextSetFont suivi de TextGetSize.
Ne convient pas, car le résultat est radicalement différent de celui de la méthode n°1, la différence étant de 2,5 à 2,9 fois, selon la taille de la police.
La raison en est probablement un écran 4K et un DPI de 175 %.

#define  PRINT(x) ; Print(#x, ":", string(x))
          
void SetLabel(long achart, string name, int wnd, string text, color clr, int x, int y, int corn=0, int fontsize=8, string font="Tahoma")
{
   ObjectCreate(achart, name, OBJ_LABEL, wnd, 0, 0); 
   ObjectSetInteger(achart, name, OBJPROP_CORNER, corn); 
   ObjectSetString(achart, name, OBJPROP_TEXT, text); ObjectSetInteger(achart, name, OBJPROP_COLOR, clr); 
   ObjectSetInteger(achart, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(achart, name, OBJPROP_FONT, font);
   ObjectSetInteger(achart, name, OBJPROP_SELECTABLE, false); 
   ObjectSetInteger(achart, name, OBJPROP_BORDER_TYPE, 0);
   ObjectSetInteger(achart, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(achart, name, OBJPROP_YDISTANCE, y);
}

void OnStart(){     
   string obj_name = "test_obj";   
   string text = "AAAA::BBBB";
   int font_size = 7;
   string font_name = "Tahoma";
   
   SetLabel(0, obj_name, 0, text, clrWhite, 100, 100, 0, font_size, font_name);
   ChartRedraw(0);
   Sleep(1000);
   
   uint dx_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_XSIZE));
   uint dy_fixed_0 = int(ObjectGetInteger(0, obj_name, OBJPROP_YSIZE));
   ObjectDelete(0, obj_name);
   
   PRINT(dx_fixed_0);
   PRINT(dy_fixed_0);
   
   
   uint dx_fixed_1;
   uint dy_fixed_1;
   TextSetFont(font_name, -10 *  font_size);
   TextGetSize(text, dx_fixed_1, dy_fixed_1);
   
   PRINT(1.0 * dx_fixed_0 / dx_fixed_1);  	// Result: 1.0
   PRINT(1.0 * dy_fixed_0 / dy_fixed_1);  	// Result: 1.0
}  


Merci àGeess pour la solution.
Je devrais multiplier par -10 la taille du shuffle lorsque je le passe à TextSetFont.

 
Sergey Dzyublik:

La largeur n'est disponible qu'après le rendu complet de l'objet.
J'ai été confronté à ce problème récemment aussi.

Merci ! La solution est jointe.


Dossiers :
 
Quels sont les drapeaux et les pièges possibles si un programme MQL doit ajouter quelque chose au fichier (disque RAM) en permanence, et que l'autre (et un autre terminal) doit lire toutes ces données ajoutées ?
 
fxsaber:
Quels sont les drapeaux et les pièges qui peuvent exister si un programme MQL doit ajouter quelque chose au fichier (disque RAM) en permanence, et si les autres (et un autre terminal) doivent lire toutes ces données ajoutées ?

La sécurité des données doit être assurée, mais je pense qu'il y a au moins deux problèmes :

- pas de synchronisation garantie pendant l'accès simultané, c'est-à-dire qu'il est possible de relire des données déjà lues et d'empêcher en même temps l'écriture de nouvelles données - collisions

- il n'existe aucun moyen de détecter et de contrôler une telle situation

Les solutions habituelles - sémaphores ou écrire son propre gestionnaire d'écriture.

ZS : il semble qu'il y ait une possibilité de mettre en mémoire SQLite intégré, au moins là pour contrôler l'état de la base de données peut