[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 333

 
¡Hola queridos programadores!

El programa debe analizar los parámetros que se le han dado y mostrar el resultado en una ventana separada en forma de tabla con un conjunto de fechas. Significa que el programa debe analizar el historial y mostrar las fechas necesarias.

¿Es posible hacer esto en MQL4 o es mejor exportar el historial y analizar los datos utilizando un programa escrito en otro lenguaje?

Gracias de antemano.
 
GygaByte:


Correcto, pero como la práctica ha demostrado, no siempre.

Si el quinto decimal = 5 (1,xxxx5), el valor sigue estando distorsionado:

la pregunta sigue siendo válida...

P.D. En general, necesito asignar un valor de precio a MagicNumber... Y escriba MagicNumber - int, aquí e intente convertir por

¿Quién más puede aconsejarme?

Gracias.

La salida se realiza con un redondeo diferente, por lo que no se ve el número completo, y se piensa que algo está distorsionado. Por defecto, cuando se emiten números reales, la salida se redondea al cuarto dígito. Para números de 5 dígitos, debe redondear la salida explícitamente:

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

Mira tu propia imagen - oferta de salida sin DoubleToStr() y con DoubleToStr().

 
hoz:

Artyom y Boris, gracias por "masticar" mi pregunta. Tengo periodos en los que puedo atascarme en cosas bastante sencillas, como fue el caso esta vez...

Ahora hay una nueva pregunta.

He añadido a la función que calcula la cantidad de órdenes abiertas t, busca órdenes de un tipo especificado con beneficios especificados y compara sus beneficios con algún valor especificado (actualmente 0). Además, si no hay órdenes abiertas, se devuelven 2 banderas con valor True con los parámetros de la función FindOrders(), significa que se puede enviar una orden, pero si hay órdenes, se comprueba el beneficio para asegurarse de que es mayor que el valor establecido, si es menor que el valor establecido, se devuelven 2 banderas con valor False con los parámetros de la función FindOrders(), por lo que cuando hay órdenes perdedoras en alguna dirección, no hay inversiones en la dirección perdedora.

Después llamo a la función FindOrders() en la función de señal:

Los pedidos se han abierto del todo. La lógica parece ser correcta. Tal vez, ¿puede ver dónde me he equivocado?

Entiendo que todo se puede hacer más fácil con una función separada y puedo hacerlo. Pero quiero entender por qué no funciona en esta versión.

Víctor, no puedo entender del todo tu algoritmo, pero puedo darte algunos consejos. A mí también me pasa cuando hay un error en la lógica. El programa se detiene si resulta ser ambiguo o mutuamente excluyente en sus condiciones. Tal vez usted sabe lo que quiere, pero no puede construir la lógica del código correctamente. Busca esos fallos y anota el orden completo de tus condiciones en un papel con flechas, una por una para mayor claridad. Buena suerte.
 
borilunad:
Víctor, no puedo entender del todo tu algoritmo, pero puedo darte algunos consejos. Esto también me ocurre cuando hay un error en la lógica. El programa se detiene si resulta ser ambiguo o mutuamente excluyente en sus condiciones. Tal vez usted sabe lo que quiere, pero no puede construir la lógica del código correctamente. Busca estos fallos y anota todo el orden en el que quieres que se ejecuten las condiciones, una por una en un papel con flechas para mayor claridad. Buena suerte.


Así que hay una lógica simple. Si no hay órdenes abiertas, las órdenes serán abiertas por la señal.

Y si hay órdenes abiertas, entonces las órdenes deben ser abiertas por una señal específica, si el beneficio de las órdenes en una dirección dada (compra o venta) es mayor que un cierto valor, es decir, al menos no en menos. (He puesto 0 ahí para probar).

He encontrado un error lógico. Esto es lo que ha salido:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

Ahora las órdenes de venta se abren correctamente, pero las largas no se abren. Aunque la bandera tiene el valor de ambas variables 1, es decir, verdadero.

 

Tengo este problema con mt4.

Con el lanzamiento del software del broker mt4 (concretamente los 3 que he estado utilizando durante la última semana) en mi ordenador me aparece una ventana de "Ejecutar como usuario" en mi ordenador (lo mismo que utilizando "ejecutar como usuario"). Con cualquier selección de acción mt4 se abre normalmente.

¿Cómo puedo hacer que mt4.eh vuelva a funcionar sin esta ventana? Tal vez quien sabe o entiende lo que está mal...

 

Buenas tardes, me he encontrado con la necesidad de cancelar rápidamente todos los pedidos pendientes. OrderClose ignora las órdenes pendientes. ¿Qué operador es más cómodo de usar, y está disponible esta opción?

 
Notter:

Buenas tardes, me he encontrado con la necesidad de cancelar rápidamente todos los pedidos pendientes. OrderClose ignora las órdenes pendientes. ¿Qué operador es más cómodo de usar, y está disponible esta opción?


Sólo puede cerrar las órdenes de mercado y necesita el operador OrderDelete para eliminar las órdenes pendientes.
 

hoz

Gracias.

 
hoz:


Por lo tanto, todo es simple en su lógica. Necesitamos que si no hay órdenes abiertas, las órdenes sean abiertas por la señal.

Y si hay órdenes abiertas, entonces las órdenes deben ser abiertas por una señal específica, si el beneficio de las órdenes en una dirección dada (compra o venta) es mayor que un cierto valor, es decir, al menos no en menos. (He puesto 0 ahí para probar).

He encontrado un error lógico. Esto es lo que ha salido:

Ahora las órdenes de venta se abren correctamente, pero las largas no se abren. Aunque la bandera tiene valor de ambas variables 1, es decir, verdadero.

Victor, ¡comprueba un poco! Al comentar la compra en largo, ¡mira el registro para ver cómo funciona la venta en corto! Y viceversa, entonces vea cuál es la diferencia y descubra por qué no funciona.
 
borilunad:
¡Victor, vamos a comprobarlo! Al comentar el lado largo, ¡comprueba cómo funciona el lado corto en el registro! ¡Y viceversa, luego ver cuál es la diferencia y encontrar por qué no funciona!


Boris, si comentas una de las condiciones en int GetGeneralSignal(), la apertura es clara.

Lo he rastreado. La bandera no cambia su valor cuando la rentabilidad de las órdenes abiertas actualmente está en menos. Aquí está la función reescrita que debe establecer los valores de las banderas short y long a false, es decir, prohibirnos abrir una posición si hay órdenes minus:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

Esta es la función de llamada:

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}
Razón de la queja: