Bibliotheken: MT4Orders - Seite 24

 

Sorry, ich kann kein Russisch sprechen. Ich benutze Google Übersetzer.

Vor ein paar Tagen habe ich diese sehr interessante Bibliothek gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend () und speichere das von OrderSend () zurückgegebene Ticket. Nach einiger Zeit werden Stop-Losses erreicht oder Gewinne erzielt. Dann versuche ich, eine Order über OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 wird der Auftrag in der Historie gefunden. Aber wenn ich diese Bibliothek mit MQL5 verwende, schlägt OrderSelect fehl.

Ich habe ein wenig im Code von MT4orders.mqh nachgesehen. MT4ORDERS::SelectByTicket () ruft SelectByExistingTicket() auf, was fehlschlägt, und dann SelectByHistoryTicket(), von dem ich erwarte, dass es erfolgreich ist. In SelectByHistoryTicket() gibt HistoryDealSelect() in der Regel false zurück (außer vielleicht in einem Test), weil das Ticket eine Positionskennung und kein Transaktions-Ticket ist. ::HistoryOrderSelect () gibt true zurück, weil das Ticket dasselbe ist wie das In-Order-Ticket (und der Positionsbezeichner) (ich verwende MT5 im Hedge-Modus). Aber MT4HISTORY::IsMT4Order(Ticket) gibt false zurück. Ich erwarte, dass sie true zurückgibt. Die Funktion gibt true zurück, wenn die Positionskennung null ist. Aber ich sehe, dass sowohl im Test als auch in der tatsächlichen Rechnung die Positions-ID nicht Null ist und dem Order-Bit in der Bestellung entspricht.

Jede Hilfe ist willkommen.

 
winloosewin:

Ich habe diese sehr interessante Bibliothek vor ein paar Tagen gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend () und speichere das von OrderSend () zurückgegebene Ticket. Nach einiger Zeit werden Stop-Losses erreicht oder Gewinne erzielt. Dann versuche ich, eine Order über OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 wird der Auftrag in der Historie gefunden. Aber wenn ich diese Bibliothek mit MQL5 verwende, schlägt OrderSelect fehl.

Das ist korrekt. Die Details sind hier beschrieben.

Sie können PositionTicket = OrderSend(OP_BUY, 2 lots) und OrderClose(0.2 lots) + OrderClose(0.3 lots) machen. Dann erhalten Sie zwei geschlossene "Positionen" (0,2/0,3 Lots) und eine offene Position (1,5 Lots) mit einem Ticket, das dem PositionTicket entspricht. Dies ist eine Besonderheit von MT5. Daher ist es falsch, eine Position über ihre POSITION_ID in der Trading History im Modus SELECT_BY_TICKET+MODE_HISTORY auszuwählen.


Das Merken von Tickets ist ein schlechter Stil, auch wenn er beliebt ist. Der richtige Weg ist, wenn der Handelsroboter bei jedem Ereignis die gesamte Umgebung von Grund auf neu liest.


ZY Hier sehen Sie ungefähr die gleiche Situation wie oben beschrieben.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Bibliotheken: MT4Orders

fxsaber, 2018.04.14 09:10 AM

Beispiel .

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  long Ticket;
  
  PRINT((Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - 100 * _Point, Bid + 100 * _Point, "Hello World!", 12345)));
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    PRINT(OrderClose(OrderTicket(), 0.3, OrderClosePrice(), 0));
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 1; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      PRINT(OrderTicket());
      PRINT(OrderMagicNumber());
      PRINT(OrderComment());
      PRINT(OrderTicketOpen());
    }
}


Ergebnis

