Und noch1x: GetPositionProperties - Seite 2

Einloggen oder registrieren, um einen Kommentar zu schreiben
Carl Schreiber
Moderator
9111
Carl Schreiber  

Schau Dir doch einmal die Beispiel in der Doc an:

https://www.mql5.com/de/docs/trading/ordersend

https://www.mql5.com/de/docs/constants/structures/mqltraderequest

https://www.mql5.com/de/docs/constants/structures/mqltraderesult

Außerdem entsteht hier eine sehr interessante Artikelreihe über das Management von Aufträgen, Positionen Pending-Ordrs und Deals.

Hier ist der vorläufig letzte: https://www.mql5.com/de/articles/7438

Schau dort hinein, wie man das dort programmiert wurde bzw. Du könntest den Code auch in Deinen EA einbinden und verwenden!

Dokumentation zu MQL5: Handelsfunktionen / OrderSend
Dokumentation zu MQL5: Handelsfunktionen / OrderSend
  • www.mql5.com
[in,out] Pointer auf eine Struktur vom Typ MqlTradeResult, die das Ergebnis einer Handelsoperation beschreibt, wenn diese erfolgreich durchgeführt wurde (wenn true zurückgegeben wurde). Eine Handelsanfrage durchläuft mehrere Stufen der Prüfungen auf dem Handelsserver. Zunächst wird überprüft, ob alle benötigten Felder des Parameters korrekt...
lindomatic
200
lindomatic  
Carl Schreiber:

Schau Dir doch einmal die Beispiel in der Doc an:

https://www.mql5.com/de/docs/trading/ordersend

https://www.mql5.com/de/docs/constants/structures/mqltraderequest

https://www.mql5.com/de/docs/constants/structures/mqltraderesult

Außerdem entsteht hier eine sehr interessante Artikelreihe über das Management von Aufträgen, Positionen Pending-Ordrs und Deals.

Hier ist der vorläufig letzte: https://www.mql5.com/de/articles/7438

Schau dort hinein, wie man das dort programmiert wurde bzw. Du könntest den Code auch in Deinen EA einbinden und verwenden!

Mach ich Carl, die Tage.. danke Dir

Thorsten Fischer
342
Thorsten Fischer  
lindomatic:

Hallo Thorsten =)

der Code kommt ja nur bis PositionSelect, wenn glSellPlaced == true gesetzt ist und das wird wiederum direkt nach dem Öffnen einer Position gesetzt;
vorausgesetzt, dass das, was oben mit der request.action geschieht, eine Position erzeugt? Es ist ja zunächst nur ein request und noch keine Position, richtig?
Order und Deal-Nummern sind direkt da, aber damit habe ich ja noch keine Position?
Allerdings wird direkt eine geschlossen, immer mit dem Spread als Verlust; sie wird direkt geschlossen, weil durch die 0-Werte der Positionen meine Entscheidungsbedingungen natürlich Quatsch sind und sofort mein Notstop und/oder Winclose zieht.
Aber doch, dann ja, es wird direkt eine Position geöffnet (und geschlossen), wie in der KontoHistory zu sehen ist.

Vielen Dank Dir auch und Grüße,
Christian

Hallo Christian,

hier deine Fragen:

  1. der Code kommt ja nur bis PositionSelect, wenn glSellPlaced == true gesetzt ist
  2. und das wird wiederum direkt nach dem Öffnen einer Position gesetzt;
  3. vorausgesetzt, dass das, was oben mit der request.action geschieht, eine Position erzeugt?
  4. Es ist ja zunächst nur ein request und noch keine Position, richtig?
  5. Order und Deal-Nummern sind direkt da,
  6. aber damit habe ich ja noch keine Position?
  7. Allerdings wird direkt eine geschlossen, immer mit dem Spread als Verlust; sie wird direkt geschlossen, weil durch die 0-Werte der Positionen meine Entscheidungsbedingungen natürlich Quatsch sind und sofort mein Notstop und/oder Winclose zieht.
  8. Aber doch, dann ja, es wird direkt eine Position geöffnet (und geschlossen), wie in der KontoHistory zu sehen ist.

