Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 404

 

Empecé a escribir un wrapper para las funciones de apertura y modificación de pedidos (pensé que solucionaría mis problemas con la devolución de valores de estos operadores) pero existe el mismo problema.

Explicar cuál es el problema (no importa lo que escriba, siempre hay un problema con la devolución de valores de OrderSend, OrderSelex y ModifyOrder)

Código de envoltura .

int inicio()

{

si (señal == 1)

{

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

}

return(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 Reintento = 10;

int cnt = 0;

if(cmd == OP_BUY || cmd = OP_SELL) //comprobar el tipo de orden a abrir

{

while(!exit_loop)

{

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

err = GetLastError();

switch(err)

{

caso ERR_NO_ERROR:

exit_loop = true;

romper;

{ caso ERR_SERVER_BUSY:

caso ERR_NO_CONNECTION:

caso ERR_INVALID_PRICE:

caso ERR_BROKER_BUSY:

caso ERR_TRADE_CONTEXT_BUSY:

cnt++;

romper;

caso ERR_PRICE_CHANGED:

caso ERR_OFF_QUOTES:

caso ERR_REQUOTE:

RefreshRates();

continuar;

por defecto:

exit_loop = true;

romper;

}

if(cnt>Retry)

exit_loop = true;

if(!exit_loop)

{

Sleep(1000);

RefreshRates();

}

si no

{

if(err !=ERR_NO_ERROR)

{

Print("Error : " + err);

}

}

if(err ==ERR_NO_ERROR)

{

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

return(ticket);

}

Print("Error al abrir la orden después de" + cnt + "intentos");

return(-1);

}

}

}

 
Leanid Aladzyeu:

Empecé a escribir un wrapper para las funciones de apertura y modificación de pedidos (pensé que solucionaría mis problemas con la devolución de valores de estos operadores) pero existe el mismo problema.

Explícame cuál es el problema (no importa lo que haya escrito, siempre tengo problemas con la devolución de valores de OrderSend, OrderSelex y 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() devuelve sí , no

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

Nadie puede explicarlo.

Intentemos otro ejemplo en lugar de copiarme la ayuda 100 veces.

¿Cómo se debe corregir? Utilizaré un ejemplo para entender las correcciones

{

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

if(OrderStopLoss()!=SL)

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

}

no insertar

"""ticket"""= OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); cada vez es correcto?

 

Y gracias a todos los que han tratado de explicar .

Lamentablemente no entiendo cómo designar una variable a una variable predefinida como función.

 
Leanid Aladzyeu:

Y gracias a todos los que han tratado de explicar .

Lamentablemente no entiendo cómo designar una variable a una variable predefinida como función.

QueridoLeanid. Aprende a leer la ayuda y a trabajar con errores y advertencias. Si no aprendes a hacerlo, ni siquiera programarás bien. Esto es lo básico. ¿Ha intentado traducir lo que está escrito en las advertencias? ¿Comprende el significado de las funciones que "hay que comprobar"? La ayuda describe un ejemplo correcto de manejo de estas funciones. Por ejemplo, OrderModify(). Mira la ayuda:

Valor de retorno

Devuelve true si la función se completa con éxito o false en caso de error. Para obtener información sobreel error, es necesario llamar a la funciónGetLastError().

y luego sigue un ejemplo:

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

Como puede ver, el valor de retorno de la función se maneja en el operador if-else. La variable res es necesaria "para la belleza" por una razón. Es el resultado de la ejecución de una función comercial. La función de la que depende su dinero En consecuencia, para procesar correctamente todas las posibles variantes (el procesamiento en este ejemplo no se proporciona), necesitamos la variable res y el código de error devuelto por la función GetLastError(). Los desarrolladores incluyeron intencionadamente advertencias como recordatorio de que hay funciones "importantes" a las que hay que prestar atención para procesar los valores! También hay que tener en cuenta que si el valor no se comprueba no habrá ningún error! Es decir, en este caso, la función funcionará tal cual, pero si se produce una situación anormal, no se procesará. La lista de situaciones no estándar son códigos de retorno de la función GetLastError().

Espero que quede más claro de esta manera.

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

Empecé a escribir un wrapper para las funciones de apertura y modificación de órdenes (pensé que solucionaría mi problema con la devolución de valores de estos operadores) pero hay el mismo problema.

Y no es necesario escribir un wrapper en este caso. No resolverá los problemas con la advertencia sobre la comprobación del valor de retorno. Mira los ejemplos de estas funciones y haz lo mismo.
 
Tapochun:
Y en este caso no necesitamos escribir un wrapper. No resolverá el problema de la advertencia sobre la comprobación del valor de retorno. Echa un vistazo a los ejemplos de estas funciones y haz lo mismo.

Como se indica en la referencia da un error.

Lo escribí así y está bien

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

{

Print("La modificación fue exitosa");

}

else Print("Error al modificar la orden.");

 
Insertar código correctamente en los mensajes:Insertar código correctamente en el foro
 
Karputov Vladimir:
Insertar código correctamente en los mensajes:Insertar código correctamente en el foro
aquí tienes...
 
Leanid Aladzyeu:

¿Por qué no funciona la pesca de arrastre para vender? ¡Funciona para comprar!

No hay errores ni advertencias, en la compilación genética.

Aquí está el código:

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("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }

Razón de la queja: