Download MetaTrader 5

expert advisor - miscellaneous questions - page 12

honest_knave
Moderator
2295
honest_knave  
Marco vd Heijden:

I guess so.

It's slightly different tho.

The global versus static is neither here nor there. But your method of reset is good. It prevents the overrun.
honest_knave
Moderator
2295
honest_knave  
honest_knave:
The global versus static is neither here nor there. But your method of reset is good. It prevents the overrun.

I spoke too soon. Yours overruns the other way. It will trigger on a later CTRL press. If you click on the chart, then press CTRL it fires.

Max Enrik
988
Max Enrik  

@honest_knave - thanks for your comment. Much appreciate that - but I started try first @Marco vd Heijden comment. ( I read all your comments about that. )

@Marco vd Heijden - Thanks man.

But I think I am doing something wrong, maybe I do not understand more clearly. Anyway I tried, you can find it below code.
Where is my mistake, please?

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

Your first problem is that CHARTEVENT_CLICK is not the same as CHARTEVENT_OBJECT_CLICK. You want to catch clicks on an object, not just any click on the chart.

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

//    if( id == CHARTEVENT_CLICK )
    if( id == CHARTEVENT_OBJECT_CLICK )
honest_knave
Moderator
2295
honest_knave  
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);
}
This may help. You might find that it only goes to 0.1 on the second click of the mouse, depending on how quickly you press the button after CTRL.
Max Enrik
988
Max Enrik  
honest_knave:
This may help. You might find that it only goes to 0.1 on the second click of the mouse, depending on how quickly you press the button after CTRL.

#Ctrl + Mouse Button - Closed

Wow, just like it, amazing huge thanks honest!

Special thanks to @honest_knave and @Marco vd Heijden

Max Enrik
988
Max Enrik  
#SpreadSheet - Open

Latest Friday 'Spreadsheet' was updates by OnTick function ( which one I need, it was good for me ).

( MT4 platform updated twice. ) After that updates this spreadsheet does not update on the chart, I checked out everything about spreadsheet I do not see any problem.

I need to inform I also use Bid and Ask prices above spreadsheet, Bid and Ask works good, but spreadsheet does not.

So I use Label Function for Label Objects - every Label objects works good without 'Spreadsheet'. Also I need to inform when I create Label object for spreadsheet without function, it works good.
That problem starts after MT4 Platform upgrades, I am not sure where is that problem comes.

If you understand my concern, let me know how can I solve this issue.
Thanks in advance.

Marco vd Heijden
Moderator
5801
Marco vd Heijden  

Did you have some code about spreadsheet ?

Max Enrik
988
Max Enrik  
Marco vd Heijden:

Did you have some code about spreadsheet ?

I am still researching about that, also I will post some of code from it, which is working which is not, soon.
Max Enrik
988
Max Enrik  

Can I write 2 different Label Function?
( e.g: 1 for text, 2 for text and font size. )