Hier meine Antworten:

  1. anhand der Log sieht man das
    if(glSellPlaced == true && initialsetst != true)
         {
           Print("Zeile 293: in glSellPlaced == true && initsetst != true");
    ja ausgeführt wird, aber eben das gelbe nach der if() Anweisung
    if(PositionSelect(_Symbol))
       {
                GetPositionProperties();
                // prüfen -> erst bei offener Position
                // ## 200123 eingefügt, weil notstopst sonst sofort zieht weil er 0 ist
                pos_ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
                pos_bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
                pos_spread=pos_ask - pos_bid;
                opriceplusspread = pos_oprice + pos_spread;
                Print(" ");
                Print("################################################");
                Print("ST: initialer notstop, initialsetst und winclose werden gesetzt:");
                notstopst = pos_oprice + sellslpips;        
                winclosest = pos_oprice - pos_spread - winpips;
                Print("init notstopst : ",DoubleToString(notstopst,5));
                Print("init winclosest:",DoubleToString(winclosest,5));
                Print("################################################");
                Print(" ");
                initialsetst = true;
               }
    wird nicht ausgeführt, da PositionSelect false zurück gibt
  2. falsche Aussage, das wird gesetzt nach einer OrderSend Anfrage und 2 Print Funktionen, die OrderSend sendet lediglich eine Anfrage an den Handelsserver, die er mit dem Result beantwortet
  3. Durch OrderSend werden div. Handelsserver Actionen ausgelöst bzw. ausgeführt, aber nicht sofort eine Position eröffnet
  4. genau richtig, Anfrage -> Order -> Deal ->Position bzw. History je nachdem  https://www.metatrader5.com/de/terminal/help/trading/general_concept
  5. Falsch. Laut deiner Log hast du eine Ordernummer, aber keine Dealnummer. siehe Punkt 3+4
  6. Richtig . siehe Punkt 4
  7. Alles was bei dir passiert, kann man nur beurteilen, wenn man deinen Programm Code kennt
  8. siehe Punkt 7 , die Position wird eröffnet, aber nach dem der Programm Code unter Punkt 1 ausgeführt wird.

Wie ich schon beim letzten mal geschrieben habe, mußt du dir die Zeitmarken im Journal bzw. Log genau anschauen

      1.  17:38:21.736    Goldesel-fx_v8 (USDJPY,M1)      Zeile 293: in glSellPlaced == true && initsetst != true
      2. Position eröffnet ?? geschlossen ??

      Wenn 2. nach 1. kann if(PositionSelect()) nicht ausgeführt werden.

      Ob das dann dein Problem das eine Position geöffnet und dann wieder geschlossen wird behebt, kann auch noch an anderen Problemen liegen.

      Aber das kann man ohne den Code zu kennen nicht beurteilen.

      Gruß

      Thorsten



      Grundlagen - Handelsoperationen - MetaTrader 5 Hilfe
      Grundlagen - Handelsoperationen - MetaTrader 5 Hilfe
      • www.metatrader5.com
      Bevor Sie beginnen die Trade-Funktionen der Plattform zu nutzen, müssen Sie ein klares Verständnis der standardmäßigen Begriffe Order, Deal und Position besitzen. ist die Anweisung an den Broker ein Finanzinstrument zu kaufen oder zu verkaufen. Es gibt zwei Haupt-Ordertypen: Markt und Pending. Zusätzlich gibt es Take Profit und Stop Loss...
      Otto Pauser
      2044
      Otto Pauser  

      Ich empfehle, wie immer, den OOP-Ansatz.

      Vor mittlerweilen einigen Jahren hab ich auch mit globalen Variablen herumgemurkst - das wurde zum Chaos.

      Ich poste diese Datei bereits mehrmals, das sollte das Herzstück jeden EAs sein.

      Besonders erwähnenswert ist die Deklaration der Instanz in dieser mqh selbst, dadurch können alle Programmteile(Module) darauf zugreifen.

      Wichtig ist nur in der OnTick() die Trade.OnTick() aufzurufen!

      //+------------------------------------------------------------------+
      //|                                               TradeExtSimple.mqh |
      //|                               Copyright © 2019, Ing. Otto Pauser |
      //|                       https://www.mql5.com/de/users/kronenchakra |
      //|        reduzierte Version von TradExt.mqh ohne handelsfunktionen |
      //+------------------------------------------------------------------+
      #include <Trade\Trade.mqh>
      
      //+------------------------------------------------------------------+
      //|  definitions and abbreviations                                   |
      //+------------------------------------------------------------------+
      #ifndef POSTYPE #define POSTYPE   ENUM_POSITION_TYPE   \ #endif
      #ifndef ORDTYPE #define ORDTYPE   ENUM_ORDER_TYPE      \ #endif
      #ifndef APRICE  #define APRICE    ENUM_APPLIED_PRICE   \ #endif
      #ifndef TIMEFR  #define TIMEFR    ENUM_TIMEFRAMES      \ #endif
      #ifndef METHOD  #define METHOD    ENUM_MA_METHOD       \ #endif
      #ifndef RETCODE #define RETCODE   ENUM_INIT_RETCODE    \ #endif
      
      //+------------------------------------------------------------------+
      //| CTradeExt definition                                             |
      //+------------------------------------------------------------------+
      class CTradeExt : public CTrade        // defines the class derived from CTrade
      {
         public:                             // static public vars set by constructor
            string   ProgName;               // name of program
            ulong    Magic;                  // a unique number
            double   VolMin;                 // Minimal volume for a deal
            double   VolMax;                 // Maximal volume for a deal
            double   VolStep;                // Minimal volume change step for deal execution
            double   TickSize;               // Minimal price change
            double   TickValue;              // Value of SYMBOL_TRADE_TICK_VALUE_PROFIT
            int      StopsLevel;             // Minimal indention in points from the current close price to place Stop orders
            int      FreezeLevel;            // Distance to freeze trade operations in points
            int      AccLeverage;            // Account leverage
            string   AccMode;                // Hedging, Netting
            bool     Testing;                // flag Programm running in testmode
            bool     Optimizing;             // flag Programm running in optimization mode
         public:                             // dynamic public vars updated by OnTick()
            double   AccBalance;             // Account balance in the deposit currency
            double   AccEquity;              // Account equity in the deposit currency
            double   AccMarginFree;          // Free margin of an account in the deposit currency
            double   AccMarginLevel;         // Account margin level in percents
            bool     Connected;              // Terminal connected
            bool     AutoTrade;              // 
            bool     TradeAllowed;           // 
            bool     ExpertAllowed;          // 
            double   SwapLong;               // Long swap value
            double   SwapShort;              // Short swap value
            long     TickIndex;              // incremented by OnTick()
            long     TickIndexWait;          // Tickindex to trade allowed again
            long     BarsIndex;              // incremented by OnTick(), IsNewBar()
            long     BarsIndexWait;          // Barsindex to trade allowed again
            datetime BarsTime;               // set by CheckBarTime()
            bool     NewBar;                 // set by CheckBarTime()
            bool     CheckBarTime(void);     // called by OnTick()
            bool     IsNewBar(void);     
            bool     NoNewBar(void);     
            double   Ask;                    // current ASK price
            double   Bid;                    // current BID price
            long     Spread;                 // current Spread value in points
            bool     PosOpened;              // is a position opened ?
            POSTYPE  PosType;                // type of position
            long     PosTicket;              // ticket of position
            double   PosVolume;              // lots of position
            double   PosOpenPrice;           // price of position opened
            datetime PosOpenTime;            // time when position opened
            double   PosProfit;              // profit of position
            double   PosSL;                  // SL of position
            double   PosTP;                  // TP of position
         public:
                     CTradeExt(void);        // Constructor
      //+------------------------------------------------------------------+
            bool     OnTick(void);           // the main function !
            double   NormalizeLots (double volume);
            double   NormalizePrice(double price);
      //+------------------------------------------------------------------+
      };
      
      CTradeExt Trade;                    // Instance of CTradeExt
      
      //+------------------------------------------------------------------+
      //| CTradeExt implementation                                         |
      //+------------------------------------------------------------------+
      void CTradeExt::CTradeExt(void)     // Constructor - get static information from account and symbol
      {
         ProgName          = MQLInfoString(MQL_PROGRAM_NAME);
         Magic             = StringToMagic    (_Symbol);
         VolMin            = SymbolInfoDouble (_Symbol,SYMBOL_VOLUME_MIN);
         VolMax            = SymbolInfoDouble (_Symbol,SYMBOL_VOLUME_MAX);
         VolStep           = SymbolInfoDouble (_Symbol,SYMBOL_VOLUME_STEP);
         TickSize          = SymbolInfoDouble (_Symbol,SYMBOL_TRADE_TICK_SIZE);
         StopsLevel        = (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);
         FreezeLevel       = (int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL);
         AccLeverage       = (int)AccountInfoInteger(ACCOUNT_LEVERAGE);
      
         switch((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE))
           {
            case ACCOUNT_MARGIN_MODE_RETAIL_HEDGING: AccMode="HEDGING"; break;
            case ACCOUNT_MARGIN_MODE_RETAIL_NETTING: AccMode="NETTING"; break;
            default                                : AccMode="UNKNOWN"; break;
           }
      
         AutoTrade         = (bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED);
         TradeAllowed      = (bool)AccountInfoInteger (ACCOUNT_TRADE_ALLOWED);
         ExpertAllowed     = (bool)AccountInfoInteger (ACCOUNT_TRADE_EXPERT);
         Testing           =  MQLInfoInteger(MQL_TESTER);
         Optimizing        =  MQLInfoInteger(MQL_OPTIMIZATION);
         TickIndex         = -1;          // tick counter
         TickIndexWait     = -1;
         BarsIndex         = -1;          // bars counter
         BarsIndexWait     = -1;
         BarsTime          = NULL;   
      }
      
      bool CTradeExt::OnTick()            // get dynamic information from symbol, account and position
      {
         TickIndex++;
         CheckBarTime();                  // check BarTime/NewBar
      
         Connected      = (bool)TerminalInfoInteger(TERMINAL_CONNECTED);
         if(!Connected)
            return(false);
      
         AccBalance     = AccountInfoDouble(ACCOUNT_BALANCE);                 
         AccEquity      = AccountInfoDouble(ACCOUNT_EQUITY);                  
         AccMarginFree  = AccountInfoDouble(ACCOUNT_MARGIN_FREE);             
         AccMarginLevel = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);            
         TickValue      = SymbolInfoDouble (_Symbol,SYMBOL_TRADE_TICK_VALUE); 
         SwapLong       = SymbolInfoDouble (_Symbol,SYMBOL_SWAP_LONG);        
         SwapShort      = SymbolInfoDouble (_Symbol,SYMBOL_SWAP_SHORT);       
         Ask            = SymbolInfoDouble (_Symbol,SYMBOL_ASK);
         Bid            = SymbolInfoDouble (_Symbol,SYMBOL_BID); 
         Spread         = SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);
      
         PosOpened      = PositionSelect(_Symbol);
      
         if(PosOpened)
            {                                      // position is open, update common values
               PosType      = (POSTYPE )PositionGetInteger(POSITION_TYPE);
               PosTicket    =           PositionGetInteger(POSITION_TICKET);
               PosOpenTime  = (datetime)PositionGetInteger(POSITION_TIME);
               PosVolume    = PositionGetDouble (POSITION_VOLUME);
               PosOpenPrice = PositionGetDouble (POSITION_PRICE_OPEN);
               PosProfit    = PositionGetDouble (POSITION_PROFIT);
               PosSL        = PositionGetDouble (POSITION_SL);       
               PosTP        = PositionGetDouble (POSITION_TP);       
            }
         else                                      // no position opened
            {
               PosType      = WRONG_VALUE;
               PosTicket    = WRONG_VALUE;
               PosOpenTime  = NULL;
               PosVolume    = NULL;
               PosOpenPrice = NULL;
               PosProfit    = NULL;
               PosSL        = NULL;       
               PosTP        = NULL;       
            }
      
         return(true);
      }
      
      //+------------------------------------------------------------------+
      //| BarTime/NewBar handling                                          |
      //+------------------------------------------------------------------+
      bool CTradeExt::CheckBarTime(void)     // check BarTime/NewBar
      {
         datetime barTime=iTime(_Symbol,_Period,0);
         if(BarsTime==-1)
            BarsTime=barTime;
         if(barTime==BarsTime)
               NewBar=false;
         else
            {
               NewBar=true;
               BarsTime=barTime;
               BarsIndex++; 
            }
         return(NewBar);
      }
      
      bool CTradeExt::IsNewBar(void)         // check if new bar
      {
         return(NewBar);
      }
      
      bool CTradeExt::NoNewBar(void)         // check no new bar
      {
         return(!NewBar);
      }
      
      //+------------------------------------------------------------------+
      //| utilities                                                        |
      //+------------------------------------------------------------------+
      double CTradeExt::NormalizeLots(double vol)
      {
         if(vol<VolMin) vol=VolMin; else
         if(vol>VolMax) vol=VolMax; else
         vol=NormalizeDouble(MathRound(vol/VolStep)*VolStep,2);
         return(vol);
      }
      
      double CTradeExt::NormalizePrice(double price)
      {
         return(NormalizeDouble(MathRound(price/TickSize)*TickSize,_Digits));
      }
      
      string PosTypeToString(POSTYPE aPosType)
      {
         switch(aPosType)
           {
            case POSITION_TYPE_BUY : return("BUY");
            case POSITION_TYPE_SELL: return("SELL");
           }
         return("NONE");
      }
      
      //+------------------------------------------------------------------+
      //| Magic number generator                                           |
      //+------------------------------------------------------------------+
      ulong StringToMagic(string _symbol=NULL) // Convert a string to a ulong (magic) 
      {
         uchar array[];                         // array for chars
         int   limit;                           // limit for index
         ulong mask;                            // 
         ulong result=0;
      
         if(_symbol==NULL)                      // empty or no parameter specified
            _symbol=_Symbol;
      
         StringToCharArray(_symbol,array);      // fill the string to array
      
         limit=MathMin(ArraySize(array)-1,9);   // max 9 chars
      
         for(int i=0; i<limit; i++)             // iterate through array
            {
               mask=array[i];                   // bitmaske wird zugewiesen
               mask<<=(i*7);                    // shift to the left
               result|=mask;                    // join with the result
            }
      
         return(result);
      }
      
      string MagicToString(ulong _magic)     // Convert the magic back to string 
      {
         ulong  mask=0x7F;                   // dez: 127   bin: 1111111
         ulong  temp=0;                      // temporary ulong to hold the masked value
         uchar  array[9];                    // array for chars
      
         for(int i=0; i<9; i++)              // iterate through array
            {
               temp=mask&_magic;             // mask out the value
               temp>>=(i*7);                 // shift it back to correct position
               
               array[i]=(uchar)temp;         // value to array
               mask<<=7;                     // shift the mask 7 bits left
            }
      
         return(CharArrayToString(array));   // convert array to string and return it
      }
      
      Dateien:
      amando
      2557
      amando  
      Was geht den aktuell nicht? Ganz kann ich jetzt nicht mehr folgen
      lindomatic
      200
      lindomatic  
      Thorsten Fischer:

      Hallo Christian,

      hier deine Fragen:

      1. der Code kommt ja nur bis PositionSelect, wenn glSellPlaced == true gesetzt ist
      2. und das wird wiederum direkt nach dem Öffnen einer Position gesetzt;
      3. vorausgesetzt, dass das, was oben mit der request.action geschieht, eine Position erzeugt?
      4. Es ist ja zunächst nur ein request und noch keine Position, richtig?
      5. Order und Deal-Nummern sind direkt da,
      6. aber damit habe ich ja noch keine Position?
      7. Allerdings wird direkt eine geschlossen, immer mit dem Spread als Verlust; sie wird direkt geschlossen, weil durch die 0-Werte der Positionen meine Entscheidungsbedingungen natürlich Quatsch sind und sofort mein Notstop und/oder Winclose zieht.
      8. Aber doch, dann ja, es wird direkt eine Position geöffnet (und geschlossen), wie in der KontoHistory zu sehen ist.

      Hier meine Antworten:

      1. anhand der Log sieht man das ja ausgeführt wird, aber eben das gelbe nach der if() Anweisung
        wird nicht ausgeführt, da PositionSelect false zurück gibt
      2. falsche Aussage, das wird gesetzt nach einer OrderSend Anfrage und 2 Print Funktionen, die OrderSend sendet lediglich eine Anfrage an den Handelsserver, die er mit dem Result beantwortet
      3. Durch OrderSend werden div. Handelsserver Actionen ausgelöst bzw. ausgeführt, aber nicht sofort eine Position eröffnet
      4. genau richtig, Anfrage -> Order -> Deal ->Position bzw. History je nachdem  https://www.metatrader5.com/de/terminal/help/trading/general_concept
      5. Falsch. Laut deiner Log hast du eine Ordernummer, aber keine Dealnummer. siehe Punkt 3+4
      6. Richtig . siehe Punkt 4
      7. Alles was bei dir passiert, kann man nur beurteilen, wenn man deinen Programm Code kennt
      8. siehe Punkt 7 , die Position wird eröffnet, aber nach dem der Programm Code unter Punkt 1 ausgeführt wird.

      Wie ich schon beim letzten mal geschrieben habe, mußt du dir die Zeitmarken im Journal bzw. Log genau anschauen

          1.  17:38:21.736    Goldesel-fx_v8 (USDJPY,M1)      Zeile 293: in glSellPlaced == true && initsetst != true
          2. Position eröffnet ?? geschlossen ??

          Wenn 2. nach 1. kann if(PositionSelect()) nicht ausgeführt werden.

          Ob das dann dein Problem das eine Position geöffnet und dann wieder geschlossen wird behebt, kann auch noch an anderen Problemen liegen.

          Aber das kann man ohne den Code zu kennen nicht beurteilen.

          Gruß

          Thorsten

          Hallo Thorsten, 1000 Dank für Deine Hilfe!
          Ich habe es mittlerweile verstanden und mit Hilfe von
           https://www.mql5.com/de/docs/event_handlers/ontrade eine bool Variable eingebaut, die auf true gesetzt wird, wenn 
          if(curr_positions!=positions) ausgeführt wird; die frage ich dann noch ab, bevor ich PositionSelect ausführe; wie es ausschaut, funktioniert es, weil ich stets direkt alle Werte habe, die ich brauche =)

          Jetzt brauche ich nur noch meine Strategie in Win- und StoppPips umzusetzen und schon sollte die Kasse klingeln =)

          Naja.. abgesehen davon, dass der Strategietester bei mir nicht funktioniert (wartet ständig auf Updates, die nie kommen..), halte ich Ergebnisse vom Backtesting kaum für aussagefähig, weil die Broker uns doch in der Gegenwart und Zukunft ihr großes Kino zeigen, welches angeblich den Markt abbilden soll und nicht in der Vergangenheit..

          Ich bin gespannt, jetzt komme ich endlich weiter!

          Vielen Dank nochaml & Grüße,

          Christian 

          Otto Pauser:

          Ich empfehle, wie immer, den OOP-Ansatz.

          Vor mittlerweilen einigen Jahren hab ich auch mit globalen Variablen herumgemurkst - das wurde zum Chaos.

          Ich poste diese Datei bereits mehrmals, das sollte das Herzstück jeden EAs sein.

          Besonders erwähnenswert ist die Deklaration der Instanz in dieser mqh selbst, dadurch können alle Programmteile(Module) darauf zugreifen.

          Wichtig ist nur in der OnTick() die Trade.OnTick() aufzurufen!


          Ich habe es mir nun mal ausgedruckt und werde es bei mir tragen und mir Stück für Stück zu Gemüte führen, danke Dir.

          lindomatic
          200
          lindomatic  
          amando:
          Was geht den aktuell nicht? Ganz kann ich jetzt nicht mehr folgen

          Gerade soweit alles =) danke, Amando.

          12
          Einloggen oder registrieren, um einen Kommentar zu schreiben