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

 
Valeriy Yastremskiy:

Si hay 1440 órdenes al día, debería haber una comprobación al inicio del minuto, o más sencillamente a la aparición de la barra de minutos. Y en este punto para abrir. No lo tiene, por lo que el EA abre una posición en cada tick, lo cual es una condición estricta en sí misma, según la condición de nuestro símbolo en la cotización actual. Esta condición puede no cumplirse, y las garrapatas se perderán. Y en algún momento, se producirá un error crítico.

También, el tipo de ejecución de la orden (orden de realizar una operación para crear una posición) Todo o nada.

Lo entiendo. Gracias por la ayuda.

También pensé que era difícil para mi EA abrir tantas órdenes. He intentado limitar el número de pedidos con este código

MqlDateTime time_now;
TimeCurrent(time_now);
if(time_now.hour==10&&&&time_now.min==0)
{
//открыть ордер
}

Es decir, abrir una orden sólo a las 10:00. Pero el resultado es el mismo.

2020.10.27 10:25:17.548 Core 1 272 Mb de memoria utilizada incluyendo 36 Mb de datos históricos, 64 Mb de datos de tick


input int      StopLoss=30;      // Stop Loss
input int      TakeProfit=100;   // Take Profit
input double   Lot=0.1;          // Количество лотов для торговли
int A;    //

//+------------------------------------------------------------------+
void OnTick()
  {
//Print( "====================================================",  TimeCurrent() )   ;
//--- Объявляем структуры, которые будут использоваться для торговли
   MqlTick latest_price;       // Будет использоваться для текущих котировок
   MqlTradeRequest mrequest;   // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;     // Будет использоваться для получения результатов выполнения торговых запросов
   MqlDateTime time_now;     // Будет использоваться для
   
 TimeCurrent(time_now);  
 if(!SymbolInfoTick(_Symbol,latest_price))
 if(time_now.hour==10&&time_now.min==0)
   {
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.ask + StopLoss*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask - TakeProfit*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.type_filling = ORDER_FILLING_RETURN;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=100;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
     OrderSend(mrequest,mresult);
    }   
     return;
  }

¿Qué estoy haciendo mal?

He coloreado el código que he añadido y cambiado

Esto es lo que dice el archivo de registro

FD 0 10:57:05.453 Core 1 proceso de agente iniciado en 127.0.0.1:3000

CS 0 10:57:05.453 Core 1 conectándose a 127.0.0.1:3000

JD 0 10:57:05.953 Core 1 conectado

OD 0 10:57:05.975 Core 1 autorizado (agente build 2650)

JL 0 10:57:05.980 Tester EURUSD,M1 (Alpari-MT5-Demo): prueba de experts\GRAAL.ex5 desde 2020.09.01 00:00 hasta 2020.09.10 00:00

ON 0 10:57:05.997 Core 1 sincronización común completada

CJ 0 10:57:06.223 Probador la calidad del historial analizado es del 100%.

LM 0 10:57:06.248 Core 1 MetaTester 5 iniciado en 127.0.0.1:3000

EJ 0 10:57:06.248 Core 1 inicialización terminada

LS 0 10:57:06.248 Core 1 login (build 2650)

KO 0 10:57:06.248 Core 1 4372 bytes de información de cuenta cargada

LI 0 10:57:06.248 Core 1 1482 bytes de parámetros de comprobación cargados

FN 0 10:57:06.248 Core 1 1724 bytes de parámetros de entrada cargados

OK 0 10:57:06.248 Core 1 423 bytes de lista de símbolos cargados (72 símbolos)

HO 0 10:57:06.248 Core 1 archivo experto añadido: Experts\GRAAL.ex5 13680 bytes cargados

CP 0 10:57:06.248 Núcleo 1 4077 Mb disponibles, 50 bloques establecidos para generar ticks

DI 0 10:57:06.248 Core 1 calcular el beneficio en pips, depósito inicial 10000, apalancamiento 1:100

LP 0 10:57:06.248 Core 1 inicializado con éxito

RI 0 10:57:06.248 Core 1 15 Kb de datos de inicialización totales recibidos

DN 0 10:57:06.248 Core 1 Intel Core i5-6400 @ 2.70GHz, 7883 MB

IG 0 10:57:06.248 Core 1 EURUSD: símbolo a sincronizar

RS 0 10:57:06.248 Core 1 EURUSD: símbolo sincronizado, 3720 bytes de información de símbolo recibidos

OL 0 10:57:06.248 Core 1 EURUSD: carga 27 bytes de datos históricos para sincronizar en 0:00:00.003

EK 0 10:57:06.248 Core 1 EURUSD: historial sincronizado desde 2019.01.02 hasta 2020.10.23

LK 0 10:57:06.248 Core 1 EURUSD,M1: la caché del historial está asignada para 628432 barras y contiene 619175 barras desde 2019.01.02 06:00 hasta 2020.08.31 23:59

LH 0 10:57:06.248 Core 1 EURUSD,M1: el historial comienza a partir de 2019.01.02 06:00

LN 0 10:57:06.248 Core 1 EURUSD,M1 (Alpari-MT5-Demo): Generación de estados de barra OHLC. Ejecución de OnTick sólo en el inicio de la barra

JM 0 10:57:06.248 Core 1 EURUSD,M1: prueba de experts\GRAAL.ex5 de 2020.09.01 00:00 a 2020.09.10 00:00 iniciada con entradas:

LS 0 10:57:06.248 Core 1 StopLoss=30

PL 0 10:57:06.248 Core 1 TakeProfit=100

FJ 0 10:57:06.248 Core 1 Lot=0.1

DP 0 10:57:06.248 Core 1 saldo final 10000.00 pips

EE 0 10:57:06.248 Core 1 EURUSD,M1: 39553 ticks, 10068 barras generadas. Entorno sincronizado a las 0:00:00.031. Prueba superada en 0:00:00.247 (incluyendo el preprocesamiento de ticks 0:00:00.016).

DE 0 10:57:06.248 Core 1 EURUSD,M1: tiempo total desde el inicio de la sesión hasta el final de la prueba 0:00:00.278 (incluyendo 0:00:00.031 para la sincronización de los datos del historial)

NQ 0 10:57:06.248 Core 1 272 Mb de memoria utilizada, incluyendo 36 Mb de datos históricos, 64 Mb de datos de ticks

KE 0 10:57:06.248 Core 1 archivo de registro "C:\sers\a1960\AppData\Roaming\MetaQuotes\Tester36A64B8C79A6163D85E6173B54096685\Agent-127.0.0.1-3000\logs\20201027.log" escrito

OS 0 10:57:06.260 Core 1 conexión cerrada


 
Denis Diakonov:

¿Puede decírmelo, por favor?

¿Por qué no se actualiza la hora del servidor cuando llegan nuevos ticks?

En el momento en que el EA se inicia, todo funciona como debería, pero luego el tiempo pasa, pero el nuevo valor del minuto actual no entra en la variable.

Es decir, el Asesor Experto trabaja en función del número obtenido en la variable int M = TimeMinute(TimeCurrent());

En realidad esta línea de código es de la referencia y no funciona.

Por ejemplo, lo pongo en marcha a las 12-la horaactual devuelta por el servidor corresponde a la hora de la variable, pero entonces la variable permanece en las 12, aunque ya son 15-20 minutos en el reloj

El código es completamente mejor, más precisamente donde se crea la función y en qué función (OnInit, OnTick, OnTime) obtener el valor de los minutos y llamar a la función de impresión. Si en OnInit o fuera de los campos de la función terminal, así debe ser. Si en OnTick, imprimirá en cada tick y actualizará el valor con un nuevo minuto.

 

Ejemplo claro de la hora del servidor y el valor de la variable

Valeriy Yastremskiy:

El código es completamente mejor, más precisamente donde se crea la función y en qué función (OnInit, OnTick, OnTime) se obtiene el valor de los minutos y se llama a la función de impresión. Si en OnInit o fuera de los campos de la función terminal, así debe ser. Si en OnTick, imprimirá en cada tick y actualizará el valor con un nuevo minuto.

int M = TimeMinute(TimeCurrent());
bool TimeServer()                                                  
{  
   Print(M, " - Tекущее время сервера");
   if((M > 55 || M == 55) && (M < 59 || M == 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}

Bueno, aquí está el código completo. En la función void OnTick() se dispara al principio con la primera línea que se ejecuta.

Se activa sólo en el momento de la recompilación o de la anexión al campo de programación/borrado. Durante el resto del tiempo, la variable M mantiene el valor del minuto obtenido durante la primera ejecución del EA.

 
Denis Diakonov:

Bueno, el código aquí es todo lo que hay. El void OnTick() se activa al principio por la primera línea que se ejecuta.

Se activa sólo en el momento de la recompilación o de la unión al gráfico/ campo de borrado/ . Durante el resto del tiempo, la variable M mantiene el valor del minuto obtenido durante la primera ejecución del EA.

//--------------------------------------------------------------------
//
//--------------------------------------------------------------------
int m1,m2;
void OnTick() // Спец. функция start
  {
 // int M = TimeMinute(TimeCurrent());
//if(m1!=M)
 TimeServer();
//--------------------------------------------------------------------
  m1=m2;
   return;                            // Выход из start()
  }
//--------------------------------------------------------------------
bool TimeServer()                                                  
{  
int M = TimeMinute(TimeCurrent());
m2=M;
if(m1!=M)
   Alert (M, " - Tекущее время сервера");
   Print(M, " - Tекущее время сервера");
    if((M >= 55) && (M <= 59))
   {
   return(true);
   }
   else
   {
   return(false);
   }
}
 
Valeriy Yastremskiy:

Lo tengo, ¡gracias!

Debería haber

int M = TimeMinute(TimeCurrent());

ponerlo en el cuerpo de la función, no delante de ella asignando el valor M

 
Denis Diakonov:

Lo tengo, ¡gracias!

Debería haber

ponerlo en el cuerpo de la función, en lugar de asignar el valor M antes.

Puedes hacerlo de diferentes maneras. Leer las variables globales y locales y su visibilidad.

 

Por la tarde. Tratando de obtener el ángulo de la línea de tendencia a partir del ángulo. Aquí está el código:

void DrawLine(string name,
              datetime time1,
              double price1,
              datetime time2,
              double price2,
              double &angle)
  {
   CChartObjectTrendByAngle *line=new CChartObjectTrendByAngle();
   if(!line.Create(ChartID(),name,0,time1,price1,time2,price2))
     {
      Print(__FUNCTION__+": object line create failed. Last error: ",GetLastError());
      delete line;
      return;
     }
   
   line.Color(InpColorZoneUp);
   line.Background(false);
   line.RayLeft(false);
   line.RayRight(false);
   angle=line.Angle();
   
   /*ObjectCreate(name,OBJ_TRENDBYANGLE,0,time1,price1,time2,price2);
   double W = ObjectGet(name,OBJPROP_ANGLE);
   angle=W;*/
   lines.Add(line);
  }

ángulo es siempre 0. Independientemente de si se utilizan métodos de la biblioteca estándar o funciones incorporadas. Al mismo tiempo, se traza la línea. ¿Qué ocurre? ¿Cómo conseguir el ángulo?

 
leonerd:

Por la tarde. Tratando de obtener el ángulo de la línea de tendencia a partir del ángulo. Aquí está el código:

ángulo es siempre 0. Independientemente de si se utilizan métodos de la biblioteca estándar o funciones incorporadas. Al mismo tiempo, se traza la línea. ¿Qué ocurre? ¿Cómo consigo el ángulo?

https://www.mql5.com/ru/forum/103591

Ya veo, pero ¿cómo se calcula el ángulo?

Вопрос: TRENDBYANGLE, а где ANGLE?
Вопрос: TRENDBYANGLE, а где ANGLE?
  • 2007.06.07
  • www.mql5.com
Добрый день...
 
leonerd:

https://www.mql5.com/ru/forum/103591

Ya veo, pero ¿cómo se calcula el ángulo?

Eres un comediante.

¿A quién quiero engañar?

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Cualquier pregunta de los novatos en MQL4 y MQL5, cualquier ayuda y discusión de algoritmos y códigos

Nikolai Semko, 2020.10.26 00:34

No hay que tener miedo a la velocidad. Es sólo una condicionalidad para la conversión de tipos.
Como variante de la función de definición de ángulos:

struct PointPriceTime
  {
   double            price;
   datetime          time;
                     PointPriceTime(double p, datetime t) { price=p; time=t; };
   void              Set(double p, datetime t){ price=p; time=t;};
                     PointPriceTime(PointPriceTime &p){ price=p.price; time=p.time; };
                     PointPriceTime() { price=0.0; time=0; };
  };

double Angle(PointPriceTime &p1,PointPriceTime &p2) // возвращает угол в градусах в приведенной системе координат price-price, где по оси X 
  {                                                 // расстояние между x1 и  x2  = N*_Point, где N - количество минутных баров во временном промежутке отрезка. 
   static int tf[9]= {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
   int i=0;
   while(i<9 && SeriesInfoInteger(_Symbol,tf[i],SERIES_FIRSTDATE)>p1.time)
      i++;
   if(i==9)
     {
      Print("Время левой границы вне диапазона исторических данных");
      return DBL_MAX;
     }
   int bar1 = iBarShift(_Symbol,tf[i],p1.time);
   int bar2 = iBarShift(_Symbol,tf[i],p2.time);
   if(bar1==bar2)
      return 0.0;
   return atan((p2.price-p1.price)/((bar1-bar2)*PeriodSeconds(tf[i])*_Point/60))*180/M_PI;
  }

Después de MT5 la sensación de MT4 es simplemente horrible. El acceso a la historia está de alguna manera emasculado. Ni siquiera estoy hablando de las garrapatas.




 

¿Pueden decirme si esta selección de fuentes es posible en el indicador?