2018.03.25 00:00:00   instant buy 1.00 EURUSD at 1.23527 sl: 1.23414 tp: 1.23614 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #2  buy 1.00 EURUSD at 1.23527 done (based on order #2)
2018.03.25 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   order performed buy 1.00 at 1.23527 [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   (Ticket=OrderSend(_Symbol,OP_BUY,1,Ask,0,Bid-100*_Point,Bid+100*_Point,Hello World!,12345)) = 2
2018.03.25 00:00:00   instant sell 0.30 EURUSD at 1.23514, close #2 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #3  sell 0.30 EURUSD at 1.23514 done (based on order #3)
2018.03.25 00:00:00   deal performed [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   order performed sell 0.30 at 1.23514 [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   OrderClose(OrderTicket(),0.3,OrderClosePrice(),0) = true
2018.03.26 01:04:40   take profit triggered #2  buy 0.70 EURUSD 1.23527 sl: 1.23414 tp: 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   deal #4  sell 0.70 EURUSD at 1.23614 done (based on order #4)
2018.03.26 01:04:40   deal performed [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   order performed sell 0.70 at 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
final balance 10000046.11 EUR
2018.03.26 23:59:59   #3 2018.03.25 00:00:00 buy 0.30 EURUSD 1.23527 1.23414 1.23614 2018.03.25 00:00:00 1.23514 0.00 0.00 -3.16 Hello World! 12345
2018.03.26 23:59:59   OrderTicket() = 3
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = Hello World!
2018.03.26 23:59:59   OrderTicketOpen() = 2
2018.03.26 23:59:59   #4 2018.03.25 00:00:00 buy 0.70 EURUSD 1.23527 0.00000 1.23614 2018.03.26 01:04:40 1.23614 0.00 0.00 49.27 tp 1.23614 12345
2018.03.26 23:59:59   OrderTicket() = 4
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = tp 1.23614
2018.03.26 23:59:59   OrderTicketOpen() = 2

Die Ergebnisse zeigen, dass eine Position mit Ticket == 2 eröffnet wurde. Sie wurde dann zweimal geschlossen, wodurch zwei geschlossene "Positionen" in der Trading History entstanden. Ihre Tickets sind unterschiedlich, aber beide "Positionen" haben OrderTicketOpen == 2. D.h. Sie sollten sich darüber im Klaren sein, dass, wenn Sie eine Position in MT5 schließen, ihr historisches Ticket nicht mit dem Echtzeit-Ticket übereinstimmt.


Beachten Sie, dass im MT5 sogar die Kommentare beim Schließen der gleichen Echtzeitposition unterschiedlich sind:"Hello World!" und"tp 1.23614".

 
winloosewin:

Sorry, ich kann kein Russisch sprechen. Ich benutze Google Übersetzer.

Vor ein paar Tagen habe ich diese sehr interessante Bibliothek gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend () und speichere das von OrderSend () zurückgegebene Ticket. Nach einiger Zeit werden Stop-Losses erreicht oder Gewinne erzielt. Dann versuche ich, eine Order über OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 wird der Auftrag in der Historie gefunden. Aber wenn ich diese Bibliothek mit MQL5 verwende, schlägt OrderSelect fehl.

Ich habe ein wenig im Code von MT4orders.mqh nachgesehen. MT4ORDERS::SelectByTicket () ruft SelectByExistingTicket() auf, was fehlschlägt, und dann SelectByHistoryTicket(), von dem ich erwarte, dass es erfolgreich ist. In SelectByHistoryTicket() gibt HistoryDealSelect() in der Regel false zurück (außer vielleicht in einem Test), weil das Ticket eine Positionskennung und kein Transaktions-Ticket ist. ::HistoryOrderSelect () gibt true zurück, weil das Ticket dasselbe ist wie das In-Order-Ticket (und der Positionsbezeichner) (ich verwende MT5 im Hedge-Modus). Aber MT4HISTORY::IsMT4Order(Ticket) gibt false zurück. Ich erwarte, dass sie true zurückgibt. Die Funktion gibt true zurück, wenn die Positionskennung null ist. Aber ich sehe, dass sowohl im Test als auch in der tatsächlichen Rechnung die Positions-ID nicht Null ist und dem Auftragsbit im Auftrag entspricht.

Jede Hilfe ist willkommen.

Um Ihre maschinelle Übersetzung vollständig zu verstehen, fügen Sie bitte den Text auf Englisch bei.

 

Ich habe diese sehr interessante Bibliothek vor einigen Tagen gefunden. Aber ich habe ein Problem: Ich sende eine Marktorder über OrderSend() und speichere das von OrderSend() zurückgegebene Ticket. Nach einiger Zeit wird der Stop Loss oder Take Profit erreicht. Dann versuche ich, die Order über
OrderSelect(ticket, SELECT_BY_TICKET) mit diesem Ticket auszuwählen. In MQL4 würde der Auftrag in der Historie gefunden werden. Aber wenn ich diese Bibliothek mit MQL5 verwende, ist OrderSelect nicht erfolgreich.

Ich habe ein wenig in den Code von MT4orders.mqh geschaut. MT4ORDERS::SelectByTicket() ruft SelectByExistingTicket() auf, das fehlschlägt, und dann SelectByHistoryTicket(), von dem ich erwarten würde, dass es erfolgreich ist. In SelectByHistoryTicket() gibt die Funktion HistoryDealSelect() in der Regel false zurück (außer vielleicht im Tester), weil das Ticket die Positionskennung und nicht das Geschäftsticket ist. ::HistoryOrderSelect() gibt true zurück, weil das Ticket dasselbe ist wie das Ticket der In-Order (und die Positionskennung)(ich verwende MT5 im Hedging-Modus). Aber MT4HISTORY::IsMT4Order(Ticket) gibt false zurück. Ich würde erwarten, dass sie true zurückgibt. Die Funktion würde true zurückgeben, wenn der Positionsbezeichner Null wäre. Aber ich sehe, dass sowohl im Tester als auch in einem echten Konto die Positionskennung nicht Null ist - und gleich dem Orderticket der In-Order.

Mit anderen Worten: Ich verstehe nicht, warum in der Funktion MT4HISTORY::IsMT4Order() der folgende Code steht (gibt true zurück, wenn die Positionskennung null ist):

    return(/*(::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) > 0) ||*/ !::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));

Im Folgenden füge ich meinen Testcode an:

void OnTick()
{
   PrintChangesOfMQL5OrderSystemState();

   int total=OrdersTotal();

   double bid = MarketInfo(Symbol(), MODE_BID);
   double ask = MarketInfo(Symbol(), MODE_ASK);

   static int state=0;
   static ulong ticket = 0;

   switch(state)
   {
      case 0:
         ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);
         state=1;
         break;

      case 1:
         if(0==total)
         {
            bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
            if(false==res)
            {
               Print("OrderSelect failed with ticket: ", (string)ticket);
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));
               
               ExpertRemove();
            }
         }
         break;
   }
}

PrintChangesOfMQL5OrderSystemState() ist eine einfache Funktion, die den Zustand des MQL5-Auftragssystems jedes Mal ausgibt, wenn eine Änderung festgestellt wurde.

Hier ist die Ausgabe des Testcodes (auf dem Testgerät ausgeführt):

EURUSD  bid=1.087360   ask=1.087860
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in


--------------------
EURUSD  bid=1.087350   ask=1.087850
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert
Order:    ticket: 0  position_id: 0  MAGIC: 0  buy  open_price: 0.000000  volume: 0.000000  cur_vol=0.000000  type=buy  reason=client

Position: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  reason=expert

--------------------
EURUSD  bid=1.087330   ask=1.087830
263207 EURUSD 2016.01.03 00:00:16  

HistDeal: ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  opened by order: 3  type=sell  reason=stop loss  entry=out
HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  cur_vol=0.000000  type=sell  reason=stop loss
HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert

--------------------

OrderSelect failed with ticket:  2
ORDER_POSITION_ID =  2
HistoryDealSelect true    MT4HISTORY::IsMT4Deal false
HistoryOrderSelect true    MT4HISTORY::IsMT4Order false    ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2


Sie können sehen, dass HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2 und nicht Null zurückgibt. Dies ist der Grund, warum MT4HISTORY::IsMT4Order() false zurückgibt.



Für jede Hilfe bin ich dankbar.
Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
winloosewin:
Sie wurden bereits oben beantwortet.


Mit anderen Worten: Ich verstehe nicht, warum in der Funktion MT4HISTORY::IsMT4Order() der folgende Code steht (gibt true zurück, wenn die Positions-ID Null ist):

Im Folgenden füge ich meinen Testcode an:

PrintChangesOfMQL5OrderSystemState() ist eine einfache Funktion, die den Status des MQL5-Ordersystems jedes Mal ausgibt, wenn eine Änderung festgestellt wurde.

Hier ist die Ausgabe des Testcodes (ausgeführt auf dem Testgerät):


Sie können sehen, dass HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2 und nicht Null zurückgibt. Das ist der Grund, warum MT4HISTORY::IsMT4Order() false zurückgibt.

Sie wissen nicht, dass ein Auftrag in MT5 und MT4 unterschiedliche Einheiten sind.

 
fxsaber:
Ihre Frage wurde bereits oben beantwortet.


Sie verstehen nicht, dass ein Auftrag in MT5 und in MT4 unterschiedliche Einheiten sind.

Ich verstehe die Auftragssysteme von MQL5 und MQL4 und ihre Unterschiede.


fxsaber:
Daher ist es falsch, eine Position nach ihrer POSITION_ID in der Trading History im Modus SELECT_BY_TICKET+MODE_HISTORY auszuwählen.

Ja, ich weiß, dass die MQL5-Funktion HistoryOrderSelect() ein Ticket und nicht eine Positionskennung erwartet.

Aber mein Testcode ist gültiger MQL4-Code (mit Ausnahme der Aufrufe der MQL5-Funktionen HistoryOrderSelect() und HistoryDealSelect()))

und in MQL4 gibt die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) wie erwartet true zurück.

Soweit ich weiß, ist der Zweck der Bibliothek, das MQL4-Bestellsystem so gut wie möglich auf MQL5 zu emulieren. Ich würde also erwarten, dass mit

der Bibliothek die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) auch true zurückgibt.

Ich habe mir den Code angesehen und versucht herauszufinden, warum er falsch zurückgibt.

Erstens: Da ich mit einem MQL5-Hedging-System arbeite, ist die Funktion

ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);

weist der Variablen 'ticket' das Orderticket zu, das der (zukünftigen) Positionskennung in MQL5 hedge entspricht. Dies ist im Code zu sehen

    return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Ergebnis.Auftrag ist eine Funktion von MT5-Hedge
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (::PositionSelect(MT4ORDERS::LastTradeRequest.symbol) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // HistoryDealSelect in MT4ORDERS::OrderSend
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

der Funktion MT4OrderSend(). Es wird Folgendes zurückgegeben:

(long)MT4ORDERS::LastTradeResult.order : // PositionID == Ergebnis.Auftrag ist eine Funktion von MT5-Hedge

Wenn ich analysiere, was die Bibliothek beim Ausführen des Codes macht

bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);

sehe ich, dass die Funktion SelectByHistoryTicket() mit dem Ticket ausgeführt wird, das ich in der Variablen 'ticket' gespeichert habe.

In dieser Funktion wird die Funktion HistoryOrderSelect(ticket) aufgerufen - mit dem Ticket, das gleich dem Orderticket und der Positionskennung ist.

Bei meinem MQL4 OrderSelect()-Aufruf rufe ich HistoryOrderSelect(ticket) nicht selbst auf - es steht in der Bibliothek.

Nur in meinem Testcode rufe ich HistoryOrderSelect(ticket) und HistoryDealSelect(ticket) direkt auf, um zu sehen, was innerhalb der Bibliothek passiert:

/* Der folgende Code ist MQL5 und nicht MQL4 - nur um zu überprüfen, was innerhalb der Bibliothek passiert: */
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));


Um es kurz zu machen: Laut dem Rückgabewert von OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) emuliert die Bibliothek nicht das

MQL4-Bestellsystem auf MQL5 nicht korrekt.

 
winloosewin:

MQL4 die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) gibt wie erwartet true zurück.

Soweit ich weiß, ist der Zweck der Bibliothek, das MQL4-Bestellsystem so gut wie möglich auf MQL5 zu emulieren. Ich würde also erwarten, dass mit

der Bibliothek die Funktion OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) auch true zurückgibt.

Ich habe mir den Code angesehen und versucht herauszufinden, warum er falsch zurückgibt.

Sie liegen falsch. Führen Sie diesen Expert Advisor im Tester aus

#include <MT4Orders.mqh>
#include <Debug.mqh> // https://c.mql5.com/3/173/Debug.mqh

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (_P(OrderSelect(_P(OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0)), SELECT_BY_TICKET)))
  {
    OrderPrint();
    _P(OrdersTotal());    
  }
  
  ExpertRemove();  
}


Ergebnis

2018.08.07 10:47:20.340 2018.08.01 00:00:00   instant buy 1.00 EURUSD at 1.16905 (1.16895 / 1.16905 / 1.16895)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal #2  buy 1.00 EURUSD at 1.16905 done (based on order #2)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.340 2018.08.01 00:00:00   order performed buy 1.00 at 1.16905 [#2  buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0) = 2
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSelect(_P(OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0)),SELECT_BY_TICKET) = true
2018.08.07 10:47:20.347 2018.08.01 00:00:00   #2 2018.08.01 00:00:00 buy 1.00 EURUSD 1.16905 0.00000 0.00000 1.16895 0.00 0.00 -10.00 0
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 11: OrdersTotal() = 1
2018.08.07 10:47:20.347 2018.08.01 00:00:00   ExpertRemove() function called
 

Ja, ich weiß, dass true zurückgegeben wird, wenn OrderSelect() direkt nach der Eröffnung der Position aufgerufen wird .

In diesem Fall haben wir eine offene MQL5-Position und die Bibliothek findet die Position beim Aufruf von OrderSelect().

Dies geschieht in der internen Funktion SelectByExistingTicket() der Bibliothek.


Aber der springende Punkt ist, dass OrderSelect(ticket) false zurückgibt, wenn die MQL5-Position durch Stop Loss oder Take Profit geschlossen wird.

Bitte führen Sie meinen Testcode aus, um dies zu überprüfen (wenn Ihr Broker so enge SL und TP nicht akzeptiert, machen Sie sie bitte breiter, um eine Ablehnung der OrderSend() zu vermeiden).

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
winloosewin:

Aber der entscheidende Punkt ist, dass OrderSelect(ticket) false zurückgibt, wenn die MQL5-Position durch Stop Loss oder Take Profit geschlossen wird.

Lesen Sie noch einmal einen Teil meiner ausführlichen Antwort

Forum über Handel, automatisierte Handelssysteme und das Testen von Handelsstrategien.

Bibliotheken: MT4Orders

fxsaber, 2018.08.06 14:21

Das ist korrekt. Die Details sind hier beschrieben.

Du kannst PositionTicket = OrderSend(OP_BUY, 2 lots) und OrderClose(0.2 lots) + OrderClose(0.3 lots) machen. Dann erhalten Sie zwei geschlossene "Positionen" (0,2/0,3 Lots) und eine offene Position (1,5 Lots) mit einem Ticket, das dem PositionTicket entspricht. Dies ist eine Besonderheit von MT5. Daher ist es falsch, eine Position über ihre POSITION_ID in der Trading History im Modus SELECT_BY_TICKET+MODE_HISTORY auszuwählen.


Das Merken von Tickets ist ein schlechter Stil, auch wenn er beliebt ist. Der richtige Weg ist, wenn der Handelsroboter bei jedem Ereignis die gesamte Umgebung von Grund auf neu liest.


ZY Hier sehen Sie ungefähr die gleiche Situation wie oben beschrieben


Die Ergebnisse zeigen, dass eine Position mit Ticket == 2 eröffnet wurde. Dann wurde sie zweimal geschlossen, wodurch zwei geschlossene "Positionen" in der Trading History entstanden. Ihre Tickets sind unterschiedlich, aber beide "Positionen" haben OrderTicketOpen == 2. D.h. Sie sollten sich darüber im Klaren sein, dass , wenn Sie eine Position im MT5 schließen, ihr historisches Ticket nicht mit dem Echtzeit-Ticket übereinstimmt.


Beachten Sie, dass im MT5 sogar die Kommentare beim Schließen der gleichen Echtzeitposition unterschiedlich sind:"Hello World!" und"tp 1.23614".

Es ist nicht möglich, eine geschlossene MT4-Position im MT5 eindeutig über die POSITION_ID auszuwählen, da es mehrere MT4-Positionen mit der gleichen POSITION_ID zur gleichen Zeit geben kann.

 

Wer die Datei mql4_to_mql5.mqh von MT4Orders für die MT4 -> MT5 Konvertierung verwendet, möge bitte dieses Stück Code daraus entfernen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Testen von 'CopyTicks'

fxsaber, 2016.10.19 07:59

// Ermöglicht, wie in MT4, die Arbeit mit Zeitreihen: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// Es werden auch die üblichen MT4-Funktionen eingestellt: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)

offiziell mit MT5 buiild 1860 ist dieses Codestück nicht relevant.

Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
  • 2018.06.14
  • www.mql5.com
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий15 июня 2018 года будет опубликов...