échec de l'initialisation globale !!!!!!! - page 5

 
deysmacro:
Comment() n'a pas d'effet sur le graphique, la plupart du temps.

  if(ObjectFind(Symbol()+"Lot_Size_Label")==0)
   {         
  int x_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_XDISTANCE);
  int y_check=ObjectGet(Symbol()+"Lot_Size_Label",OBJPROP_YDISTANCE);
  Comment(x_check+ " , "+y_check); 
   }

Comment() pour vérifier les données des coordonnées.

Elles devraient changer lorsque l'étiquette va à droite, mais ce n'est pas le cas.

Autrement dit, les coordonnées sont ce qu'elles devraient être.

L'étiquette disparaît à droite.

 

Les coordonnées sont XDISTANCE = 225 ; YDISTANCE = 27 ; CORNER = 3 ;

Premièrement, en chargeant l'indi sur le graphique, l'étiquette est en place :

Deuxièmement, en fermant MT4 et en le redémarrant, l'étiquette va à droite :

Troisièmement, après avoir déplacé les Tf, l'étiquette revient en arrière :

C'est quelque chose à voir avec les ancres liées aux calculs de coins et doit être un bug dans B646.

 
Qu'est-ce que cela a à voir avec l'échec de l'initialisation globale ?
 
SDC:
Qu'est-ce que tout cela a à voir avec l'échec de l'initialisation globale ?

Ce B646 est sérieusement bogué !
 
Dadas:


Merci, j'avais le même problème avec les objets qui n'étaient pas supprimés lors de la désinitialisation.

J'étais en train de développer un indi, et j'ai obtenu ces résultats étranges, puis j'ai vu sur la liste des objets, ils étaient toujours là.

J'ai contourné cela, probablement de la manière la plus simple, en mettant ObjectDelete() dans le start().

Oui, en remplaçant init() par OnInit() et deinit() par OnDeinit(), les étiquettes sont revenues à la normale ! Merci !

Puis après un certain temps, ça n'a pas marché ! !! Ils font toujours la même danse.


De rien, Dadas. Je n'utiliserais pas ObjectDelete() dans la méthode de démarrage, cependant. C'est mieux de le faire dans OnDeInit(). La raison est la suivante : si vous mettez le code dans OnStart() ou OnCalculate(), il sera exécuté à chaque fois qu'un tick arrive. C'est mauvais pour deux raisons : 1) cela ajoute beaucoup d'opérations qui utilisent du temps que vous ne pouvez pas vous permettre de perdre dans une application en temps réel et 2) cela n'a pas de sens de le faire dans la plupart des situations - en général, cela n'a d'importance que lorsqu'un graphique est désinitialisé. Vous ne devriez le faire dans les méthodes de "démarrage" que si un changement de prix affecte vos objets d'une manière ou d'une autre. Par exemple, considérez ceci (qui fait partie d'une application que j'ai l'intention de vendre, mais partager ceci est cool :-) ).

// If no trade is progress, there is no Position Value to display
      if (ObjectFind("PositionValue") > 0)
                ObjectDelete("PositionValue");
                
      if (ObjectFind("PipsProfitLoss") > 0)
                ObjectDelete("PipsProfitLoss");
                
      if (ObjectFind("CurrentStop") > 0)
                ObjectDelete("CurrentStop");
                
      if (ObjectFind("PipsLockedIn") > 0)
                ObjectDelete("PipsLockedIn");
                
      if (ObjectFind("ProfitLockedIn") > 0)
                ObjectDelete("ProfitLockedIn");
                
      if (GlobalVariableCheck(CurrentPairPercentageRisk))
         GlobalVariableDel(CurrentPairPercentageRisk);

Ce code attrape les objets qui ont été laissés sur place depuis une transaction fermée, s'ils existent.

Au fait - ne faites PAS cela :

string AcctCurrency = AccountCurrency();
       
      if (AcctCurrency == "")
          return(rates_total);

Vous avez mal compris l'intention du code. Il est conçu pour NE PAS exécuter l'indie avant que le serveur ne se soit "stabilisé". C'est pourquoi je renvoie 0. De cette façon, le code indie ne s'exécutera pas tant que toutes les informations dont il a besoin ne sont pas disponibles. Honnêtement, je n'ai pas encore travaillé avec OnCalculate() car je n'en ai pas eu besoin, mais je peux dire que ce que vous faites est une invitation au désastre. Vous ne dites pas à votre programme "N'exécutez pas ce code tant que vous n'avez pas de données valides", vous vous contentez de jeter des choses au vent et d'espérer le meilleur. Pour vous dire la vérité, je ne sais pas ce que votre code ferait s'il ne recevait pas d'informations fiables du serveur. Après une quantité considérable de lecture, leur nouvelle méthode OnCalculate() n'a aucun sens pour moi. Il me semble qu'elle calcule et transmet inutilement à une charge des informations que vous feriez vous-même si vous en aviez besoin et que vous vous épargnez le temps de calcul en ne vous occupant pas de ce dont vous n'avez pas besoin. Je ne suis pas sûr de ce qu'ils essaient d'accomplir avec cela.

Bon codage !

 
ProfessorMetal:


De rien, Dadas. Je n'utiliserais pas ObjectDelete() dans la méthode de démarrage, cependant. C'est mieux de le faire dans OnDeInit(). La raison est la suivante : si vous mettez le code dans OnStart() ou OnCalculate(), il sera exécuté à chaque fois qu'un tick arrive. C'est mauvais pour deux raisons : 1) cela ajoute beaucoup d'opérations qui utilisent du temps que vous ne pouvez pas vous permettre de perdre dans une application en temps réel et 2) cela n'a pas de sens de le faire dans la plupart des situations - généralement, cela n'a d'importance que lorsqu'un graphique est désinitialisé. Vous ne devriez le faire dans les méthodes de "démarrage" que si un changement de prix affecte vos objets d'une manière ou d'une autre. Par exemple, considérez ceci (qui fait partie d'une application que j'ai l'intention de vendre, mais partager ceci est cool :-) ).

Ce code permet de capturer les objets qui ont été laissés de côté lors d'une transaction fermée, s'ils existent.

Au fait - ne faites PAS cela :

Vous avez mal compris l'intention du code. Il est conçu pour NE PAS exécuter l'indie avant que le serveur ne se soit "stabilisé". C'est pourquoi je renvoie 0. De cette façon, le code indie ne s'exécutera pas tant que toutes les informations dont il a besoin ne sont pas disponibles. Honnêtement, je n'ai pas encore travaillé avec OnCalculate() car je n'en ai pas eu besoin, mais je peux dire que ce que vous faites est une invitation au désastre. Vous ne dites pas à votre programme "N'exécutez pas ce code tant que vous n'avez pas de données valides", vous vous contentez de jeter des choses au vent et d'espérer le meilleur. Pour vous dire la vérité, je ne sais pas ce que votre code ferait s'il ne recevait pas d'informations fiables du serveur. Après une quantité considérable de lecture, leur nouvelle méthode OnCalculate() n'a aucun sens pour moi. Il me semble qu'elle calcule et transmet inutilement à une charge des informations que vous feriez vous-même si vous en aviez besoin et que vous vous épargnez le temps de calcul en ne vous occupant pas de ce dont vous n'avez pas besoin. Je ne suis pas sûr de ce qu'ils essaient d'accomplir avec cela.

Bon codage !


Merci encore !

J'ai trouvé la réponse au problème des étiquettes flottantes.

Il semble que maintenant nous devons lier l'ancre d'objet dans le code lui-même :

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

Donc, je dois ajouter quelque chose comme ce qui suit :

if(Corner==0) Anchor=ANCHOR_LEFT;
if(Corner==1) Anchor=ANCHOR_RIGHT;
if(Corner==2) Anchor=ANCHOR_LEFT;
if(Corner==3) Anchor=ANCHOR_RIGHT; 

et ensuite utiliser une autre ligne pour fixer l'objet :

    ObjectSet(objname,OBJPROP_ANCHOR,Anchor);

La vie ne devient définitivement pas plus facile !

Et puis cela n'aide pas, après tout ! !!

BTW. Je vais vous dire ce qu'ils essaient d'accomplir :

Ils veulent empêcher autant de gens que possible de jouer avec les codes.

Il faut que ce soit aussi commercial que possible.

Jusqu'à récemment, presque tout le monde était capable de jouer avec le simple mql4.

Maintenant, l'objectif est de tout commercialiser !

 
Dadas:

Ce B646 est sérieusement bogué !
C'est possible, mais l'échec de l'initialisation globale est une erreur spécifique sans rapport avec cette discussion sur les points d'ancrage des objets.
 
ProfessorMetal:


leur nouvelle méthode OnCalculate() n'a aucun sens pour moi. il me semble qu'elle calcule et transmet inutilement une charge d'informations que vous feriez vous-même si vous en aviez besoin et que vous vous épargnez le temps de calcul en ne vous occupant pas de ce dont vous n'avez pas besoin. Je ne suis pas sûr de ce qu'ils essaient d'accomplir avec cela.

Bon codage !

OnCalculate fournit le résultat du calcul du nombre de barres qui ont déjà été traitées par l'indicateur. Il remplace l'ancienne fonction IndicatorCounted. Elle est également compatible avec mql5 car les tableaux de séries lui sont transmis par référence, au lieu de l'ancienne méthode mql4 qui utilisait les tableaux de séries globaux. Du point de vue du codage, il y a très peu de différence.

 

Encore une fois, vous êtes le bienvenu, Dadas. J'avais oublié d'utiliser les propriétés ANCHOR, même si je m'en sers dans certains de mes travaux.

SDC, merci pour l'info. La documentation ne précise pas vraiment son but. Je pense que le sens s'est perdu dans la traduction du russe à l'anglais. Maintenant, cela a plus de sens. Je suppose qu'il n'est pas destiné à être utilisé à la place de OnStart() mais plutôt à la place de IndicatorCounted(). Ce serait un bon ajout à la documentation de fournir un exemple qui montre une sorte de "avant" et "après" démontrant le remplacement de IndicatorCounted() par OnCalculate(). Je vais devoir revoir la documentation à la lumière de votre explication et voir comment les pièces s'assemblent. Merci encore.

Prof.

 

Vous utilisez int OnCalculate() à la place de int start(). Il s'exécute à chaque tick comme start(). Un avant et un après ressembleraient à ceci,

int start()
  {
   int i=0, limit=0;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) return(-1);
//----
   limit = Bars-counted_bars-1;
   for (i = limit; i >= 0; i--)
   {
//---- indicator calculations
   }
   return(0);
  }

//--------------------------------------------------
//--------------------------------------------------

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int i=0, limit=0;
//--- check for possible errors
   if(prev_calculated < 0) return(-1);
//---
   limit = rates_total-prev_calculated;
   for(i = limit; i >= 0; i--)
   {
//--- indicator calculations
   }
   return(rates_total);
  }

Les paramètres formels de OnCalculate le rendent plus autonome, le codeur n'a pas besoin d'appeler toutes sortes de globales, ce qui apparemment dans les cercles oop est un mauvais codeur, une tape sur les doigts. En pratique, il n'y a pas vraiment de différence entre les deux. De plus, OnCalculate est le même que mql5, vous avez donc la possibilité d'écrire un code compatible.

Raison: