[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 275

 

La pregunta es.

Como obtener un número sin menos, si resulta que Open[1] < Close[1] y al restar Open[1]-Close[1 ] me sale el valor con un menos, como hacer para que siempre fuera un valor positivo, necesito calcular la distancia entre Open y Close ¿quizás hay otra forma?

Gracias.

 
Martingeil >> :

La pregunta es.

Como obtener un número sin menos, si resulta que Open[1] < Close[1] y al restar Open[1]-Close[1] me sale el valor con un menos, como hacer para que siempre fuera un valor positivo, necesito calcular la distancia entre Open y Close ¿quizás hay otra forma?

>> Gracias.

https://docs.mql4.com/ru/math/MathAbs

 

;) >> Gracias.

 

¡Buenos días!

Al escribir un EA para MT4, es necesario determinar programáticamente (es decir, en el código del propio EA) si al menos una orden de este EA fue abierta o no. ¿Puede indicar si existe esta función? Tal vez, si lo hay, sería algo así

Bool (se ha abierto una orden de EA con este número mágico)

{respuesta= Verdadero/Falso}

?

Expertos - ayuda, por favor - ya nos estamos devanando los sesos

P.S.- probó la opción con los números de pedido - no funcionó

 
waitra >> :

¡Buenos días!

Al escribir un EA para MT4, era necesario determinar programáticamente (es decir, en el código del propio EA) si al menos una orden de este EA estaba abierta o no. ¿Sabe si existe esta función?

¿Funcionará esta función?

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                  |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}

Ejemplo de uso: Ponemos esta función al final de nuestro código y la comprobamos cuando abrimos una posición:



if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1) {
// если нет окрытых OP_BUY позиций с заданным магиком, покупаем
ticket=OrderSend(Symbol(),0, Lots,Ask, Slippage,Bid- SL*Point,
                      Ask+ TP*Point, NULL, Magic ,0,Blue);
                                              }

Si no buscamos posiciones sino órdenes pendientes, podemos utilizar esta función

Función NúmeroDePedidos().
Esta función devuelve el número de pedidos . Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:
sy - Nombre del instrumento. Si establecemos este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa instrumento actual, y "" (por defecto) significa cualquier instrumento.
op - Tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 significa cualquier orden.
mn - Identificador del pedido (MagicNumber). El valor por defecto de -1 significa cualquier MagicNumber.

https://www.mql5.com/ru/forum/107476/page12

 

Por favor, explique qué proporcionan los archivos:

#include <stdlib.mqh>
#include <stderror.mqh>

Si es posible, de alguna manera sencilla.

Gracias.

 
Serbov писал(а) >>

Por favor, explique qué proporcionan los archivos:

Si es posible, de alguna manera sencilla.

Gracias.

son los llamados "archivos de biblioteca". estos archivos almacenan funciones de uso frecuente. se utilizan para evitar cargar el código fuente. si el archivo de biblioteca está "declarado", las funciones del archivo declarado pueden utilizarse como si estuvieran incluidas en el código fuente.

 
Serbov >> :

Por favor, explique lo que nos dan los archivos:

En la medida de lo posible, mantén la sencillez.

Gracias.

Al utilizar (llamar) una función de estos archivos (ya incorporados inicialmente en mt4) nosotros, en caso de funcionamiento incorrecto del EA, podemos ver en el log el número del error que hemos cometido en el código .

Por ejemplo, llamamos a la función GetLastError() :

ticket= OrderSend(Symbol(),OP_BUY, lots,Ask,3, SL, TP,"Name_Expert", Magic,0, clOpenBuy );
   if( ticket < 0)
 {Print("Ошибка открытия ордера BUY #", GetLastError());  } 

En este caso, si hemos cometido un error en el código o hemos establecido parámetros externos incorrectos, veremos el número de este error en el registro.

Por ejemplo, 130.

Y la decodificación del número se puede encontrar en -https://book.mql4.com/ru/appendix/errors

Y no hace falta repasar todo el código, porque ya sabemos dónde se produce el error.

 
rid писал(а) >>

¿Funcionará esta función?


Ejemplo de uso: ponemos la función en sí misma al final del código (fuera de la función START) y luego la comprobamos al abrir una posición:



Si no buscamos posiciones sino órdenes pendientes, podemos utilizar

Función NúmeroDePedidos().
Esta función devuelve el número de pedidos . Puede limitar la lista de órdenes a comprobar mediante los parámetros de la función:
sy - Nombre del instrumento. Si especifica este parámetro, la función sólo comprobará las órdenes del instrumento especificado. NULL significa instrumento actual, y "" (por defecto) significa cualquier instrumento.
op - Tipo de orden pendiente. Valores válidos: OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT, OP_SELLSTOP o -1. El valor por defecto de -1 significa cualquier orden.
mn - Identificador del pedido (MagicNumber). El valor por defecto -1 significa cualquier MagicNumber.

https://www.mql5.com/ru/forum/107476/page12

Muchas gracias por el consejo, lo probamos pero no funcionó, por favor revisa si hay un error en alguna parte del código:

bool Open_Buy()

{

   bool res=false;    


if( условие_1)        { 

       if ( NumberOfPositions(NULL, Magic)< 1) // если нет открытых позиций с заданным магиком

          { res=true; }}

else  

   {

    if( условие_1) 

       { 

       if ( NumberOfPositions(NULL, Magic)> 1) // если советник уже открывал позиции

       {

          if ( условие_2)              { 

             res=true; }

           } 

}}

return( res);

}

Si queremos comprobar si hay una condición de venta o de compra y no hemos abierto o cerrado una orden, en este caso, sólo funcionará la primera condición. Y si el EA ya ha abierto órdenes en el pasado, entonces, cuando se abre una orden, las primeras + segundas condiciones deberían activarse.

He mirado el enlace que me has proporcionado, ¿quizás el ExistOrders(); sea más adecuado?

(pero sinceramente no pude ubicarlo, ya que aparentemente carezco de la habilidad por el momento).

 

No ha llamado a la función correctamente.

Su función se llama así: if (NumberOfPositions(NULL,Magic)> 1)

Debería ser así:

if( условие_1)        { 

       if ( NumberOfPositions(NULL,-1, Magic)< 1) 
// если нет открытых позиций с заданным магиком

          { res=true; }}

Siente la diferencia (has omitido "-1") ! y RECIBE TU CÓDIGO.

Para controlarlo, puede imprimir un comentario en el gráfico. Por ejemplo, así (al principio de la función START).

Comment ("Количество текущих открытых советником позций = ",
                                  NumberOfPositions(NULL,-1,Magic)  );
Magic_2=Magic*3;
En cuanto a tu segunda condición, yo ("sin pensarlo mucho") pondría un mago diferente y una función separada Open_Buy_2() para abrir posiciones por la segunda condición !

El código de la segunda condición sería el siguiente

 if ( условие_2)                          { 
  if ( NumberOfPositions(NULL,-1, Magic)== 1)   {
    if ( NumberOfPositions(NULL,-1, Magic_2)< 1) { 
..... ..... 
Razón de la queja: