Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 762

 
Alexey Kozitsyn:
Und es sind nicht Positionen oder Geschäfte, die geprüft werden müssen, sondern Aufträge, denn ein Auftrag kommt zuerst, dann ein Geschäft, dann eine Position.

Warum nur Bestellungen? Hat ein Geschäft nicht eine Positions-ID (Ticket)?

 
Alexey Viktorov:

Warum nur Bestellungen? Hat ein Geschäft nicht eine Positions-ID (Ticket)?

Ja, Sie haben Recht. Sowohl Aufträge als auch Geschäfte haben eine Positionskennung. Im allgemeinen Fall sollten wir jedoch wissen, dass der Position eine Kennung der ersten Bestellung zugewiesen wird, die das Geschäft eingeleitet hat. Dementsprechend ist die "Einheit", die die Position initiiert, der Auftrag und nicht das Geschäft. Und es sind Aufträge, nicht Geschäfte, nach denen gesucht werden sollte.

Aus der Dokumentation:

Die Positionskennung ist eine eindeutige Nummer, die jeder neu eröffneten Position zugewiesen wird und sich während ihrer gesamten 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.

 
Alexey Kozitsyn:

Ja, Sie haben Recht. Sowohl Aufträge als auch Abschlüsse haben eine Positionskennung. Im Allgemeinen sollten Sie jedoch wissen, dass der Position die Kennung des ersten Auftrags zugewiesen wird, der den Handel eingeleitet hat. Dementsprechend ist die "Einheit", die die Position initiiert, der Auftrag und nicht das Geschäft. Und es sind Aufträge, nicht Geschäfte, nach denen gesucht werden sollte.

Aus der Dokumentation:

Ich werde nicht widersprechen, das ist genau das, was in der Dokumentation steht. An anderer Stelle in derselben Dokumentation heißt es jedoch"In der Regel...", was bedeutet, dass es Unstimmigkeiten geben kann. Und das ist das "in der Regel", dem ich einmal begegnet bin...

Position

Die Stelle Ticket. Sie sollte ausgefüllt werden, wenn eine Position geändert und geschlossen wird, damit sie eindeutig identifiziert werden kann. Sie entspricht in der Regel dem Ticket des Auftrags, aufgrund dessen die Position eröffnet wurde.

Ich kann mich nicht erinnern, und es ist unwahrscheinlich, dass ich ihn verstanden, gelesen, korrigiert und vergessen habe. Ich habe es gelesen, korrigiert und vergessen.
 
Vitaly Muzichenko:
Bitte teilen Sie mir mit, wie ich das Ticket, das für den Handel verwendet wurde, wiederfinden kann. Auf dem Bildschirmfoto ist es "63214735".

Hier suchen Siedie Nummer der Position in der Liste der Deals, sonst ist sie falsch.

Das folgende Skript zeigt, was HistorySelectByPosition leistet

//--- input parameters
input int      Position;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ ulong Ticket;
  if ( HistorySelectByPosition(Position) )
  { Print("Position = "+IntegerToString(Position));
    int o=HistoryOrdersTotal()-1;
    while ( o>=0 )
    { Ticket=HistoryOrderGetTicket(o);
      Print("Order "+IntegerToString(o)+" = "+IntegerToString(Ticket));
      o--;
    }
    int d=HistoryDealsTotal()-1;
    while ( d>=0 )
    { Ticket=HistoryDealGetTicket(d);
      Print("Deal "+IntegerToString(d)+" = "+IntegerToString(Ticket));
      d--;
    }
  }
}

Und so sieht das Ergebnis aus:

Position = 65328142
Order 1 = 65347809
Order 0 = 65328142
Deal 1 = 4070777
Deal 0 = 4051254

0 = Offene Position

1 = Position schließen

Wenn Sie es nicht bekommen = Sie haben keine Ticketposition eingegeben

Das gleiche Ergebnis erhalten wir, wenn wir mit dem Deal Ticket beginnen:

Für die Funktion HistoryDealGetInteger()

ENUM_DEAL_PROPERTY_INTEGER

Kennung

Beschreibung

Typ

DEAL_TICKET

Deal-Ticket. Eindeutige Nummer, die jedem Geschäft zugewiesen wird

lang

DEAL_ORDER

Auftrag, auf dessen Grundlage der Handel ausgeführt wurde

lang

DEAL_TIME

Ausführungszeit des Geschäfts

datetime

DEAL_TIME_MSC

Ausführungszeit des Geschäfts in Millisekunden ab 01.01.1970

lang

DEAL_TYPE

Art des Geschäfts

ENUM_DEAL_TYPE

DEAL_ENTRY

Geschäftsrichtung - Markteintritt, Marktaustritt oder Umkehrung

ENUM_DEAL_ENTRY

DEAL_MAGIC

Magische Zahl für das Geschäft (siehe ORDER_MAGIC)

lang

DEAL_REASON

Grund oder Quelle des Geschäfts

ENUM_DEAL_REASON

DEAL_POSITION_ID

Die Kennung der Position, an deren Eröffnung, Änderung oder Schließung dieses Geschäft beteiligt war. Jede Position hat eine eindeutige Kennung, die allen Geschäften zugewiesen wird, die während der Laufzeit der Position mit dem Instrument getätigt werden.

lang

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ivan Ivanov:

Ich danke Ihnen!

Ich brauchte dies:HistoryOrderGetTicket

 
Vitaly Muzichenko:

Ich danke Ihnen!

Ich brauchte dies:HistoryOrderGetTicket

Der Auftrag kann 1,0 Lot betragen. Er kann jedoch teilweise ausgeführt werden, z. B. Los 0,9 - der Rest wird abgelehnt (je nach Ausführungsmodus). Dann wird der Handel mit Lot 0,9 durchgeführt. Und wenn Sie anfangen, nach Lots für den Auftrag zu suchen, wird es Unstimmigkeiten geben.

 

Bitte helfen Sie - ich brauche einen vernünftigen Code, um den OHLC-Umgebungswert zu erhalten - die vorhandenen sind sehr langsam

Option 1

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   ArraySetAsSeries(Open,true);
   int copied=CopyOpen(Symbol(),0,0,Bars(Symbol(),0),Open);
   if(copied>0 && index<copied) open=Open[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(Symbol(),0,0,Bars(Symbol(),0),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   ArraySetAsSeries(Close,true);
//   int copied=CopyHigh(Symbol(),0,0,Bars(Symbol(),0),Close);
   int copied=CopyClose(Symbol(),0,0,Bars(Symbol(),0),Close);
   if(copied>0 && index<copied) close=Close[index];
   return(close);
  }
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   ArraySetAsSeries(OpenI,true);
   int copied=CopyOpen(symbol,timeframe,0,Bars(symbol,timeframe),OpenI);
   if(copied>0 && index<copied) open=OpenI[index];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(LowI,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),LowI);
   if(copied>0 && index<copied) low=LowI[index];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(HighI,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),HighI);
   if(copied>0 && index<copied) high=HighI[index];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   ArraySetAsSeries(CloseI,true);
   int copied=CopyClose(symbol,timeframe,0,Bars(symbol,timeframe),CloseI);
   if(copied>0 && index<copied) close=CloseI[index];
   return(close);
  }


Option 2

//-------------------------------------------------------------------
//==MQL4toMQL5
//+------------------------------------------------------------------+ 
//| Получим Open для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Open(int index)
  {
   double open=0;
   int copied=CopyOpen(Symbol(),0,index,1,Open);
   if(copied>0) open=Open[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим Low для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double Low(int index)
  {
   double low=0;
   int copied=CopyLow(Symbol(),0,index,1,Low);
   if(copied>0) low=Low[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим High для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double High(int index)
  {
   double high=0;
   int copied=CopyHigh(Symbol(),0,index,1,High);
   if(copied>0) high=High[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим Close для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double Close(int index)
  {
   double close=0;
   int copied=CopyClose(Symbol(),0,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }


  
//+------------------------------------------------------------------+ 
//| Получим IOpen для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iOpen(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double open=0;
   int copied=CopyOpen(symbol,timeframe,index,1,OpenI);
   if(copied>0) open=OpenI[0];
   return(open);
  }
//+------------------------------------------------------------------+ 
//| Получим iLow для заданного номера бара                            | 
//+------------------------------------------------------------------+ 
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   int copied=CopyLow(symbol,timeframe,index,1,LowI);
   if(copied>0) low=LowI[0];
   return(low);
  }
//+------------------------------------------------------------------+ 
//| Получим iHigh для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   int copied=CopyHigh(symbol,timeframe,index,1,HighI);
   if(copied>0) high=HighI[0];
   return(high);
  }
//+------------------------------------------------------------------+ 
//| Получим iClose для заданного номера бара                           | 
//+------------------------------------------------------------------+ 
double iClose(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,CloseI);
   if(copied>0) close=CloseI[0];
   return(close);
  }
 
Aleksey Vyazmikin:

Bitte helfen Sie - ich brauche einen vernünftigen Code, um den OHLC-Umgebungswert zu erhalten - die vorhandenen sind sehr langsam

Option 1


Option 2

Stellen Sie einen Codeausschnitt ein, um zu zeigen, wie Sie ihn anwenden.
 
Vitaly Muzichenko:
Posten Sie ein Stück Code, wie Sie sie anwenden

Ich weiß nicht, welcher Teil sich verlangsamt - ich wende sie auf unterschiedliche Weise an, auch in Schleifen...


Hier ist ein Beispiel


            for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               if((Low(X)>PricePeresek && High(X)>PricePeresek) || 
                  (Low(X)<PricePeresek && High(X)<PricePeresek))
                  calcBarPeresek++;
               else break;
              }
 
Aleksey Vyazmikin:

Ich weiß nicht, welcher Teil sich verlangsamt - ich wende ihn auf unterschiedliche Weise an, auch in Schleifen...

In Schleifen sieht es so aus, und man kann auf die Funktion verzichten

            double LOW[1],HIGH[1];
             for(int X=1;X<DonchianBarStart+1;X++)
              {
               PricePeresek=Donchianf(0,X+1);
               CopyLow(Symbol(),PERIOD_CURRENT,X,1,LOW);
               CopyHigh(Symbol(),PERIOD_CURRENT,X,1,HIGH);
               if((LOW[0]>PricePeresek && HIGH[0]>PricePeresek) || 
                  (LOW[0]<PricePeresek && HIGH[0]<PricePeresek))
                  calcBarPeresek++;
               else break;
              }