Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 740

 
Taras Slobodyanik:

Initialisierung von Variablen in OnInit durchführen (einschließlich Neuzeichnen von Objekten)


Erklären Sie, worum es hier geht.

Ich habe es zu OnInit hinzugefügt, nachdem ich ein Etikett erstellt habe

    ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y);
    ChartRedraw();


Das Ergebnis ist jedoch das gleiche.

 
psyman:


Erklären Sie, worum es hier geht.

Ich habe es zu OnInit hinzugefügt, nachdem ich den Tag erstellt habe


aber das Ergebnis ist das gleiche.

Ich muss den Code sehen, was da ist...

ps. der obige Code funktioniert gut (ich sehe keine Pannen)
(https://www.mql5.com/ru/forum/160683/page739#comment_10290585)


oops. obwohl ich die Variable Bid durch Bid0 ersetzt habe

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2019.01.17
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Guten Tag, wie schreibe ich den Auftrag, der eröffnet werden soll, wenn der Kurs einen Wert erreicht hat?
 
Ivan Rozhkov:
Guten Tag, wie schreibe ich den Auftrag, der eröffnet werden soll, wenn der Kurs einen Wert erreicht hat?
if ((prev_bid>ma && curr_bid<=ma) || (prev_bid<ma && curr_bid>=ma))
   //открывается ордер
 
Taras Slobodyanik:

Ich muss mir den Code ansehen, um zu sehen, was dort steht...

ps. Der obige Code funktioniert einwandfrei (keine Störungen)
(https://www.mql5.com/ru/forum/160683/page739#comment_10290585)


oops. obwohl ich die Variable Bid durch Bid0 ersetzt habe

Ich habe vergessen, hinzuzufügen, dass ich dies in der 5. In MT4 bewegt sich der vertikale Marker schnell an die richtige Stelle, wenn Sie den Chart öffnen, ohne auf einen Tick zu warten oder die Maus zu bewegen. Ein paar Mal gab es Probleme mit der horizontalen Verschiebung, die nur durch Neukompilierung des Indikators behoben werden konnten.

 
psyman:


Ausprobiert, man muss die Maus bewegen, um die Markierung zurückzubekommen. Es ist die gleiche Krücke, nur in einer anderen Hand :-)

Und der Wechsel zwischen Diagrammen beiCHARTEVENT_CHART_CHANGE ist kein Ereignis.

Fällt jemandem eine Möglichkeit ein, diese Anomalie zu überwinden?


Print zeigt mir eine Meldung an, wenn ich ein Chart-Fenster umschalte, sowohl vorwärts als auch rückwärts (ich arbeite mit MT4, aber es steht nicht in den MT4-Dokumenten, dass das Umschalten von Charts alsCHARTEVENT_CHART_CHANGE-Ereignis erfasst werden kann)

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
  if(id==CHARTEVENT_CHART_CHANGE) Print("graph");
}

Aber ja, es ist immer noch eine Krückenmethode. Wir müssen herausfinden, warum die Y-Koordinate beim Wechsel zu einem anderen Diagramm anders ausfällt. Aber wenn wir uns den Code ansehen, können wir feststellen, dassChartTimePriceToXY aus irgendeinem Grund andere Ergebnisse liefert.

 
psyman:

Ich habe vergessen, hinzuzufügen, dass ich dies in der 5. In MT4 bewegt sich der vertikale Marker wirklich schnell an die richtige Stelle, wenn der Chart geöffnet wird, ohne dass man auf einen Tick warten oder die Maus bewegen muss. Ein paar Mal gab es Probleme mit der horizontalen Verschiebung, die nur durch Neukompilierung des Indikators behoben werden konnten.

Nun, in Five gibt es eine Menge "Features" - von der Warteschlange auf dem Diagramm bis zur Erstellung von Balken aus den Minuten und dem Auslösen des vorherigen Deinits nach dem aktuellen)

Sie müssen also die Balken/Grafiken/Objekte überprüfen, um festzustellen, an welchem Punkt ein Fehler auftritt, und diesen korrigieren.

 
Taras Slobodyanik:


Im Allgemeinen müssen Sie die Balken/Grafiken/Objekte überprüfen, um festzustellen, an welcher Stelle ein Fehler auftritt, und diesen beheben.


Wie kann man das tun, wo soll man anfangen?

 
psyman:


Wie macht man das, wo fängt man an?

überall drucken, d.h. wir drucken das Gebot (das aktuelle Datum ist auch möglich) in oninit und dann in der Berechnung...
Ich vermute, dass sich die Geschichte nicht sofort aufbaut und die Balken erst später erscheinen.

 
Taras Slobodyanik:

überall ausdrucken, d.h. bei oninit das Gebot ausdrucken (man kann auch das aktuelle Datum ausdrucken) und dann auch beim Berechnen...
Ich telepathisiere, dass diese Geschichte keine Zeit hat, sich sofort aufzubauen und die Balken später erscheinen

Für den nächsten Code, eine Geschichte in Bildern:

//+------------------------------------------------------------------+
//|                                              !_clr_indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window


string objname="Bid";
input color Bid_color = clrCrimson;

int OnInit()
  {

int x,y;
double Bid0 = SymbolInfoDouble(Symbol(), SYMBOL_BID);
int width = (int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0);  //ширина графика



        Print("1 Bid0 = ", Bid0,  " x = ", x, " y = ", y," TimeCurrent()=", TimeCurrent() );

   ObjectCreate(0, objname, OBJ_LABEL,0, 0, 0);
   
   ObjectSetString(0, objname, OBJPROP_TEXT, DoubleToString(Bid0, _Digits-1));
        ObjectSetInteger(0, objname, OBJPROP_FONTSIZE, 12);
        ObjectSetInteger(0, objname, OBJPROP_COLOR, Bid_color);
        ObjectSetString(0, objname, OBJPROP_FONT, "Verdana");

        ChartTimePriceToXY(0, 0, TimeCurrent(), Bid0, x, y);
        Print("2 Bid0 = ", Bid0,  " x = ", x, " y = ", y," TimeCurrent()=", TimeCurrent() );
         
        ObjectSetInteger(0, objname, OBJPROP_XDISTANCE, width-60);

   ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y);

   

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

return(rates_total);

  }

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

int x2,y2;
double Bid2 = SymbolInfoDouble(Symbol(), SYMBOL_BID);
double  cprice;
datetime ctime;
int      cwindow=0;



if(id==CHARTEVENT_CHART_CHANGE) 
   {
   



           ChartTimePriceToXY(0, 0, TimeCurrent(), Bid2, x2, y2); 
      
      Print("5 Bid2 = ", Bid2,  " x2 = ", x2, " y2 = ", y2," TimeCurrent2()=", TimeCurrent() );
      
        ObjectSetInteger(0, objname, OBJPROP_YDISTANCE, y2);
   
   ChartXYToTimePrice(0,x2,x2,cwindow, ctime, cprice);
   

   }



  }



void OnDeinit(const int reason) 
   { 

      ObjectDelete(0,objname);
   } 
 
 


Trennen Sie das Netzwerk und fügen Sie einen Indikator hinzu

Ich wechsle zur nächsten Tabelle


y2 geänderter Wert, ich gehe zurück


y2 hat seinen Wert zurückgegeben, aber die Markierung wird um den Wert "gone" gezählt! Ich drehe das Mausrad.

Die Markierung ist wieder an ihrem Platz!