FORTS: Um Anfängern zu helfen - Seite 5

 
Mikhail Filimonov:

Häufig verwendete und nützliche Funktionen:

Die Funktion GetPositionPrice() wurde neu gestaltet:

Diese Funktion zeigt das falsche Ergebnis an, oder besser gesagt, das falsche Ergebnis. Ich habe nachgeforscht und herausgefunden, dass sich die Positions-ID beim U-Turn (d. h. während eines In/Out-Trade) nicht ändert, wie in der Dokumentation beschrieben:

https://www.mql5.com/ru/docs/constants/tradingconstants/positionproperties

Eine Positionsstornierung ändert ihre ID in das Orderticket, das zur Stornierung geführt hat.

Ihr GetPositionPrice kann bei einer Umkehrung 2 oder mehr entgegengesetzt gerichtete Positionen anhäufen und errechnet einen Durchschnittspreis für sie. Ein solcher Durchschnittspreis für eine Position ist in der Praxis nicht von Nutzen.

Ändert sich die Positions-ID nun bei einer Umkehrung oder nicht?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
die Positionsnummer ändert sich beim Drehen nicht
 
Wie können Sie feststellen, welches Volumen eine vorherige Position geschlossen und welches eine neue Position bei einem In/Out-Handel eröffnet hat?
 
igorbel:
Woran erkennt man bei einem In/Out-Handel, welches Volumen eine vorherige Position geschlossen und welches eine neue eröffnet hat?
Sie können sie mit der aktuellen Öffnung vergleichen. Aber es ist besser, die Geschichte der Position anhand ihrer ID zu untersuchen, die sich nicht ändert, wenn man sie umdreht... Kauf-/Verkaufsvolumen als Hilfe.
 
Dennis Kirichenko:
Sie kann mit der aktuellen offenen Position verglichen werden. Aber es ist besser, die Geschichte der Position anhand ihrer id zu untersuchen, die sich nicht ändert, wenn die Position umgekehrt wird... Kauf-/Verkaufsvolumen als Hilfe.

Seit kurzem ändert sich die Positionsangabe, wenn Sie sich umdrehen. Die Dokumentation dazu wurde bereits aktualisiert....

POSITIONSNUMMER

Die Positions-ID ist eine eindeutige Nummer, die jeder neu eröffneten Position zugewiesen wird und sich während ihrer Lebensdauer nicht ändert. Sie entspricht dem Ticket des Auftrags, mit dem die Position eröffnet wurde.

Die Positionskennung wird in jedem Auftrag (ORDER_POSITION_ID) und jedem Geschäft (DEAL_POSITION_ID) angegeben, mit dem er eröffnet, geändert oder geschlossen wurde. Verwenden Sie diese Eigenschaft, um nach Aufträgen und Geschäften zu suchen, die sich auf die Position beziehen.

Wird eine Position storniert, ändert sich ihre Kennung in das Orderticket, das zu der Stornierung geführt hat.

lang

 
Dennis Kirichenko:
Sie können sie mit der aktuellen Öffnung vergleichen. Aber es ist besser, die Geschichte der Position anhand der ID zu untersuchen, die sich während einer Umkehrung nicht ändert... Kauf-/Verkaufsvolumen als Hilfe.

Das ist überhaupt keine Option. Die vorherige Position könnte auch aufgrund einer Umkehrung usw. offen sein. Das könnte eine Option sein, ist aber eindeutig nicht optimal.

 
Andrey Barinov:

Seit kurzem ändert sich die Positionsangabe, wenn Sie sich umdrehen. Die Dokumentation dazu wurde bereits aktualisiert....

POSITIONSNUMMER

Die Positions-ID ist eine eindeutige Nummer, die jeder neu eröffneten Position zugewiesen wird und sich während ihrer Lebensdauer nicht ändert. Sie entspricht dem Ticket des Auftrags, mit dem die Position eröffnet wurde.

Die Positionskennung wird in jedem Auftrag (ORDER_POSITION_ID) und jedem Geschäft (DEAL_POSITION_ID) angegeben, mit dem er eröffnet, geändert oder geschlossen wurde. Verwenden Sie diese Eigenschaft, um nach Aufträgen und Geschäften zu suchen, die mit der Position verbunden sind.

Wird eine Position storniert, ändert sich ihre Kennung in das Orderticket, das zu der Stornierung geführt hat.

lang

So steht es zwar geschrieben, aber in Wirklichkeit ändert sich nichts.

Wenn Sie mögen, mein Code:

long pos_id1,pos_id2,pos_id3;
   ulong deal1_ticket=xxx;
   ulong deal2_ticket=xxx;
   ulong deal3_ticket=xxx;
   if(!HistoryDealSelect(deal1_ticket))
      Print(__FUNCTION__+": deal 1 not selected. Error=",GetLastError());   
   pos_id1=HistoryDealGetInteger(deal1_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal1_ticket,", position ID=",pos_id1);
   if(!HistoryDealSelect(deal2_ticket))
      Print(__FUNCTION__+": deal 2 not selected. Error=",GetLastError());
   pos_id2=HistoryDealGetInteger(deal2_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal2_ticket,", position ID=",pos_id2);
   if(!HistoryDealSelect(deal3_ticket))
      Print(__FUNCTION__+": deal 3 not selected. Error=",GetLastError());
   pos_id3=HistoryDealGetInteger(deal3_ticket,DEAL_POSITION_ID);
   Print(__FUNCTION__+": ticket=",deal3_ticket,", position ID=",pos_id3);

Dabei ist deal2_ticket das Ticket für die In/Out-Transaktion, deal1_ticket ist das Ticket vor der In/Out-Transaktion, deal3_ticket ist das Ticket nach der In/Out-Transaktion. In allen drei Fällen erhalte ich die gleiche Positions-ID.

 
igorbel:

Das steht da, aber in Wirklichkeit ändert sich nichts.

Wenn Sie mögen, mein Code:

Dabei ist deal2_ticket das Ticket für die In/Out-Transaktion, deal1_ticket ist das Ticket vor der In/Out-Transaktion, deal3_ticket ist das Ticket nach der In/Out-Transaktion. In allen drei Fällen erhalte ich die gleiche Positions-ID.

Meine verändert sich. Versuchen Sie es mit dem neuesten Build 1340.
 
igorbel:
Und wie kann man bei einem In/Out-Handel feststellen, welches Volumen die vorherige Position geschlossen und welches die neue eröffnet hat?

Dieser Expert Advisor wird im Modus "Debugging on History" auf einem Netting-Konto ausgeführt. Das Beispiel ist etwas grob, da davon ausgegangen wird, dass es nur ein Geschäft vom Typ "IN/OUT" in der Geschäftshistorie gibt.

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\Trade.mqh>
CTrade my_trade;
long deal_positions_id_in_out=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static int t=0;
   if(t==20)
     {
      my_trade.Buy(0.02);
     }
   if(t==25)
     {
      my_trade.Buy(0.01);
     }
   if(t==30)
     {
      my_trade.Sell(0.07);
     }
   if(t==40)
     {
      my_trade.PositionClose(Symbol());
     }
   if(t==50)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_entry==DEAL_ENTRY_INOUT)
               deal_positions_id_in_out=deal_positions_id;
            Print("DEAL_POSITION_ID ",deal_positions_id,
                  ", DEAL_VOLUME ",DoubleToString(deal_volume,2),
                  ", DEAL_ENTRY ",EnumToString((ENUM_DEAL_ENTRY)deal_entry),
                  ", DEAL_TYPE ",EnumToString((ENUM_DEAL_TYPE)deal_type));
           }
        }
     }
   if(t==55)
     {
      //--- request trade history 
      HistorySelect(0,TimeCurrent());
      long     deal_positions_id=0;
      double   deal_volume=0;
      long     deal_entry=0;
      long     deal_type=0;
      ulong    ticket=0;
      double   volume_in=0;
      double   volume_out=0;
      for(int i=0;i<HistoryDealsTotal();i++)
        {
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_positions_id=HistoryDealGetInteger(ticket,DEAL_POSITION_ID);
            deal_volume=HistoryDealGetDouble(ticket,DEAL_VOLUME);
            deal_entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
            deal_type=HistoryDealGetInteger(ticket,DEAL_TYPE);
            if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_IN)
               volume_in+=deal_volume;
            else if(deal_positions_id==deal_positions_id_in_out && deal_entry==DEAL_ENTRY_INOUT)
               volume_out=deal_volume;
           }
        }
      Print("DEAL_POSITION_ID ",deal_positions_id_in_out,
            ": volume in ",DoubleToString(volume_in,2),", volume out ",DoubleToString(volume_out,2));
     }
   t++;
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
//---

  }
//+------------------------------------------------------------------+

Zunächst werden nach allen getätigten Geschäften und vollständiger Schließung einer Position die Beschreibungen aller Geschäfte angezeigt(DEAL_POSITION_ID, DEAL_VOLUME, DEAL_ENTRY,DEAL_TYPE), dabei wird die DEAL_POSITION_ID für ein Geschäft vom Typ IN/OUT gespeichert.

Dann wird die Historie erneut durchlaufen und alle Einträge für Geschäfte mit DEAL_POSITION_ID summiert.

Wir erhalten etwa folgendes Ergebnis:

10:58:23.963    Test (EURUSD,H1)        2016.01.04 00:06:42   CTrade::OrderSend: instant buy 0.04 EURUSD at 1.08732 [done at 1.08732]
10:58:30.692    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 0, DEAL_VOLUME 0.00, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BALANCE
10:58:30.784    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.02, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:32.074    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.01, DEAL_ENTRY DEAL_ENTRY_IN, DEAL_TYPE DEAL_TYPE_BUY
10:58:33.826    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 2, DEAL_VOLUME 0.07, DEAL_ENTRY DEAL_ENTRY_INOUT, DEAL_TYPE DEAL_TYPE_SELL
10:58:37.237    Test (EURUSD,H1)        2016.01.04 00:07:10   DEAL_POSITION_ID 4, DEAL_VOLUME 0.04, DEAL_ENTRY DEAL_ENTRY_OUT, DEAL_TYPE DEAL_TYPE_BUY
10:59:07.397    Test (EURUSD,H1)        2016.01.04 00:07:19   DEAL_POSITION_ID 2: volume in 0.03, volume out 0.07
Dateien:
Test.mq5  5 kb
 
Andrey Barinov:
Das ändert sich für mich. Versuchen Sie es mit dem neuesten Build 1340.
Das habe ich auch versucht. Auf welchem Markt wechseln Sie?