conseiller expert - questions diverses - page 12

 
Marco vd Heijden:

Je pense que oui.

C'est légèrement différent.

La différence entre global et statique n'est ni ici ni là. Mais votre méthode de réinitialisation est bonne. Elle empêche le dépassement.
 
honest_knave:
La question du global par rapport au statique n'est ni ici ni là. Mais votre méthode de réinitialisation est bonne. Elle empêche le dépassement.

J'ai parlé trop tôt. Le vôtre déborde dans l'autre sens. Il se déclenchera sur une pression ultérieure de CTRL. Si vous cliquez sur le graphique, puis appuyez sur CTRL, il se déclenche.

 

@honest_knave- merci pour votre commentaire. J'apprécie beaucoup - mais j'ai commencé par essayer le commentaire de @Marco vd Heijden. ( J'ai lu tous vos commentaires à ce sujet. )

@Marco vd Heijden- Merci.

Mais je pense que je fais quelque chose de mal, peut-être que je ne comprends pas plus clairement. En tout cas j'ai essayé, vous pouvez trouver le code ci-dessous.
Où est mon erreur, s'il vous plaît ?

//+------------------------------------------------------------------+
//|                                                      keydown.mq4 |
//|      Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Marco vd Heijden, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

string prefix = "Custom Expert |";
string lotedit = prefix + "Edit Name";
string lotbtnplus = prefix + "Lot button Plus";
string lotbtnminus = prefix + "Lot button Minus";

double lot = 0.01, lotstep = 0.01 ;
bool ctrl_click;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
   EventSetTimer(60);

   graphicsObj();

//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
    EventKillTimer();
    ObjectsDeleteAll( 0, prefix );
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
//---
    graphicsObj();
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---

  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

    if( id == CHARTEVENT_CLICK )
    {
        if ( sparam == lotbtnplus )
        {
            ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
            lot = lot + lotstep;
            update();

            Print( " | lot plus :  ", lot );
            return;
        }

        Print( "Click" );
        ctrl_click = 1;
    }

    if( id == CHARTEVENT_KEYDOWN )
    {
        //Print(lparam);// print to identify keycode

        if( lparam == 17 )  // ctrl key
        {
            if( ctrl_click == 1 )// if mouse click
            {
                //Do Something when CTRL (keycode 17) is pressed
                if ( sparam == lotbtnplus )
                {
                    ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
                    lot = lot + ( lotstep * 10 );
                    Print( " | lot plus + Ctrl initial:  ", lot );
                    update();

                    Print( " | lot plus + Ctrl:  ", lot );
                    return;
                }
                Print( "Ctrl + Click" );
                ctrl_click = 0;  // reset
            }
        }
        ctrl_click = 0; // reset if not ctrl
    }
}

//|+--------------------------------------------------------------------------------+
//| -   Function Update                                                             |
//|+--------------------------------------------------------------------------------+
void update()
{
    //---
    ObjectSetString( 0, lotedit, OBJPROP_TEXT, DoubleToString( lot, 2 ) );
    //---
    return;
}
void graphicsObj()
{
    ObjectCreate(0, lotedit, OBJ_EDIT, 0,0,0);
    ObjectSetInteger(0, lotedit, OBJPROP_XDISTANCE, 30);
    ObjectSetInteger(0, lotedit, OBJPROP_YDISTANCE, 30);
    ObjectSetInteger(0, lotedit, OBJPROP_XSIZE, 60);
    ObjectSetInteger(0, lotedit, OBJPROP_YSIZE, 30);
    ObjectSetString(0, lotedit, OBJPROP_TEXT, DoubleToString( lot, 2 ));

    ObjectCreate( 0, lotbtnplus, OBJ_BUTTON, 0, 0, 0);
    ObjectSetString( 0, lotbtnplus, OBJPROP_TEXT, "+");
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_XDISTANCE, 100);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_YDISTANCE, 30);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_XSIZE, 70);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_YSIZE, 30);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_BACK, false);
    ObjectSetInteger( 0, lotbtnplus, OBJPROP_SELECTABLE, false);
}
 

Votre premier problème est que CHARTEVENT_CLICK n'est pas la même chose que CHARTEVENT_OBJECT_CLICK. Vous voulez attraper les clics sur un objet, pas n'importe quel clic sur le graphique.

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

//    if( id == CHARTEVENT_CLICK )
    if( id == CHARTEVENT_OBJECT_CLICK )
 
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   static bool wasCTRL=false;
   if(id==CHARTEVENT_OBJECT_CLICK && sparam == lotbtnplus)
     {
      ObjectSetInteger( 0, sparam, OBJPROP_STATE, false );
      lot+=(wasCTRL)?lotstep*10:lotstep;
      update();
      Print( " | lot plus :  ", lot );
      return;
     }
   wasCTRL=(id==CHARTEVENT_KEYDOWN && lparam==17);
}
Ceci peut vous aider. Vous constaterez peut-être qu'il ne passe à 0,1 qu'au deuxième clic de la souris, en fonction de la rapidité avec laquelle vous appuyez sur le bouton après CTRL.
 
honest_knave:
Ceci peut vous aider. Il se peut que vous trouviez qu'il ne passe à 0,1 qu'au deuxième clic de la souris, en fonction de la rapidité avec laquelle vous appuyez sur le bouton après CTRL.

#Ctrl + Bouton de la souris - Fermé

Wow, juste comme ça, incroyable énorme merci honnête !

Merci à@honest_knave et @Marco vd Heijden.

 
#SpreadSheet - Ouvert

Vendredi dernier, le'spreadsheet' a été mis à jour par la fonction OnTick (dont j'ai besoin, c'était bien pour moi).

(La plateforme MT4 a été mise à jour deux fois.) Après ces mises à jour, cette feuille de calcul ne s'actualise pas sur le graphique, j'ai vérifié tout ce qui concerne la feuille de calcul et je ne vois aucun problème.

Je dois vous informer que j'utilise également les prix Bid et Ask au-dessus de la feuille de calcul, Bid et Ask fonctionnent bien, mais pas la feuille de calcul.

J'utilise donc la fonction Label pour les objets Label - tous les objets Label fonctionnent bien sans 'Spreadsheet'. Je dois également signaler que lorsque je crée un objet Étiquette pour le tableur sans fonction, il fonctionne bien.
Ce problème commence après les mises à jour de la plateforme MT4, je ne suis pas sûr de l'origine de ce problème.

Si vous comprenez ma préoccupation, faites-moi savoir comment je peux résoudre ce problème.
Merci d'avance.

 

Avez-vous un code pour le tableur?

 
Marco vd Heijden:

Avez-vous un code pour le tableur ?

Je suis toujours en train de faire des recherches à ce sujet, et je posterai bientôt quelques codes, qui fonctionnent et qui ne fonctionnent pas.
 

Puis-je écrire 2 fonctions d'étiquette différentes ?
(par exemple : 1 pour le texte, 2 pour le texte et la taille de la police).

Raison: