Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1110

 
if(OrderSelect(ticket, SELECT_BY_TICKET)){
      double lots;
      string symbol = OrderSymbol(); 
      while(true){
         RefreshRates();
         double price;
         parseClosePrice(OrderType(), symbol, price);
         if(OrderClose(OrderTicket(), OrderLots(), price, 500)){
            break;
         }else{
            Print(GetLastError());
         }              
         Sleep(1000);
      }   

Gibt manchmal den Fehler 4108 zurück - falsches Ticket für OrderClose. Ist es möglich, dass OrderTicket() nicht mit dem Ticket in OrderSelect übereinstimmt? Die Variable Ticket kann gleich Null sein.

Es dauert lange, bis ich den Fehler reproduzieren kann, es ist einfacher zu fragen.
 
Dmitri Custurov:

Gibt manchmal den Fehler 4108 zurück - falsches Ticket für OrderClose. Ist es möglich, dass OrderTicket() nicht mit dem Ticket in OrderSelect übereinstimmt? Die Variable Ticket kann gleich Null sein.

Es dauert lange, bis ich den Fehler reproduzieren kann, es ist einfacher zu fragen.

Sie wählen eine Bestellung per Ticket aus. Sind Sie sicher, dass der ausgewählte Auftrag nicht bereits abgeschlossen ist? Aber Sie versuchen, sie wieder zu schließen ... Überprüfen Sie nach erfolgreicher Auswahl des Tickets die Schließzeit.

 
Artyom Trishkin:

Sie wählen die Reihenfolge auf dem Ticket aus. Und Sie sind sicher, dass der ausgewählte Auftrag nicht bereits abgeschlossen ist? Aber Sie versuchen, sie wieder zu schließen. Überprüfen Sie die Schließzeit nach einer erfolgreichen Auswahl auf dem Ticket.

Ich werde das überprüfen, wenn ich den Fehler reproduziere. Ich habe alle Tickets in globalen Variablen gespeichert. Wenn der Auftrag abgeschlossen ist, werden sie gelöscht. Vor OrderSelect() wird das Ticket aus globalen Variablen entnommen. Wenn das Ticket nicht in den Variablen enthalten ist, wird diese Variable auf 0 gesetzt, so dass die Bestellung nicht ausgewählt werden sollte und OrderSelect() false zurückgibt. Aber im Allgemeinen lohnt es sich, das zu überprüfen. Ich danke Ihnen.

 
Dmitri Custurov:

Ich werde das überprüfen, wenn ich den Fehler reproduziere. Ich habe alle Tickets in globalen Variablen gespeichert. Wenn der Auftrag abgeschlossen ist, werden sie gelöscht. Vor OrderSelect() wird das Ticket aus globalen Variablen entnommen. Wenn das Ticket nicht in den Variablen enthalten ist, wird diese Variable auf 0 gesetzt, so dass die Bestellung nicht ausgewählt werden sollte und OrderSelect() false zurückgibt. Aber im Allgemeinen lohnt es sich, das zu überprüfen. Ich danke Ihnen.

Es ist Standard, den Schlusskurs zu prüfen, wenn ein Auftrag per Ticket ausgewählt wird. Auf andere Weise würden Sie nicht wissen, ob der Auftrag geschlossen und aus der Liste der geschlossenen Aufträge ausgewählt ist oder ob er noch offen ist und aus der Liste der Marktaufträge ausgewählt wurde.

Am kurzsichtigsten ist es, Tickets in globalen Variablen zu speichern. Sie sollten dem Handelsumfeld entnommen werden - die aktuellen Informationen sind dort vorhanden.

 
Artyom Trishkin:

Es ist Standard, den Schlusskurs zu prüfen, wenn ein Auftrag per Ticket ausgewählt wird. Auf andere Weise können Sie nicht feststellen, ob der Auftrag geschlossen und aus der Liste der geschlossenen Aufträge ausgewählt ist oder ob er noch offen ist und aus der Liste der marktgängigen Aufträge ausgewählt wurde.

Am kurzsichtigsten ist es, Tickets in globalen Variablen zu speichern. Sie sollten dem Handelsumfeld entnommen werden - die aktuellen Informationen sind dort vorhanden.

Wenn ich wie folgt auswähle: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), wird das Problem dadurch teilweise gelöst? Ich speichere Tickets aus anderen Gründen in globalen Variablen, auch in diesem Fall habe ich sie verwendet.

 
Dmitri Custurov:

Wenn ich wie folgt auswähle: OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), wird das Problem dadurch teilweise gelöst? Ich speichere Tickets aus anderen Gründen in globalen Variablen, und ich habe sie auch in diesem Fall verwendet.

Nein, das wird es nicht - der Pool (MODE_TRADES) wird bei der Auswahl per Ticket ignoriert.

 
Dmitri Custurov:

Gibt manchmal den Fehler 4108 zurück - falsches Ticket für OrderClose. Ist es möglich, dass OrderTicket() nicht mit dem Ticket in OrderSelect übereinstimmt? Die Variable "Ticket" kann gleich Null sein.

Es dauert lange, bis ich den Fehler reproduzieren kann, es ist viel einfacher, nachzufragen.

In der Regel reicht es aus, nach Marktaufträgen zu suchen:

OrderCloseTime() == 0 //Order ist offen

OrderCloseTime() > 0 //der Auftrag ist geschlossen

bei Limit-Aufträgen sollten Sie auch den Schlusskurs überprüfen; ist dieser gleich 0, wurde der Limit-Auftrag storniert

 
Ich danke Ihnen allen für Ihre Antworten, ich habe es verstanden ))
 

Hallo!

Teilen Sie den Code mit der Methode PositionClosePartial, wenn Sie können.

Theoretisch verstehe ich, wie es funktioniert, aber ich würde gerne einen funktionierenden Code sehen.

Oder beraten Sie mich, wo ich suchen soll.

Ich danke Ihnen im Voraus.

 
odyn:

Hallo!

Teilen Sie den Code mit der Methode PositionClosePartial, wenn Sie können.

Theoretisch verstehe ich, wie es funktioniert, aber ich würde gerne einen funktionierenden Code sehen.

Oder beraten Sie mich, wo ich suchen soll.

Ich danke Ihnen im Voraus.

Eigentlich ist es nur eine einzige Codezeile. Aber dafür muss man das Positionsticket bekommen. Hier ist der Expert Advisor von OnInit, der eine Position mit 0,2 Lot eröffnet und die Hälfte der Position in OnTick schließt.

//+------------------------------------------------------------------+
//|                                                           00.mq5 |
//|                                          © 2020, Alexey Viktorov |
//|                     https://www.mql5.com/ru/users/alexeyvik/news |
//+------------------------------------------------------------------+
#property copyright "© 2020, Alexey Viktorov"
#property link      "https://www.mql5.com/ru/users/alexeyvik/news"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
ulong posTicket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
 {
  trade.SetExpertMagicNumber(111);
  trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.2, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 0.0, 0.0);
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
 {
//---
 }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
  if(PositionSelectByTicket(posTicket) && PositionGetDouble(POSITION_VOLUME) > 0.1)
    trade.PositionClosePartial(posTicket, 0.1);
 }
//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
 {
//---
  if(trans.type == TRADE_TRANSACTION_HISTORY_ADD)
   {
    if(PositionSelectByTicket(trans.position) && PositionGetInteger(POSITION_MAGIC) == 111 && PositionGetString(POSITION_SYMBOL) == _Symbol)
      posTicket = PositionGetInteger(POSITION_TICKET);
   }
 }
//+------------------------------------------------------------------+

Oder hier ist der vollständige Code der Klasse CTrade

//+------------------------------------------------------------------+
//| Partial close specified opened position (for hedging mode only)  |
//+------------------------------------------------------------------+
bool CTrade::PositionClosePartial(const ulong ticket,const double volume,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- for hedging mode only
   if(!IsHedging())
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean
   ClearStructures();
//--- check filling
   if(!FillingCheck(symbol))
      return(false);
//--- check
   if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
     {
      //--- prepare request for close BUY position
      m_request.type =ORDER_TYPE_SELL;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_BID);
     }
   else
     {
      //--- prepare request for close SELL position
      m_request.type =ORDER_TYPE_BUY;
      m_request.price=SymbolInfoDouble(symbol,SYMBOL_ASK);
     }
//--- check volume
   double position_volume=PositionGetDouble(POSITION_VOLUME);
   if(position_volume>volume)
      position_volume=volume;
//--- setting request
   m_request.action   =TRADE_ACTION_DEAL;
   m_request.position =ticket;
   m_request.symbol   =symbol;
   m_request.volume   =position_volume;
   m_request.magic    =m_magic;
   m_request.deviation=(deviation==ULONG_MAX) ? m_deviation : deviation;
//--- close position
   return(OrderSend(m_request,m_result));
  }
Dateien:
00.mq5  5 kb