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

 

Ich habe begonnen, einen Wrapper für Funktionen zum Öffnen und Ändern von Aufträgen zu schreiben (ich dachte, das würde meine Probleme mit der Rückgabe von Werten durch diese Operatoren beheben), aber es gibt das gleiche Problem.

Erklären Sie, was das Problem ist (egal was ich schreibe, es gibt immer ein Problem mit der Rückgabe von Werten aus OrderSend, OrderSelex und ModifyOrder)

Wrapper-Code .

int start()

{

wenn (Signal == 1)

{

OrderSendX(Symbol(),OP_BUY,0.1,Ask,0,500,500,"123",123,0,Red);

}

zurück(0);

}

//-----------------------------------------------

int OrderSendX (string symbol,int cmd, double volume,double price,int slippage,double stoploss,double takeprofit,string comment,

int magic,datetime expiration,color arrow_color)

{

int err=GetLastError();

err = 0;

bool exit_loop = false;

int ticket = -1;

int Wiederholungsversuch = 10;

int cnt = 0;

if(cmd == OP_BUY || cmd == OP_SELL) //Überprüfung der Art der zu eröffnenden Bestellung

{

while(!exit_loop)

{

ticket = OrderSend(symbol,cmd,volume,price,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err = GetLastError();

switch(err)

{

case ERR_NO_ERROR:

exit_loop = true;

Pause;

{ case ERR_SERVER_BUSY:

case ERR_NO_CONNECTION:

case ERR_INVALID_PRICE:

Fall ERR_BROKER_BUSY:

Fall ERR_TRADE_CONTEXT_BUSY:

cnt++;

Pause;

case ERR_PRICE_CHANGED:

case ERR_OFF_QUOTES:

Fall ERR_REQUOTE:

RefreshRates();

weiter;

Standard:

exit_loop = true;

Pause;

}

if(cnt>Retry)

exit_loop = true;

if(!exit_loop)

{

Sleep(1000);

RefreshRates();

}

sonst

{

if(err !=ERR_NO_ERROR)

{

Print("Fehler: " + err);

}

}

if(err ==ERR_NO_ERROR)

{

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

zurück(ticket);

}

Print("Fehler beim Öffnen der Bestellung nach" + cnt + "Versuchen");

zurück(-1);

}

}

}

 
Leanid Aladzyeu:

Ich habe begonnen, einen Wrapper für Funktionen zum Öffnen und Ändern von Aufträgen zu schreiben (ich dachte, das würde meine Probleme mit der Rückgabe von Werten durch diese Operatoren beheben), aber es gibt das gleiche Problem.

Erklären Sie mir, was das Problem ist (egal, was ich schrieb, ich habe immer Probleme mit der Rückgabe von Werten aus OrderSend, OrderSelex und ModifyOrder)

https://docs.mql4.com/ru/trading/ordermodify

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
            if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

OrderModify() gibt ja zurück, nein

OrderModify - Документация на MQL4
  • docs.mql4.com
OrderModify - Документация на MQL4
 

Keiner kann das erklären.

Versuchen wir es mit einem anderen Beispiel, anstatt die Hilfe 100 Mal zu kopieren.

Ich werde ein Beispiel verwenden, um die Korrekturen zu verstehen.

{

SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);

if(OrderStopLoss()!=SL)

OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);

}

nicht einfügen

"""Ticket """= OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); ist jedes Mal korrekt?

 

Und vielen Dank an alle, die versucht haben, es zu erklären.

Leider verstehe ich nicht, wie man eine Variable einer Variablen zuordnet, die als Funktion vordefiniert ist.

 
Leanid Aladzyeu:

Und vielen Dank an alle, die versucht haben, es zu erklären.

Leider verstehe ich nicht, wie man eine Variable einer Variablen zuordnet, die als Funktion vordefiniert ist.

LieberLeanid. Lernen Sie, die Hilfe zu lesen und mit Fehlern und Warnungen umzugehen. Wenn man das nicht lernt, kann man nicht einmal richtig programmieren. Dies sind die Grundlagen. Haben Sie versucht zu übersetzen, was in den Warnhinweisen steht? Verstehen Sie die Bedeutung von Funktionen, die "geprüft werden müssen"? Die Hilfe beschreibt ein korrektes Beispiel für die Handhabung dieser Funktionen. Zum Beispiel: OrderModify(). Sehen Sie sich die Hilfe an:

Rückgabewert

Sie gibt true zurück, wenn die Funktion erfolgreich abgeschlossen wurde, oder false im Falle eines Fehlers. Um Informationen über denFehlerzu erhalten, müssen Sie die FunktionGetLastError() aufrufen.

und dann folgt ein Beispiel:

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
   Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
   Print("Цена Stop Loss ордера успешно модифицирована.");

Wie Sie sehen können, wird der Rückgabewert der Funktion im if-else-Operator behandelt. Die Variable res wird nicht ohne Grund "für die Schönheit" benötigt. Es ist das Ergebnis der Ausführung einer Handelsfunktion! Die Funktion, von der Ihr Geld abhängt! Um alle möglichen Varianten korrekt zu verarbeiten (die Verarbeitung in diesem Beispiel ist nicht vorgesehen), benötigen wir also die Variable res und den von der Funktion GetLastError() zurückgegebenen Fehlercode. Die Entwickler haben absichtlich Warnungen eingefügt, um daran zu erinnern, dass es "wichtige" Funktionen gibt, die bei der Verarbeitung von Werten zu beachten sind! Beachten Sie auch, dass kein Fehler auftritt, wenn der Wert nicht geprüft wird! D.h. in diesem Fall funktioniert die Funktion wie sie ist, aber wenn eine abnormale Situation eintritt, wird sie nicht verarbeitet. Die Liste der Nicht-Standardsituationen sind Rückgabewerte der Funktion GetLastError().

Ich hoffe, dass es auf diese Weise klarer ist.

Коды возврата торгового сервера - Документация на MQL4
  • docs.mql4.com
Коды возврата торгового сервера - Документация на MQL4
 
Leanid Aladzyeu:

Ich habe begonnen, einen Wrapper für die Funktionen zum Öffnen und Ändern von Aufträgen zu schreiben (ich dachte, das würde mein Problem mit der Rückgabe von Werten von diesen Operatoren beheben), aber es gibt das gleiche Problem.

Und in diesem Fall brauchen Sie keinen Wrapper zu schreiben. Es wird keine Probleme mit der Warnung über die Überprüfung des Rückgabewerts lösen! Schauen Sie sich die Beispiele für diese Funktionen an und tun Sie dasselbe!
 
Tapochun:
Und in diesem Fall brauchen wir keinen Wrapper zu schreiben. Das Problem mit der Warnung über die Überprüfung des Rückgabewerts wird dadurch nicht gelöst! Schauen Sie sich die Beispiele für diese Funktionen an und tun Sie dasselbe!

Wie in der Referenz angegeben, gibt es einen Fehler.

Ich habe es so geschrieben und es ist in Ordnung

if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))

{

Print("Die Änderung war erfolgreich.");

}

else Print("Fehler beim Ändern der Bestellung.");

 
Code korrekt in Beiträge einfügen:Code korrekt in das Forum einfügen
 
Karputov Vladimir:
Code korrekt in Beiträge einfügen:Code korrekt in das Forum einfügen
Bitte sehr...
 
Leanid Aladzyeu:

Warum funktioniert Trawling nicht beim Verkauf, sondern beim Kauf?

Keine Fehler oder Warnungen, bei der genetischen Kompilierung.

Hier ist der Code:

void Trailing()
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }