Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1028

 

¿Por qué el EA no puede cambiar el precio de la orden pendiente (sell stop) a uno más rentable?


Esta es la función que define la necesidad de mover el precio abierto de una orden pendiente

if(orders_total > 0 && position_total == 0)
     {
      OrderGetTicket(0)
      if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP)
        {
         if(OrderGetDouble(ORDER_PRICE_OPEN) - SymbolInfoDouble(_Symbol,SYMBOL_ASK) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_ASK) + ((double)dist * _Point));
        }
      else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
        {
         if(SymbolInfoDouble(_Symbol,SYMBOL_BID) - OrderGetDouble(ORDER_PRICE_OPEN) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_BID) - ((double)dist * _Point));
        };
     };


... y esta es la función que ya mueve el precio abierto de la orden pendiente

void Mode_Order(string act, double price)
  {
   
   MqlTradeRequest request; ZeroMemory(request);
   MqlTradeResult  result;  ZeroMemory(result);
   
   request.symbol = _Symbol;
   
   if(act == "S")
     {
      request.action   = TRADE_ACTION_SLTP;
      request.position = PositionGetTicket(0);
      request.sl       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) - ((double)stop * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) + ((double)stop * _Point));
      request.tp       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) + ((double)profit * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) - ((double)profit * _Point));
     }
   else
     {
      request.action   = TRADE_ACTION_MODIFY;
      request.position = OrderGetTicket(0);
      request.price    = NormalizeDouble(price,_Digits);
     };
   
   if(!OrderSend(request,result)) Print("Не удалось изменить параметры ордера. Код ошибки "+(string)result.retcode);
   
  }
 
Alexandr Sokolov:

¿Por qué el EA no puede cambiar el precio de la orden pendiente (sell stop) a uno más rentable?


Esta es la función que define si el precio abierto de una orden pendiente debe moverse


... Y esta es la función que ya mueve el precio abierto de la orden pendiente

¿Es esta orden la única? ¿Funciona la modificación del SLTP? Si no es así, hay que normalizar la toma y la parada

¿Dist1 es igual a qué? Aquí se debe establecer el orden en lugar de la posición

request.position = OrderGetTicket(0);
 
Aleksey Mavrin:

¿Es la orden la única? ¿Funciona la modificación del SLTP? Si no es así, hay que normalizar la toma y parar

¿Dist1 es igual a qué? Debemos establecer el orden en lugar de la posición

¡Muchas gracias! No me había fijado en eso, parece ser una nimiedad - pero no funciona sin ella


... La orden es la única, todo funciona, el único problema era mover la orden pendiente

 
Alexandr Sokolov:

¡Muchas gracias! No me había dado cuenta de eso, aparentemente una cosa pequeña - pero no funciona sin ella


... La orden es la única, todo funciona, el único problema era mover la orden pendiente

1. Por favor 2. Hmm, lo normalizaré de todos modos, contra el pecado. Su precio se obtiene del entero multiplicado por un doble normalizado, en el caso general aparentemente también se obtiene un doble normalizado, pero he leído en algún sitio que no siempre, un par de veces al año puede llegar

algo así como 1,13250000000000000000001

y luego los problemas, en el momento adecuado, cuando la tendencia más poderosa no funciona, y la hipoteca de nuevo, hola)))

Podría estar equivocado, pero yo mismo tranquilizo y normalizo siempre.

 
Aleksey Mavrin:

1. Por favor 2. Hmmm, de todos modos estoy normalizando por el pecado. Se obtiene el precio de un entero multiplicado por un doble normalizado, en el caso general aparentemente también se obtiene un doble normalizado, pero leí en algún sitio que no siempre, un par de veces al año se puede obtener

algo así como 1,13250000000000000000001

y luego los problemas, en el momento adecuado, cuando la tendencia más poderosa no funciona, y la hipoteca de nuevo, hola)))

Podría estar equivocado, pero yo mismo tranquilizo y normalizo siempre.

Las operaciones matemáticas sobre dos números normalizados dan resultados no normalizados.

Para obtener un resultado normalizado de las operaciones matemáticas con números reales, debe devolver el valor normalizado de estas operaciones matemáticas.

Norm(1.11111) + Norm(2.22222) = NoNorm(res)

Norma(1.11111 + 2.22222) = Norma(res)

 

@ Artyom Trishkin

He adjuntado el código con este tema.

He encontrado su código en la base de código. Hubo un problema al cambiar el código.

La parte de entrada tiene las siguientes entradas:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input eTradeType                                    Inp_element_12357534       = TRADETYPE_BUY;                        // First Trade Type
input double                                        Inp_element_3632865        = 0.01;                                 // Start Lot
input double                                        Inp_element_12844407       = 1.0;                                  // Lot Multiplier
input #ifdef __MQL4__ int #else long #endif          Inp_element_2542795        = 400;                                  // Grid Step, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3135636        = 100;                                  // Target, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3634918        = 7373;                                 // Magic
sinput string                                       Inp_element_3640359        = "Grid EA";                            // Comment
//+------------------------------------------------------------------+

Quiero que este parámetro cambie mientras se ejecuta el programa: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Rejilla de pasos, puntos.

Por favor, indíqueme qué puedo hacer para cambiar este parámetro cada vez que lo ejecute.

Archivos adjuntos:
Manage.mq5  859 kb
 
jaffer wilson :

@ Artyom Trishkin

He adjuntado el código con este tema.

He encontrado su código en la base de código. Hubo un problema al cambiar el código.

La parte de entrada tiene las siguientes entradas:

Quiero que este parámetro cambie mientras se ejecuta el programa: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Rejilla de pasos, puntos.

Por favor, indíqueme qué puedo hacer para cambiar este parámetro cada vez que lo ejecute.

Sinceramente, la cuestión no está clara.

¿Quiere cambiar el parámetro de entrada Inp_element_2542795 cada vez que inicie el asesor?

Bueno, cámbialo en la configuración del asesor cuando se inicie. O bien, si el asesor ya está en marcha y quiere cambiar este parámetro, pulse F7: aparecerá la ventana de configuración del asesor y cambie este parámetro en ella.

 
Artyom Trishkin:

Sinceramente, la cuestión no está clara.

¿Quiere cambiar el parámetro de entrada Inp_element_2542795 cada vez que inicie el asesor?

Bueno, cámbialo en la configuración del asesor cuando se inicie. O bien, si el asesor ya está en marcha y quiere cambiar este parámetro, pulse F7: aparecerá la ventana de configuración del asesor y cambie este parámetro en ella.

Permítanme aclarar. Supongo que el problema es la traducción. En realidad, es un valor de entrada, y no entiendo dónde se utiliza este valor para el cálculo. No quiero que cada vez que se utilicen 400 puntos. Quiero seguir cambiando los valores. Quiero cambiar los valores a un cálculo adecuado. ¿Pueden ayudarme donde puedo hacer los cambios para que el valor sea dinámico durante la ejecución del programa?

 
jaffer wilson :

Permítame aclararlo. Creo que el problema está en la traducción. En realidad es un valor de entrada. y no entiendo donde se utiliza este valor para calcular. No quiero que se utilicen 400 puntos cada vez. Quiero seguir cambiando los valores. Quiero cambiar los valores para un cálculo adecuado. ¿Pueden ayudarme donde puedo hacer los cambios para que el valor sea dinámico mientras el programa se ejecuta?

Crea una nueva variable global. Establece el valor del parámetro de entradaInp_element_2542795 en él:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
cRunner *Runner;
long g_element_2542795=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//===============
   g_element_2542795=Inp_element_2542795;
//===============
/* DEBUG MACROS' START */ TRACEERRORS_START
//===============
 
//===============
   Runner=new cRunner;
//===============
 

y reemplazar toda la entrada de la cadena Inp_element_2542795 con esta nueva variable g_element_2542795 usando Ctrl + H

 

¡Hola!

Recién estoy aprendiendo MQL5, así que pido ayuda.

Hay una clase -https://www.mql5.com/ru/code/18721(Vlad Karputova). Gracias a Vladimir.

Calcula el beneficio (en puntos, en la moneda del depósito, el swap y la comisión), pero no tiene ningún filtro para Magik.

He añadido el filtro para Magik (no estoy seguro de que sea correcto, así que no quiero publicarlo con errores).

Tengo el resultado.

Search deals with POSITION_IDENTIFIER 53821539
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11164, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11170, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53821617
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11159, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11172, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.39
Profit in points -13.0, commission -0.10, swap 0.00, profit -0.39

Search deals with POSITION_IDENTIFIER 53821750
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11163, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11169, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53847372
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10971, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11002, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.93
Profit in points -31.0, commission -0.10, swap 0.00, profit -0.93

Search deals with POSITION_IDENTIFIER 53848455
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10997, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10741, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit 7.68
Profit in points 256.0, commission -0.10, swap 0.00, profit 7.68

Search deals with POSITION_IDENTIFIER 53856130
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10735, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10769, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -1.02
Profit in points -34.0, commission -0.10, swap 0.00, profit -1.02
All_Profit in points 166.0, All_commission -0.60, All_swap 0.00, All_profit 4.98
All_Profit in points 0.0, All_commission 0.00, All_swap 0.00, All_profit 0.00

El resultado de la clase original y la clase con filtro de Magik coinciden. Pero, hay un punto aquí.

1.Por qué los oficios OUT tienen cero magia.

2.Si he corregido incorrectamente la clase (añadiendo un magik) - por favor, haz el cambio requerido a la clase original y publícalo.

(Y sería bueno pasar un símbolo a la clase como parámetro).

Gracias por la ayuda.

HistoryPositionInfo version 2
HistoryPositionInfo version 2
  • www.mql5.com
Новое в версии 2: функция GetProfitInPoints осталась, но рекомендуется теперь использовать новую функцию GetProfit: Функция GetProfit возвращает для восстановленной позиции, кроме прибыли в пунктах: комиссию, своп и прибыль в деньгах. Класс CHistoryPositionInfo предназначен для получения прибыли позиции в пунктах, комиссии, свопа и прибыли в...