Diskussion zum Artikel "DoEasy. Steuerung (Teil 31): Scrollen des Inhalts des ScrollBar-Steuerelements" - Seite 3

 
#include <DoEasy\Engine.mqh>

CEngine        engine;

....

   int h=37,w=100;
   string name=prefix+"EDIT_BUY_LIMIT";
   x=309;
   y=124;
   if(!EditCreate(name,x,y,w-16,h,"",clrBlack,clrWhite))
     {
      Alert(TextByLanguage("Element bearbeiten konnte nicht erstellt werden.""","Could not create Edit element \""),prefix+"EDIT_BUY_LIMIT"+", error: "+(string)GetLastError());
      return false;
     }


//+------------------------------------------------------------------+
//| Erzeugt Bearbeiten|
//+------------------------------------------------------------------+
bool EditCreate(const string name,
                const int x,
                const int y,
                const int w,
                const int h,
                const string text,
                const color clr_txt,
                const color clr_bg,
                const string font="Calibri",
                const int font_size=11)
  {
   if(!engine.CreateEditField(0,name,0,false,x,y,w,h,font_size,CORNER_LEFT_LOWER,ALIGN_CENTER,false))
     {
      Print(DFUN,TextByLanguage("Element bearbeiten kann nicht erstellt werden! Fehlercode="","Could not Edit element! Error code="),GetLastError()); 
      return false;   // --- gibt hier false zurück
     }
 }
 
Und wie erstellt man eigentlich einen Edit, indem man ihn mit einem Panel verknüpft?
 
Wow, ich habe das Panel gezeichnet, ich habe so viel Zeit investiert. Und es stellt sich heraus, dass man kein Edit-Element erstellen kann...
 
leonerd #:
Wow, ich habe das Panel gezeichnet, ich habe so viel Zeit investiert. Und es stellt sich heraus, dass man kein Edit-Element erstellen kann...
Bitte zeigen Sie mir Ihr vollständig kompilierbares Beispiel.
 
Artyom Trishkin #:
Zeigen Sie mir Ihr vollständig kompilierbares Beispiel, bitte.

Nun, was gibt es zu kompilieren, wenn es kein solches Objekt gibt.

GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON ist da und viele andere, aber es gibt kein einfaches Edit. Durch die Engine-Methode CreateEditField() ich am Ende ein Feld zu erstellen, aber sagen Sie mir, wie man es an das Panel zu binden?

CPanel *pnl=engine.CreateWFPanel("WFPanel",50,50,280,240,array_clr,200,true,true,false,-1,FRAME_STYLE_BEVEL,true,false);
if(pnl!=NULL)
  {
   if(!pnl.CreateNewElement(GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON,InpRbnShiftX+dist_rbtn_x*i,InpRbnShiftY,50,20,clrNONE,255,true,false))
     ..
  }

 
leonerd #:

Was also soll man kompilieren, wenn es kein solches Objekt gibt?

Es gibt GRAPH_ELEMENT_TYPE_WF_RADIOBUTTON und viele andere, aber es gibt kein einfaches Edit. Durch die Engine-Methode CreateEditField() ich am Ende ein Feld zu erstellen, aber sagen Sie mir, wie man es an das Panel zu binden?

Die Bibliothek befindet sich noch in der Entwicklung. Die grafischen Elemente sind weniger als halb fertig. Es gibt noch kein Eingabefeld. Es gibt nur ein Standardfeld, das Sie zu erstellen versuchen.

Wenn das Objekt "Eingabefeld" verfügbar sein wird, wird alles funktionieren. Es ist nicht praktikabel, jetzt ein Standardobjekt an das Formular zu binden - es wird nicht am Ereignismodell des Formularobjekts teilnehmen.

 

Gut.

Außerdem funktioniert diese Methode nicht richtig

CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket);

Sie liefert mir nur die letzte Bestellung. Aus irgendeinem Grund werden sie beim Filtern der Aufträge als gelöschte ausstehende Aufträge behandelt.

Ich gebe Ihnen einfach ein paar Informationen. Die erste Order auf der Position wurde mit einem Limiter (SELL STOP) eröffnet, es gab mehrere Aktualisierungen der Position durch Änderung von SL/TP. Dann habe ich ein Ereignis der Schließung auf SL gefangen. Ich versuche, die erste Order der geschlossenen Position zu finden, aber die obige Methode funktioniert nicht richtig.

CEngine engine

....

    if(event.TypeEvent()==TRADE_EVENT_POSITION_CLOSED_BY_SL)
        {
         
         ulong prev_pos_ticket=event.TicketPositionPrevious();  // hier ist das richtige Positionsticket 
         CArrayObj* pos_orders=engine.GetListAllOrdersByPosID(prev_pos_ticket); // hier im empfangenen Array nur die letzte Reihenfolge der Position (sl)
        }
  
 
leonerd geschlossenen Position zu finden, aber die obige Methode funktioniert nicht richtig.

Positionsticket und Positions-ID sind zwei völlig verschiedene Dinge. Sie müssen nach der Positions-ID suchen, nicht nach dem Ticket, das sich ständig ändert und dem Ticket der Order entspricht, die den Handel ausgelöst hat, der die Position verändert hat.

Sie sollten Artikel oder Hilfe über das Auftragssystem in MetaTrader 5.... lesen.

 

Bei ClosePosition() wird das Filling überhaupt nicht ausgefüllt

In Trading.mqh trade_obj.ClosePosition(ticket,comment,deviation)
trade_obj hat die erforderliche Ausfüllung, und wenn man in this.m_request.type_filling geht, wird die Methode standardmäßig FOK

 
leonerd ,comment,deviation)
hat trade_obj die erforderliche Ausfüllung, und wenn man in this.m_request.type_filling geht, wird die Methode zum Standard-FOK
Ich werde es mir ansehen. Danke!