[¡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 276

 
rid >> :

Al utilizar (llamar) funciones de estos archivos (ya implementados en mt4), en caso de trabajo incorrecto del EA podemos ver en el log el número del error cometido por nosotros en el código.

Por ejemplo, llamamos a la función 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 la página -https://book.mql4.com/ru/appendix/errors

Y no tendremos que buscar en todo el código, porque ya sabemos por este número - ¡dónde se comete exactamente el error!

Permítanme corregir un poco: la función GetLastError se puede llamar sin el archivo de cabecera, pero para obtener la descripción del error sin navegar por los sitios debe enlazar la biblioteca:

#include <stderr.mqh>
#include <stdlib.mqh>

...
Print("Ошибка открытия ордера BUY #", ErrorDescription(GetLastError()));
...
 
rid писал(а) >>

No ha llamado a la función correctamente.

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

Debería ser así:


Siente la diferencia (te faltó el "-1") ! y CAMBIA TU CÓDIGO.

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

¡En cuanto a tu segunda condición, yo ("sin pensar inteligentemente") 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

rid,

También entiendo por qué la segunda condición no funciona, tal vez expliqué mal el problema:

Quiero que mi EA sea capaz de comprobar si las órdenes fueron abiertas por él o no, incluso si fueron cerradas hace mucho tiempo. NumberOfPositions funciona, pero sólo cuenta el número de posiciones abiertas. (por eso no funciona)

En el código de mi EA, hay un script que abre cada posición siguiente teniendo en cuenta los datos de la posición anterior y si no había posición anterior, la primera orden debe abrirse sin esta condición (de lo contrario, el EA no arrancará). Por lo tanto, debe haber una función que entienda si al menos una orden de este EA ha sido abierta o no (incluso si la orden fue luego cerrada). Si todavía no ha habido ningún pedido (el comienzo del trabajo), entonces el primer pedido se abre sin tener en cuenta la segunda condición, y todos los pedidos posteriores se abren teniendo en cuenta la segunda condición, es decir, utilizando los datos de los pedidos anteriores.

¿Es posible modificar la función de esta manera?

 

Por favor, dígame qué muestra la función iTime.

¿Qué es ese galimatías de 10 dígitos? ¿Segundos?

¿Cómo se traduciría a año-mes-día-hora-minuto?

 

Ya veo. Puede determinar si las posiciones han estado en el historial así:

  for (int i=0; i< OrdersTotal(); i++)                          {
    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;
//выбираем из истории счета
    if (OrderSymbol() != Symbol()) continue;    
     if ( OrderMagicNumber()== Magic)                            {
              позиции = true;
                                                             }}
                  



Pero entonces tu código sólo funcionará en tester. Porque sino tendrás que cambiar el magik cada vez que enciendas el EA online.

Al parecer, es necesario establecer el tiempo para el que se toma el historial de la cuenta.

Es decir, ¿cuándo se abrió/cerró la última operación con el magik en cuestión? ¿Fue hace seis meses o hace 24 horas?

Hay funciones que devuelven el número de barra (contando desde la barra actual hasta el final del historial) de la última operación abierta o cerrada.


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

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

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

  if ( sy=="" || sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op) {
            if ( mn<0 || OrderMagicNumber()== mn) {
              if ( t<OrderCloseTime()) t=OrderCloseTime();
            } } }} }  }  return(iBarShift( sy, tf, t, True));}

Por poner un ejemplo. He utilizado estas funciones en mi código así:
//======================================================================
// запретить торговлю - в день , если с начала текущих суток
//уже были открыты или закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 1440,-1, Magic)==0 
     ||  NumberOfBarCloseLastPos(NULL, 1440,-1, Magic)==0 )
    Trade=false;       else Trade=true;
//================================================================

O así:
//======================================================================
// запрет торговли  , если за последние 85 баров графика Н1
//т.е. за посл.85 часов)уже были открыты   позиции  или
// закрыты позиции с заданным магиком
if ( NumberOfBarOpenLastPos(NULL, 60,-1, Magic)<=85 
     ||  NumberOfBarCloseLastPos(NULL,60,-1, Magic)<=85 )
    Trade=false;       else Trade=true;
 
Señores! Ayuda! Cómo escribir el código correctamente para mostrar un mensaje de que la última vela cerrada es de color blanco (arriba) o negro (abajo). Sé que no tiene sentido, pero todavía .....

 

Hmm.luchando con el mismo problema simple...abre un mar de posiciones pero sólo necesita 1 como máximo y cuando se cierra la compra y viene una señal para abrir la venta... Gran solicitud pista y corregir lo que está mal.en el código de abajo ... ¿Dónde tengo que recetar un magik? Si no te importa, haz un ejemplo tonto, cuando la compra cruza hacia arriba (no más de 1 orden) y la venta hacia abajo tampoco más de 1. Creo que esto resolverá inmediatamente las dudas de muchos novatos. Gracias de antemano.

//---- input parameters
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   
   int ticket;
  if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
   if ( NumberOfPositions(NULL,OP_BUY)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
   return(0);
  }

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);
}
 

Otra pregunta estúpida:

- Cómo declarar un array cuyo número de elementos viene dado por una variable externa.

 
chaynik_1 >> :
Señores! Ayuda! Cómo escribir el código correctamente para mostrar un mensaje de que la última vela cerrada es de color blanco (arriba) o negro (abajo). Sé que no tiene sentido, pero todavía .....

Es así.

if ((Open[1]-Close[1])<0  ) Comment ("1 свеча =  бычья");
 
alderru >> :

Otra pregunta estúpida:

- Cómo declarar un array cuyo número de elementos viene dado por una variable externa.

https://docs.mql4.com/ru/array/ArrayResize

 
morok >> :

Hmm.luchando con el mismo problema simple...abre un mar de posiciones pero sólo necesita 1 como máximo y cuando se cierra la compra y viene una señal para abrir la venta... Gran solicitud pista y corregir lo que está mal.en el código de abajo ... ¿Dónde tengo que recetar un magik? Si no te importa, haz un ejemplo tonto, cuando la compra cruza hacia arriba (no más de 1 orden) y la venta hacia abajo tampoco más de 1. Creo que esto resolverá inmediatamente las dudas de muchos novatos. Gracias de antemano.

Pruébalo así:

(hay que estar más atento con NumberOfPositions(), por algo está escrito en la cabecera:

/| Descripción : | Descripción : Devuelve el número de posiciones.
//| Parámetros : |
//| sy - nombre del instrumento ("" o NULL - símbolo actual) |
|| op - operación ( -1 - cualquier posición) ||
//| mn - MagicNumber ( -1 - cualquier número mágico) ||
//+----------------------------------------------------------------------------+

extern int       Magic=5675;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil",16384,0,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

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);
}