Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 245

 
forexman77:

En el guión, he hecho esto:

tiempo=0

SymbolInfoTick el lunes.

Puedes comprobarlo con este código:

void OnStart()
{
  double ask;
  uint start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
  }
  uint time=GetTickCount()-start;
  Print("SymbolInfoDouble = ",time," ms");
  
  MqlTick tick;
  start=GetTickCount();
  for(int i=0;i<1000000;i++)
  {
    SymbolInfoTick(Symbol(),tick);
  }
  time=GetTickCount()-start;
  Print("SymbolInfoTick = ",time," ms");
}

Pero necesitas ticks por símbolo.

 
Fleder:

Puedes comprobarlo con este código:

Pero necesitas ticks por símbolo.

Sí,"SymbolInfoTick", hoy no se comprueba.

Lo intenté, no funcionará hasta que lleguen las garrapatas.

void OnStart()
  {
uint start=GetTickCount();
double iask=0;
MqlTick latest_price;       // Будет использоваться для текущих котировок  
if(!SymbolInfoTick(_Symbol,latest_price)){iask=latest_price.ask;}
Alert("iask=",iask);
uint time=GetTickCount()-start;
Alert("time=",time);  
  }
iask=0
 
forexman77:

Sí, SymbolInfoTick, hoy no se ha comprobado.

Lo he intentado, hasta que no se apaguen los ticks nada funcionará.

iask=0

Esta función es demasiado rápida.

Para medir el rendimiento, es necesario aplicar múltiples llamadas en un bucle con un gran número de iteraciones y medir el tiempo total de ejecución.

 
barabashkakvn:
Y lo que es más interesante, hay un código de ejemplo. Estamos esperando el resultado.
 
forexman77:
Gracias. Será muy útil.
 

Para comprobar una nueva barra en el EA he utilizado funciones basadas en "CopyTime", "CopyRates", que he encontrado en los foros. Llegué a la conclusión de que su cálculo lleva mucho tiempo.

Aquí están los datos de la comprobación (es interesante que la llamada al indicador tarde 171 ms):

datetime New_Time[];//буффер для проверки нового бара
void OnStart()
  {
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
static datetime t;//записываем старое время  
ArraySetAsSeries(New_Time,true);//направление индексации
CopyTime(_Symbol,_Period,0,1,New_Time);//копируем время нового бара
t=New_Time[0];   
}
uint time=GetTickCount()-start;
Print("New_Time = ",time," ms");
  }

MqlRates rates[]; 
void OnStart()
  {
datetime t;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),Period(),0,1,rates);  
t=rates[0].time; 
}
uint time=GetTickCount()-start;
Print("t = ",time," ms");
  }

Y aquí tengo la idea de que si pruebo otra cosa. Por ejemplo, "TimeCurrent".

Hice el siguiente código para la optimización:

void OnStart()
  {
int t;
int s;  
uint start=GetTickCount();
for(int i=0;i<1000000;i++)
{

MqlDateTime m;
TimeCurrent(m);
t=m.min;
s=m.sec;
}
uint time=GetTickCount()-start;
Print("time = ",time," ms");    
  }

Hice el siguiente código para la optimización en Expert Advisor:

static double ind1;//записываю значения
static double ind2;// значения
static double indsmall;//индикаторов
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
if (MIN==0 && SEC==0)//проверка только в начале часа
{
Здесь копирую значения индикатора из буфферов
}

Resultado en una sola ejecución sin comprobación de una nueva barra, cuando se reciben los valores de los indicadores en cada tick: 817,196 ms

Con comprobación de una nueva barra: 735 904 ms

La diferencia no es especialmente impresionante, hay alguna mejora, pero no es suficiente.

Obtengo el indicador de la siguiente manera:

int TSIHandle;   // хэндл индикатора  TSI
double TSI[]; // динамические массивы для хранения численных значений TSI

int OnInit()
  {
TSIHandle=iCustom(NULL,0,"Blau_TSI",q,r,s,u,PRICE_CLOSE);
if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}
ArraySetAsSeries(TSI,true);
   return(0);
  }

void OnDeinit(const int reason)
  {
//--- освобождаем хэндлы индикаторов
   IndicatorRelease(TSIHandle);
   ArrayFree(TSI);
  }

void OnTick()
  {
MqlDateTime m;
TimeCurrent(m);
int MIN=m.min;
int SEC=m.sec;
static double tsismall;

if (MIN==0 && SEC==0)
{
//--- копируем значения индикаторов из индикаторных буферов
   if(CopyBuffer(TSIHandle,0,0,3,TSI)<0)
     {
      Alert("Ошибка копирования буферов индикатора Moving Average - номер ошибки:",GetLastError(),"!!");
      return;
     }
tsismall=TSI[1];
}
}

He intentado poner el código con llamadas de asas en el bloque donde se realiza la comprobación de la nueva barra, pero aparece el error si

if(TSIHandle<0){Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");return(-1);}

Pongo return no devuelve nada, ningún error, pero el EA no funciona.

Supongo que la llamada a hendle, si es posible y en general todo el código principal excepto la variable estática debería colocarse dentro de la sentencia condicional de comprobación de una nueva barra.

Si no me equivoco, he leído en algún sitio que aunque llamemos a un asa pero no pidamos un indicador en los buffers, se sigue calculando.

 
¿Alguien puede decirme cómo hacer un indicador para mostrar los resultados de la fórmula buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000;
 
rus-lot:
Quién puede sugerir cómo hacer un indicador que muestre los resultados de una sola fórmula buffer[i] = (1.3747-(MarketInfo("EURUSD", MODE_BID))+0.8835-(MarketInfo("USDCHF", MODE_BID)))*10000;

Es necesario escribir un indicador personalizado. Para facilitar el proceso, toma uno de los indicadores más sencillos,iMa, y reescribe un poco. Aquí hay otro tema, donde se habla de MarketInfo. Escribe el código, pregunta, si algo no funciona.

 
¿Qué pasó con las variables estáticas? Hoy he actualizado la antigua build del terminal y ahora hay errores al compilar:

unresolved static variable
 
sgreen:
¿Qué pasó con las variables estáticas? Hoy he actualizado la antigua build del terminal y ahora hay errores al compilar:

unresolved static variable

Ahora hay que colocar los miembros-datos estáticos de la clase:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;