expert advisor - verschiedene Fragen - Seite 12

 
Marco vd Heijden:

Ich denke schon.

Es ist aber etwas anders.

Der Unterschied zwischen global und statisch ist weder hier noch dort. Aber Ihre Methode des Zurücksetzens ist gut. Sie verhindert den Überlauf.
 
honest_knave:
Der Unterschied zwischen global und statisch ist weder hier noch dort. Aber Ihre Methode zum Zurücksetzen ist gut. Sie verhindert den Überlauf.

Ich habe zu früh gesprochen. Ihrer überläuft in die andere Richtung. Er wird bei einem späteren Drücken von CTRL ausgelöst. Wenn Sie auf das Diagramm klicken und dann CTRL drücken, wird es ausgelöst.

 

@honest_knave- danke für Ihren Kommentar. Sehr schätzen, dass - aber ich begann versuchen, zuerst @Marco vd Heijden Kommentar. ( Ich habe alle Ihre Kommentare dazu gelesen. )

@Marco vd Heijden- Danke Mann.

Aber ich glaube, ich mache etwas falsch, vielleicht verstehe ich nicht mehr klar. Jedenfalls habe ich es versucht, Sie können es unten Code finden.
Wo ist mein Fehler, bitte?

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

Ihr erstes Problem ist, dass CHARTEVENT_CLICK nicht dasselbe ist wie CHARTEVENT_OBJECT_CLICK. Sie wollen Klicks auf ein Objekt abfangen, nicht nur irgendeinen Klick auf das Diagramm.

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);
}
Das könnte helfen. Es kann sein, dass er erst beim zweiten Mausklick auf 0,1 geht, je nachdem, wie schnell Sie die Taste nach CTRL drücken.
 
honest_knave:
Dies könnte helfen. Es kann sein, dass es erst beim zweiten Mausklick auf 0,1 geht, je nachdem, wie schnell man die Taste nach CTRL drückt.

#Strg + Maustaste - Geschlossen

Wow, genau wie es, erstaunlich großen Dank ehrlich!

Besonderen Dank an@honest_knave und @Marco vd Heijden

 
#SpreadSheet - Offen

Letzten Freitag wurde'Spreadsheet' durch die OnTick Funktion aktualisiert ( welche ich brauche, es war gut für mich ).

(MT4-Plattform zweimal aktualisiert.) Nach dieser Updates dieses Spreadsheet nicht auf dem Chart zu aktualisieren, habe ich alles über Spreadsheet überprüft ich sehe kein Problem.

Ich muss darauf hinweisen, dass ich auch Bid und Ask Preise über Spreadsheet verwende, Bid und Ask funktionieren gut, aber Spreadsheet nicht.

Also benutze ich die Label-Funktion für Label-Objekte - jedes Label-Objekt funktioniert auch ohne "Spreadsheet". Außerdem muss ich darauf hinweisen, dass, wenn ich ein Label-Objekt für ein Spreadsheet ohne Funktion erstelle, es gut funktioniert.
Das Problem beginnt nach MT4 Plattform-Upgrades, ich bin nicht sicher, woher das Problem kommt.

Wenn Sie mein Anliegen verstehen, lassen Sie mich wissen, wie ich dieses Problem lösen kann.
Vielen Dank im Voraus.

 

Hatten Sie einen Code für eine Tabellenkalkulation?

 
Marco vd Heijden:

Hatten Sie einen Code für eine Tabellenkalkulation?

Ich bin immer noch die Forschung über das, auch ich werde einige der Code von ihm, die funktioniert, die nicht ist, bald posten.
 

Kann ich 2 verschiedene Etikettenfunktionen schreiben?
(z. B.: 1 für Text, 2 für Text und Schriftgröße).