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

 
Transslator #:

¡Hola!

¿Pueden decirme por qué el script para cambiar el stop loss no funciona y da error 4756?

Al mismo tiempo, el mismo script para cambiar el take profit funciona bien.

Hay un buen ejemplo sobre este tema en el manual

         request.action  =TRADE_ACTION_SLTP; // тип торговой операции
         request.position=position_ticket;   // тикет позиции
         request.symbol=position_symbol;     // символ 
         request.sl      =sl;                // Stop Loss позиции
         request.tp      =tp;                // Take Profit позиции
         request.magic=EXPERT_MAGIC;         // MagicNumber позиции

Estructura de una solicitud de operación

Modificación de SL y TP

Orden comercial para la modificación de los niveles StopLoss y/o TakeProfit. Requiere especificar 4 campos:

  • acción
  • símbolo
  • sl
  • tp
  • posición

Al modificar o cerrar una posición en el sistema de cobertura, asegúrese de especificar su ticket (MqlTradeRequest::position). En el sistema de compensación también se puede especificar el ticket, pero la posición se identifica por el nombre del símbolo.


https://www.mql5.com/ru/docs/constants/structures/mqltraderequest

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Структура торгового запроса - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
2022.08.31 13:15:39.943 2012.01.08 23:24:00   failed market sell 0.2 EURJPY [Market closed]
¿Puede decirme cómo comprobar que el mercado no está cerrado?
 
Vladimir Deryagin #:

El manual contiene un buen ejemplo sobre este tema

Al modificar o cerrar una posición en un sistema de cobertura, asegúrese de especificar su ticket (MqlTradeRequest::position). En el sistema de compensación, también se puede especificar el ticket, pero la posición se identifica por el nombre del símbolo.


https://www.mql5.com/ru/docs/constants/structures/mqltraderequest

¡Gracias por la respuesta!

Rehecho el script así:

//+------------------------------------------------------------------+
//|                                                 Modify SL TP.mq5 |
//|                                                                  |
//+------------------------------------------------------------------+
#property description "Скрипт"
#property script_show_inputs
input  int Magic_Number = 0;
input double Price_of_New_Take_Profit = 0.0;
input double Price_of_New_Stop_Loss = 0.0;
//--------------------------------------------------------------------
//--- объявление запроса и результата
//MqlTick tick;
MqlTradeRequest request;
MqlTradeResult result;
//MqlTradeCheckResult check;
//MqlDateTime tm;
//--------------------------------------------------------------------
void OnStart()
{  
//   double Position_SL,Position_TP;
//   ulong  Position_Magic = 0;
   //--- перебор всех открытых позиций
   for(int i=0; i<PositionsTotal(); i++)
   {
      if(_Symbol == PositionGetSymbol(i))
      {
         //--- параметры ордера
         ulong  Position_Ticket = PositionGetTicket(i);// тикет позиции
         string Position_Symbol = PositionGetString(POSITION_SYMBOL); // символ 
         int    Symbol_Digits = (int)SymbolInfoInteger(Position_Symbol,SYMBOL_DIGITS); // количество знаков после запятой
         ulong  Position_Magic = PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции
         double Position_Volume = PositionGetDouble(POSITION_VOLUME);    // объем позиции
         double Position_SL = PositionGetDouble(POSITION_SL);  // Stop Loss позиции
         double Position_TP = PositionGetDouble(POSITION_TP);  // Take Profit позиции
         ENUM_POSITION_TYPE Position_Type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);  // тип позици   
         if(Position_Magic == Magic_Number)
         {
            if (Position_SL != Price_of_New_Stop_Loss || Position_TP != Price_of_New_Take_Profit)
            {
               //--- обнуление значений запроса и результата
               ZeroMemory(request);
               ZeroMemory(result);
               //--- установка параметров операции
               request.action   = TRADE_ACTION_SLTP; // тип торговой операции
               request.position = Position_Ticket;   // тикет позиции
               request.symbol   = Position_Symbol;     // символ 
               request.sl       = NormalizeDouble(Price_of_New_Stop_Loss,_Digits); // Stop Loss позиции
               request.tp       = NormalizeDouble(Price_of_New_Take_Profit,_Digits); // Take Profit позиции
               request.magic    = Position_Magic;         // MagicNumber позиции
               //--- вывод информации о модификации
               Print(TimeToString(TimeCurrent()), " Modify ", request.position,
                     " with Position_Magic ", IntegerToString(Position_Magic));
               Print("  SL ", DoubleToString(Position_SL,_Digits), " -> ", DoubleToString(request.sl,_Digits),
                     ";  TP ", DoubleToString(Position_TP,_Digits), " -> ", request.tp);
               //--- отправка запроса и вывод информации об ошибке, если отправить запрос не удалось
               if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError());
               //--- информация об операции   
               PrintFormat("retcode=%u  deal=%I64u  order=%I64u", result.retcode, result.deal, result.order);
            }
         }
      }  
   }
   //--- Цикл, пока скрипт не будет прерван
   while(!IsStopped()) Comment("Сделано");
   Comment("");
}
// End OnStart()
//+------------------------------------------------------------------+

Take profit cambia bien. Pero cuando se intenta cambiar el stop loss con un valor establecido explícitamente, se genera el error 4756, y en el registro es:


 
Transslator #:

El take profit cambia perfectamente. Pero cuando se intenta cambiar el stop loss con un valor explícitamente establecido, se genera el error 4756, y en el log es:


¿Cuál es el precio Ask en este momento?
 
Sergey Gridnev #:
¿Cuál es el precio Ask en este momento?
La posición está abierta al precio de 0,85098. La misma historia en otros pares, y a diferentes distancias del stop.
 
Transslator #:
La posición se abrió al precio de 0,85098. Lo mismo ocurre con otros pares y a diferentes distancias del stop.
No importa a qué precio se abra la posición, lo importante es el precio en el momento de modificar el stop. Para una posición de venta es el precio Ask.
 
Sergey Gridnev #:
No importa a qué precio se abra la posición, lo que importa es el precio en el momento de la modificación del stop. Para una posición de venta, este es el precio Ask.
Esto es forex, el precio actual cambia constantemente, pero obviamente está lejos del stop que se está colocando.
 
Transslator #:
Esto es forex, el precio actual cambia constantemente, pero está deliberadamente lejos del stop colocado.
Así que imprime los precios antes de intentar modificar la posición, y veremos si están lejos del stop.
 
Sergey Gridnev #:
Así que imprime los precios antes de intentar modificar la posición, y podremos ver si están lejos del stop.

Muchas gracias, la cuestión está resuelta. Mi falta de atención, me confundí en la rejilla de órdenes. Todo funciona, y el primer script también.

 

¡Hola!

¿Podríais aconsejarme cómo mostrar el valor de un parámetro en el informe del optimizador al probar/optimizar un Asesor Experto en MT4? Necesito determinar el nivel real de Drawdown durante la optimización y verlo en el informe de optimización, no Drawdown al cerrar posiciones.