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

 
Roman Sharanov:

También encontré un grave inconveniente, demasiadas llamadas a CopyClose()

¿Pueden decirme cómo copiar las cotizaciones de un array de pares de divisas en un bucle?

Eso parece ser un array doble, por eso MQL no lo soporta, como %.

MQL4 parece funcionar con arrays dinámicos de dos dimensiones. Puedes cambiar la primera dimensión con ArayResize(), y pasar la segunda aCopyClose()

O una solución universal de los desarrolladores, ya que las matrices dinámicas bidimensionales no funcionan en MQL5, envolver una matriz unidimensional en una estructura y crear una matriz de tales estructuras.... Si lo consigues, considera que casi has creado una clase, y es más óptimo, una clase con métodos que cargan los datos y los almacenan en las propiedades de la clase (campos)
 
Igor Makanu:

MQL4 parece funcionar con arrays dinámicos de dos dimensiones, usa ArayResize() para cambiar la primera dimensión yCopyClose() para cambiar la segunda.

o una solución universal de los desarrolladores, ya que las matrices dinámicas de 2 dimensiones no funcionan en MQL5, envolver una matriz unidimensional en una estructura y crear una matriz de tales estructuras.... Si lo consigues, considera que casi has creado una clase, y es más óptimo, una clase con el método que carga los datos por sí mismo y los almacena en las propiedades de la clase (campos)

Gracias y lo intentaré

 

Otra pregunta sobre el indicador, no sé qué más hacer aquí

Necesito imprimir la diferencia entre el cierre de los pares introducidos y la media móvil de los mismos.

No sé qué más hacer.

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots 2
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_type2 DRAW_LINE
#property indicator_style2 STYLE_SOLID
#property indicator_width1 1
#include <MovingAverages.mqh>

input string active_1 = "EURUSD";
input string active_2 = "USDJPY";
input ENUM_TIMEFRAMES timeframe = PERIOD_H1;
input int ma_period = 30;

double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, dataBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, maBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, firstBuffer, INDICATOR_CALCULATIONS);
   SetIndexBuffer(3, secondBuffer, INDICATOR_CALCULATIONS);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---

   CopyClose(active_1,timeframe,0,rates_total,firstBuffer);
   CopyClose(active_2,timeframe,0,rates_total,secondBuffer);

   int first, bar;
   if(prev_calculated == 0) first = begin; else first = prev_calculated - 1;

   for(bar = first; bar<rates_total; bar++){
      dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar];
   }

   ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer);
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Los pedidos deberían enumerarse en un bucle, no en cada tic... Para ser más precisos, llegó un tick y todas sus órdenes se cuentan en el bucle: for(j=0;j<OrderTotal;j++)

OrdersTotal() muestra cuántas órdenes están abiertas (incluyendo órdenes pendientes, incluyendo órdenes en todos los símbolos... en total... Aquí se muestra cuántas órdenes se abren en el terminal, es decir, cuántas )))).

La numeración de los pedidos es como en las matrices, de 0 a OrdersTotal()-1 - este es el último pedido, y probablemente tenga un número de ticket inexistente [OrdersTotal()] o alguna otra información en el diario en cada tic, que es difícil de adivinar.

Sí, y quiero que pase por todos los pedidos. El funcionamiento era un poco diferente al principio, pero lo he simplificado al máximo con la esperanza de encontrar la causa y solucionarlo. El retroceso consecutivo completo sólo ocurre cuando los ticks son escasos o después de que elimine el EA del gráfico y no entren nuevos ticks.

Siempre he pensado que si el EA ha entrado en el cuerpo de una función, no debería reaccionar a otros ticks hasta que salga del bucle, pero parece que no es así. ¿Cómo puedo evitar esta situación?

int prueba()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}

 
Андрей:
¿Por qué necesitamos información sobre todos los pedidos cada vez que se produce un tic? ¿No sería mejor introducir restricciones en la visualización del orden, por ejemplo, cada nuevo minuto, cinco minutos, ..., hora?

El problema ni siquiera es que necesite información para cada tick, sino que, si entiendo bien, al bucle no le da tiempo a terminar antes de que llegue un nuevo tick y éste, de alguna manera, rompe la cuenta. Aquí tienes otra captura de pantalla, para que no tengas que buscar la anterior. Muestra que el EA ha contado hasta 52 y luego ha saltado a 93. Me costaba creer que esto se debiera a los nuevos ticks, pero no encuentro otra razón, porque con ticks raros la cuenta termina bien, así como el último ciclo después de que el EA fuera eliminado del gráfico.

Ya he simplificado el código al máximo:

int prueba()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}

Archivos adjuntos:
test.jpg  82 kb
 
Artyom Trishkin:

¿Cómo lo sabes? No es así.

Hasta que se completen todos los cálculos que se iniciaron con la llegada del tic, se omiten todos los tics posteriores.

Como escribí justo arriba, tengo la misma situación, sólo que ya la he simplificado hasta cierto punto y he llegado a la conclusión de que no sólo no puedo hacer normalmente ningún cálculo, sino que me limito a recorrer las órdenes una por una e imprimir sus números en el registro.

Yo también he creído siempre que "hasta que no se hayan completado todos los cálculos que se iniciaron con la llegada de un tic, se saltan todos los tics posteriores". Me gustaría que fuera así, pero no encuentro otra razón, aparte de las nuevas garrapatas, todavía.

 
Artyom Trishkin:

Nadie lo dirá sin el código.

Aquí hay un código extremadamente simplificado, que tiene el mismo problema - los nuevos ticks tiran la salida sucesiva de los números de orden.

int test()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}

 
Algotrader18:

Aquí hay un código extremadamente simplificado que tiene el mismo problema: los nuevos ticks desvían la salida secuencial de los números de orden.

int prueba()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}

¿Este código realmente compila sin errores? No lo creo...
 
Roman Sharanov:

Otra pregunta sobre el indicador, no sé qué más hacer aquí

Necesito imprimir la diferencia entre el cierre de los pares introducidos y la media móvil de los mismos.

Al final sólo muestra la diferencia sin MA, ¿cuál es el problema?

¡Esto es genial!

¡Romano!

Yo, por ejemplo, soy un comerciante de éxito con 20 años de experiencia.

No entiendo por qué necesitas "la diferencia entre los cierres de los pares introducidos, yuna media móvil de los mismos".

Además, ¿sabes cómo construir una media móvil de estas diferencias? - ¡Fantástico!

¿Puedes simplemente dibujar la media móvil de las cotizaciones? - ¿Tampoco?

¿Cuál es el problema?

 
Algotrader18:

Aquí hay un código extremadamente simplificado que tiene el mismo problema: los nuevos ticks desvían la salida secuencial de los números de orden.

int prueba()
{
int total;
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0);
}

este código funciona, hazlo por analogía:

int NumberOfOrders(int magic_)
  {
   int i,res=0,k=OrdersTotal(); string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy)) res++;
        }
     }
   return(res);
  }
Razón de la queja: