asesor experto - preguntas varias - página 12

 
Marco vd Heijden:

Supongo que sí.

Sin embargo, es ligeramente diferente.

Lo de global versus estático no es ni aquí ni allá. Pero su método de reinicio es bueno. Evita el rebasamiento.
 
honest_knave:
Lo de global contra estático no es ni aquí ni allá. Pero tu método de reinicio es bueno. Evita la sobrecarga.

Hablé demasiado pronto. El tuyo se sobrepasa en el otro sentido. Se dispara al pulsar CTRL después. Si haces clic en el gráfico y luego presionas CTRL se dispara.

 

@honest_knave- gracias por su comentario. Aprecio mucho que - pero empecé a tratar primero @Marco vd Heijden comentario. ( He leído todos sus comentarios al respecto. )

@Marco vd Heijden- Gracias hombre.

Pero creo que estoy haciendo algo mal, tal vez no entiendo más claramente. De todos modos he intentado, se puede encontrar por debajo de código.
¿Dónde está mi error, por favor?

//+------------------------------------------------------------------+
//|                                                      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);
}
 

Su primer problema es que CHARTEVENT_CLICK no es lo mismo que CHARTEVENT_OBJECT_CLICK. Usted quiere capturar los clics en un objeto, no cualquier clic en el gráfico.

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);
}
Esto puede ayudar. Es posible que descubra que sólo va a 0,1 en el segundo clic del ratón, dependiendo de la rapidez con la que pulse el botón después de CTRL.
 
honest_knave:
Esto puede ayudar. Usted puede encontrar que sólo va a 0,1 en el segundo clic del ratón, dependiendo de la rapidez con que se presiona el botón después de CTRL.

#Ctrl + Botón del ratón - Cerrado

¡Wow, al igual que, increíble enorme gracias honesto!

Gracias especialmente a@honest_knave y @Marco vd Heijden

 
#SpreadSheet - Abierto

El último viernes'Spreadsheet' fue actualizado por la función OnTick ( que necesito, fue bueno para mí ).

( La plataforma MT4 se actualizó dos veces. ) Después de que las actualizaciones de esta hoja de cálculo no se actualiza en el gráfico, he comprobado todo acerca de la hoja de cálculo no veo ningún problema.

Tengo que informar que también uso los precios Bid y Ask por encima de la hoja de cálculo, Bid y Ask funciona bien, pero la hoja de cálculo no.

Así que uso la función de etiqueta para los objetos de etiqueta - todos los objetos de etiqueta funcionan bien sin la hoja de cálculo. También tengo que informar que cuando creo un objeto Label para la hoja de cálculo sin la función, funciona bien.
Este problema comienza después de las actualizaciones de la plataforma MT4, no estoy seguro de dónde viene este problema.

Si entienden mi preocupación, háganme saber cómo puedo resolver este problema.
Gracias de antemano.

 

¿Tienes algún código sobre la hoja de cálculo?

 
Marco vd Heijden:

¿Tienes algún código sobre la hoja de cálculo?

Todavía estoy investigando sobre eso, también voy a publicar algunos de los códigos de la misma, que está trabajando que no es, pronto.
 

¿Puedo escribir 2 funciones de etiqueta diferentes?
( por ejemplo: 1 para el texto, 2 para el texto y el tamaño de la fuente. )