Bibliotecas: TimeSeries - Funciones de la librería para trabajar con Series Temporales - página 2

 

En general, tengo una doble actitud ante este tipo de acontecimientos.

Por un lado, un hombre ha trabajado duro, y no se arrepentía de publicar, felicitaciones y respeto.

Por otro lado, es necesario que labuhovs estúpidamente portar códigos de MT4 a MT5. "Estúpidamente" quiere decir sin entrar en las posibilidades del lenguaje y sin profundizar en la propia estrategia.

Por cierto, esto lo estoy haciendo yo ahora :) así que la crítica va dirigida a mí.

Voy a tratar de profundizar en la estupidez y las posibilidades de MQL5.

Tomemos una simple función iClose, en MT4 no había posibilidad de obtener toda la serie temporal de una vez (sólo trozo a trozo), en MT5 su obtención está tan optimizada que no hay diferencia en copiar un valor y toda la serie (un poco exagerado, pero casi). Así que a menudo se tarda una cantidad de tiempo comparable en organizar la matriz en la que se copiarán los datos, por lo que no tiene sentido recibir Close uno a uno. Además, los indicadores ya tienen estas series por defecto. Así que, al portar, tiene sentido dividir el código en código de cálculo (que se copia en el indicador) y código de negociación (que se ejecuta en el Asesor Experto).

Lo que quiero decir es que, por un lado, estos códigos son útiles para los principiantes, se hace más fácil para ellos vivir.

Por otro lado, establece el estándar de programación equivocado, la programación a través de la G.

Por cierto, aquí es una característica más para el includnik:

// está en el incloudnik
MqlTick last_tick;
#define Ask last_tick.ask
#define Bid last_tick.bid
// está en OnTick
SymbolInfoTick(_Symbol,last_tick);
// ahora puedes usarlo en cualquier sitio
 Ask; // и
 Bid;
 

Aquí hay más refinamiento para usted.

Pero sería mejor volver a escribir todo sobre la base de la biblia estándar.

Archivos adjuntos:
 
Perdón, ¿hay un código incorrecto ahí? Migración de MQL4 a MQL5
 
BoraBo:
Lo siento, ¿hay un código incorrecto allí? Cambio de MQL4 a MQL5.

¿Por qué es incorrecto, es correcto (he copiado parte del código de allí),

pero no hay código allí, sólo enums están rotos, y todo lo demás está en el propio artículo.

+ Yo porté OrderSend allí, creo que la mayor parte de los problemas está relacionada con el establecimiento de órdenes.

Por cierto, faltan muchas cosas, por ejemplo, toda la funcionalidad de trading no está rota (sólo hice OrderSend y OrderClose).

Así que hay un montón de espacio para el desarrollo de los entusiastas.

 
Urain:

Es que el código en el artículo y en esta biblioteca es casi idéntico, pensé que tal vez algo en el artículo está mal.

 
BoraBo:

Es que el código en el artículo y en esta biblioteca es casi idéntico, pensé que tal vez algo en el artículo está mal.

Pero para qué inventar bicicletas, copié lo que ya está ahí, lo edité y añadí lo mío.

Voila y todo funciona.

Por eso se publican los fuentes, para que otros puedan usarlos.

Si no, todos los programadores seguirían escribiendo en lenguaje ensamblador.

[Eliminado]  
komposter:

Con mucho gusto haré análogos de todas las funciones necesarias (incluyendo la contabilidad de las transacciones virtuales), cuando tenga en mis manos.

Ahora necesito estas funciones, no pude encontrar una biblioteca ya hecha. Así que tuve que hacer la mía propia.

Llevo unos tres años utilizando mi biblioteca, perfeccionándola constantemente. todo funciona como un reloj suizo.

Has encontrado algunos puntos interesantes, tendré que pensar en la implementación.

 
Interesting:

Usted ha encontrado algunos puntos interesantes, tendrá que pensar en la aplicación.

¿puedes decirme a partir del código qué puntos interesantes has encontrado?
[Eliminado]  
sergeev:
pista sobre el código, ¿qué puntos interesantes has encontrado?

Algunas cosas son más simples y funcionales que las mías. No puse comprobaciones de errores en ciertos lugares.

Mi código es a veces 3-4 veces más grande.

PS

Mi código, sin embargo, me parece más en línea con MQL4 (puede haber otras variantes).

[Eliminado]  

como ejemplo (primeras implementaciones) para iHighest e iOpen

//Función iMáximo
int iHighest(string symbol, int timeframe, int type, int count=WHOLE_ARRAY, int start=0) export 
//Devuelve el desplazamiento del valor máximo sobre un número específico de periodos dependiendo del tipo. 
{
//----------------------------------------------------------------------------//
//Variables de trabajo
ENUM_TIMEFRAMES TF; //Período como ENUM_TIMEFRAMES

double Arr[];
long Volume[];
datetime Time[];

int Result = -1; //Importancia devuelta
//----------------------------------------------------------------------------//

TF = MinuteToPeriod(timeframe);

  if(start<0)  start = 0;
  if(count<=0) count = Bars(symbol,TF);
//MODE_OPEN
  if(type==MODE_OPEN)
  {
  ArraySetAsSeries(Arr,true);

  CopyOpen(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_LOW
  if(type==MODE_LOW)
  {
  ArraySetAsSeries(Arr,true);

  CopyLow(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_HIGH
  if(type==MODE_HIGH)
  {
  ArraySetAsSeries(Arr,true);

  CopyHigh(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_CLOSE
  if(type==MODE_CLOSE)
  {
  ArraySetAsSeries(Arr,true);

  CopyClose(symbol,TF,start,count,Arr);

  Result = ArrayMaximum(Arr,0,count) + start;
  }
//MODE_VOLUME
  if(type==MODE_VOLUME)
  {
  ArraySetAsSeries(Volume,true);

  CopyTickVolume(symbol,TF,start,count,Volume);

  Result = ArrayMaximum(Volume,0,count) + start;
  }
//MODE_TIME
  if(type==MODE_TIME)
  {
  ArraySetAsSeries(Time,true);

  CopyTime(symbol,TF,start,count,Time);

  Result = ArrayMaximum(Time,0,count) + start;
  }
//Comprobación de la presencia de los errores 
  if(GetLastError()!=0)
  {
  Result = -1; //Mensaje en caso de error
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}
//Función iOpen
double iOpen(string symbol, int timeframe, int shift) export 
//Devuelve el valor de apertura de la barra del símbolo indicado con el marco temporal y el desplazamiento.
//Si el historial local está vacío (no cargado), la función devuelve 0.
//Para el gráfico actual, la información sobre los precios de apertura se encuentra en el array predefinido llamado Open[]. 
{
//----------------------------------------------------------------------------//
//Variables de trabajo
ENUM_TIMEFRAMES TF; //Período como ENUM_TIMEFRAMES

double Arr[];

double Result = 0; //Importancia devuelta
//----------------------------------------------------------------------------//

ResetLastError();

  if(shift>=0)
  {
  TF = MinuteToPeriod(timeframe);

  CopyOpen(symbol,TF,0,Bars(symbol,TF),Arr);
  
    if(ArraySize(Arr)>0)
    {
    ArraySetAsSeries(Arr,true);
    Result = Arr[shift];
    } 

  }
//Comprobación de la presencia de los errores 
  if(GetLastError()!=0)
  {
  Result = 0; //Mensaje en caso de error
  }  
//----------------------------------------------------------------------------//
return(Result);
//----------------------------------------------------------------------------//
}