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

 
Aleksey Vyazmikin:

Gracias. He buscado y no he podido encontrarlo...

Entonces la siguiente pregunta, digamos que el paso es 25, entonces cómo arreglar el redondeo a un número divisible por 25, ¿tal vez hay una función?

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

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

Gracias, pero no estoy usando la biblioteca comercial estándar.

 
Vladislav Andruschenko:
Sin código, sin comentarios.

Sí, eso es raro. Adjunto el archivo, pero no lo he comprobado. Es culpa mía. Ahora estoy adjuntando tanto el código como el extracto de código donde el probador da una línea con [paradas inválidas]. Quiero entender cómo funciona la estructura de MqlTradeRequest cuando se modifica la posición. En mi caso es cuando cambio de parada en el SAR. No puedo deshacerme del mensaje [Paradas no válidas] del probador. Herramienta de empalme RTS.

//+------------------------------------------------------------------+
//| Модификация 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;
              }
           }
        }
     }
Archivos adjuntos:
SAR_SAR.mq5  27 kb
 
DCodec:

Sí, eso es raro. Adjunto el archivo, pero no lo he comprobado. Es culpa mía. Ahora estoy adjuntando tanto el código como el extracto de código donde el probador da una línea con [paradas inválidas]. Quiero entender cómo funciona la estructura de MqlTradeRequest cuando se modifica la posición. En mi caso es cuando cambio de parada en el SAR. No puedo deshacerme del mensaje [Paradas no válidas] del probador. Herramienta de empalme RTS.

Este no es ese fragmento de código en el que deberíamos buscar un error, a primera vista. Lo único que me molesta es la triple selección de un mismo puesto. Es redundante.

Tiene un error en las paradas incorrectas, probablemente debería empezar su búsqueda desde el lugar donde se calculan estas paradas.

 
DCodec:

Sí, eso es raro. Adjunto el archivo, pero no lo he comprobado. Es culpa mía. Ahora adjunto tanto el código como el extracto del código donde el probador da una línea con [Paradas no válidas]. Quiero entender cómo funciona la estructura de MqlTradeRequest cuando se modifica la posición. En mi caso es cuando cambio de parada en el SAR. No puedo deshacerme del mensaje [Paradas no válidas] del probador. Empalme RTS.

Para entenderlo bien es necesario especificar qué tipo de cuenta hadge o netting

Si el tipo de cuenta fuege

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

Ha elegido una posición para el símbolo, pero puede que no sea exactamente lo que quería ver...

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

Y ahora hemos elegido la posición exacta que queríamos.

La función devuelve una entrada de la posición por índice en la lista de posiciones abiertas y selecciona automáticamente esta posición para seguir trabajando con ella mediante


A continuación, intente de nuevo elegir la posición correcta

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

De nuevo, la probabilidad de que hayas elegido la posición equivocada es muy alta

Cuando se representan las posiciones de forma independiente (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), se pueden abrir varias posiciones para cada símbolo simultáneamente. En este caso, PositionSelect seleccionará la posición con el tick más pequeño.


Para comprobar cómo se comporta la función OrderSend() en este caso, debería hacerlo, pero es mejor hacerlo como debe ser y si el error no desaparece, imprimir no sólo el código de error, sino también la entrada de la posición, el precio de la posición, el precio del nuevo stop y take. Esto es lo mínimo.

 
Alexey Viktorov:

Para una comprensión completa es necesario especificar qué tipo de cuenta hadge o netting

Gracias por sus comentarios. El tipo de cuenta es de compensación. Empalme RTS. ¿Es esa la parte difícil? Una posición en un símbolo. Puedes elegir el camino que quieras, y aún así llegarás a esa posición. No son órdenes pendientes, ¿verdad? Por eso no entiendo aún más: ¿qué pasa? He probado todas las variantes.

 
DCodec:

Gracias por los comentarios. Compensación del tipo de cuenta. Instrumento de empalme RTS. ¿Es esa la parte difícil? Una posición en un símbolo. Puedes elegir el camino que quieras, y aún así llegarás a esa posición. No son órdenes pendientes, ¿verdad? Por eso no entiendo aún más: ¿qué pasa? He probado todas las variantes.

¿No hay respuesta a esto?

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

Preguntas de los principiantes MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2017.11.22 09:29

Para comprobar cómo se comporta la función OrderSend() en este caso, hay que hacerlo y comprobarlo, pero es mejor hacerlo como debe ser y si el error no desaparece imprimir no sólo el código de error sino también la entrada de la posición, el precio de la posición, el precio del nuevo stop y la toma. Esto es lo mínimo.


 
DCodec:

Por eso no entiendo aún más - ¿QUÉ PASA? He probado todas las opciones.

Inserte esta línea donde se produce el error

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

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Peculiaridades del lenguaje mql5, sutilezas y trucos

fxsaber, 2017.02.25 16:27

Traducción de las estructuras MqlTrade a una cadena
#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:

Inserte esta línea donde se produce el error


Pegado. Aquí está el resultado del probador:

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 trato realizado [#4 comprar 1.00 RTS Splice en 98080]
2017.11.22 18:22:51.127 2016.11.09 12:00:00 orden realizada comprar 1,00 a 98080 [#4 comprar 1,00 RTS Splice a 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 [Paradas no válidas]
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 Request.magic = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Símbolo de solicitud = RTS Empalme
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Volumen de solicitud = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Precio de solicitud = 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 Solicitud.sl = 94316.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.tp = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Desviación de solicitud = 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 Solicitud.comentario =
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Petición.posición = 4
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position_by = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.deal = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.volumen = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.precio = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.oferta = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.ask = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.comment = Paradas no válidas
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Alerta: Error de modificación de posición por código de error TP y SL: 4756

 
DCodec:

Mételo. Aquí está el resultado del probador:

¿Modo servidor y probador?