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

 
Aleksey Vyazmikin:

Ich danke Ihnen! Ich habe gesucht und konnte es nicht finden...

Dann die nächste Frage, sagen wir, der Schritt ist 25, dann, wie zu arrangieren Rundung auf eine Zahl teilbar durch 25, vielleicht gibt es eine Funktion?

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice

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

Danke, aber ich verwende nicht die Standard-Handelsbibliothek.

 
Vladislav Andruschenko:
Kein Code, keine Kommentare.

Ja, das ist seltsam. Ich habe die Datei angehängt, sie aber nicht überprüft. Mein Fehler. Ich füge nun sowohl den Code als auch den Codeauszug bei, bei dem der Tester eine Zeile mit [Ungültige Haltestellen] ausgibt. Ich möchte verstehen, wie die MqlTradeRequest-Struktur bei der Änderung von Positionen funktioniert. In meinem Fall ist es der Wechsel der Haltestelle auf SAR. Ich kann die Meldung [Ungültige Haltestellen] vom Prüfgerät nicht loswerden. RTS-Verbindungswerkzeug.

//+------------------------------------------------------------------+
//| Модификация Stop Loss открытой позиции                           |
//+------------------------------------------------------------------+
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;

   int total=PositionsTotal(); // количество открытых позиций  
   Print("total = ",total," ");
//--- перебор всех открытых позиций
   for(int i=0; i<total; i++)
     {
      if(PositionSelect(_Symbol)==true) // есть открытая позиция
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);// тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL); // символ 
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
         ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции

         if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
           {
            //--- обнуление значений запроса и результата
            ZeroMemory(request);
            ZeroMemory(result);
            //--- установка параметров операции
            request.action = TRADE_ACTION_SLTP;   // тип торговой операции
            request.position = position_ticket;   // тикет позиции
            request.symbol = position_symbol;     // символ 
            request.sl= STP;                      // Stop Loss позиции
            request.tp = 0;                       // Take Profit позиции

            //--- отсылаем ордер
            int number=OrderSend(request,result);
            // анализируем код возврата торгового сервера
            if(result.retcode==10009 || result.retcode==10008) //Request is completed or order placed
              {
               Alert("Ордер Sell успешно помещен, тикет ордера # ",result.order," ");
              }
            else
              {
               Alert("Запрос на установку ордера Sell не выполнен - код ошибки:",GetLastError());
               return;
              }
           }
        }
     }
Dateien:
SAR_SAR.mq5  27 kb
 
DCodec:

Ja, das ist seltsam. Ich habe die Datei angehängt, sie aber nicht überprüft. Mein Fehler. Ich füge nun sowohl den Code als auch einen Auszug aus dem Code bei, in dem der Tester eine Zeile mit [Invalid stops] ausgibt. Ich möchte verstehen, wie die MqlTradeRequest-Struktur bei der Änderung von Positionen funktioniert. In meinem Fall ist es der Wechsel der Haltestelle auf SAR. Ich kann die Meldung [Ungültige Haltestellen] vom Prüfgerät nicht loswerden. RTS-Verbindungswerkzeug.

Dies ist nicht das Codefragment, in dem wir auf den ersten Blick nach einem Fehler suchen sollten. Nur die dreifache Auswahl ein und derselben Position stört mich. Sie ist überflüssig.

Sie haben einen Fehler in den falschen Haltestellen, Sie sollten Ihre Suche wahrscheinlich an der Stelle beginnen, an der diese Haltestellen berechnet werden.

 
DCodec:

Ja, das ist seltsam. Ich habe die Datei angehängt, sie aber nicht überprüft. Mein Fehler. Ich füge nun sowohl den Code als auch einen Auszug aus dem Code bei, in dem der Tester eine Zeile mit [Invalid stops] ausgibt. Ich möchte verstehen, wie die MqlTradeRequest-Struktur bei der Änderung von Positionen funktioniert. In meinem Fall ist es der Wechsel der Haltestelle auf SAR. Ich kann die Meldung [Ungültige Haltestellen] vom Prüfgerät nicht loswerden. RTS Splice.

Für ein umfassendes Verständnis ist es notwendig, die Art der Aufrechnung oder des Netting zu spezifizieren

Wenn die Kontoart wasge

if(PositionSelect(_Symbol)==true) // есть открытая позиция

Sie haben eine Position für das Symbol gewählt, aber vielleicht ist es nicht genau das, was Sie sehen wollten...

ulong  position_ticket=PositionGetTicket(i);// тикет позиции

Aber jetzt haben wir genau die Position gewählt, die wir wollten.

Die Funktion liefert ein Ticket einer Position nach Index in der Liste der offenen Positionen und wählt diese Position automatisch für die weitere Arbeit mit ihr aus, indem sie


Versuchen Sie dann erneut, die richtige Position zu wählen

if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует

Auch hier ist die Wahrscheinlichkeit, dass Sie die falsche Position gewählt haben, sehr hoch

Wenn Positionen unabhängig voneinander dargestellt werden (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), können für jedes Symbol mehrere Positionen gleichzeitig geöffnet werden. In diesem Fall wählt PositionSelect die Position mit dem kleinsten Häkchen aus.


Um zu prüfen, wie sich die Funktion OrderSend() in diesem Fall verhält, sollten Sie dies tun, aber es ist besser, es so zu tun, wie es sein sollte, und wenn der Fehler nicht verschwindet, drucken Sie nicht nur den Fehlercode, sondern auch das Positionsticket, den Positionspreis, den Preis des neuen Stopps und Take. Dies ist das Minimum.

 
Alexey Viktorov:

Für ein umfassendes Verständnis müssen Sie angeben, welche Art von Kontoabgrenzung oder Netting

Ich danke Ihnen für Ihre Kommentare. Die Art des Kontos ist das Netting. RTS Splice. Ist das der schwierige Teil? Eine Position für ein Symbol. Sie können jeden Weg wählen, den Sie wollen, Sie werden trotzdem zu dieser Position gelangen. Es handelt sich doch nicht um schwebende Aufträge, oder? Deshalb verstehe ich auch nicht mehr - was ist los? Ich habe alle Varianten ausprobiert.

 
DCodec:

Vielen Dank für die Kommentare. Kontoart Netting. RTS Spleißinstrument. Ist das der schwierige Teil? Eine Position für ein Symbol. Sie können jeden Weg wählen, den Sie wollen, Sie werden trotzdem zu dieser Position gelangen. Es handelt sich doch nicht um schwebende Aufträge, oder? Deshalb verstehe ich auch nicht mehr - was ist los? Ich habe alle Varianten ausprobiert.

Gibt es keine Antwort auf diese Frage?

Forum für Handel, automatisierte Handelssysteme und Strategietests

Fragen von Anfängern MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2017.11.22 09:29

Um zu überprüfen, wie sich die OrderSend()-Funktion in diesem Fall verhält, müssen Sie dies tun und überprüfen, aber es ist besser, so zu tun, wie es sein sollte, und wenn der Fehler nicht weg ist , drucken Sie nicht nur den Fehlercode, sondern auch das Positionsticket, den Positionspreis, den Preis für den neuen Stop und Take. Dies ist das Minimum.


 
DCodec:

Deshalb verstehe ich noch weniger - WAS IST FALSCH??? Ich habe alle Optionen ausprobiert.

Fügen Sie diese Zeile an der Stelle ein, an der der Fehler auftritt

Print(ToString(request) + ToString(result));

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Eigenheiten der mql5-Sprache, Feinheiten und Tricks

fxsaber, 2017.02.25 16:27

Übersetzen von MqlTrade-Strukturen in einen String
#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeTransaction &Trans )
{
  return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
         TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
         TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
         TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
         TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
         TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +  
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +  
         TOSTRING(Result.retcode_external));
}

#undef TOSTRING
#undef TOSTRING2

 
fxsaber:

Fügen Sie diese Zeile an der Stelle ein, an der der Fehler auftritt


Eingefügt. Hier ist das Ergebnis des Testers:

2017.11.22 18:22:51.127 2016.11.09 12:00:00 exchange buy 1.00 RTS Splice at 98080 sl: 94130 (98070 / 98080 / 98070)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 deal #4 buy 1.00 RTS Splice at 98080 done (based on order #4)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 Geschäft durchgeführt [#4 buy 1.00 RTS Splice at 98080]
2017.11.22 18:22:51.127 2016.11.09 12:00:00 Auftrag ausgeführt buy 1.00 at 98080 [#4 buy 1.00 RTS Splice at 98080]
2017.11.22 18:22:53.561 2016.11.09 14:05:00:00 failed modify #4 buy 1.00 RTS Splice sl: 94130, tp: 0 -> sl: 94316, tp: 0 [Invalid stops]
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.action = TRADE_ACTION_SLTP (6)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.magic = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.Auftrag = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.symbol = RTS Spleiß
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.Volumen = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.Preis = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.stoplimit = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.sl = 94316.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.tp = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.Abweichung = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type = ORDER_TYPE_BUY (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_filling = ORDER_FILLING_FOK (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_time = ORDER_TIME_GTC (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.expiration = 1970.01.01 00:00:00
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.Kommentar =
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.Position = 4
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Anfrage.position_by = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.deal = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.Auftrag = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.Volumen = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.Preis = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.bid = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.fragen = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.Kommentar = Ungültige Haltestellen
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Ergebnis.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Alert: Positionsänderungsfehler durch TP und SL Fehlercode: 4756

 
DCodec:

Legen Sie es ein. Hier ist das Ergebnis des Testers:

Server- und Testermodus?