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

 
Alsu, la variable 'n' en tu código no está clara. Si se trata del número de campos, ¿cómo puede encontrarlo si no se conoce de antemano?
 
sibemol >> :
Sr. alsu, no entiendo la variable 'n' en su código. Si se trata del número de campos, ¿cómo puede encontrarlo si no lo sabe de antemano?

Pero vas a escribir algo en el archivo, ¿no? ¿O quieres decir que la estructura del CSV no se conoce de antemano? Entonces, ¿qué sentido tiene añadir en él si no conocemos ni el número de campos, ni su tipo (cadena, entero, flotante, tiempo), ni la carga semántica?

 
alsu >> :

Pero vas a escribir algo en el archivo, ¿no? ¿O quieres decir que la estructura del CSV no se conoce de antemano? Entonces, ¿qué sentido tiene añadirlo si no se conoce ni el número de campos, ni su tipo (cadena, entero, flotante, tiempo), ni la carga semántica?

Mi tarea es sencilla: escribir las cotizaciones del instrumento actual en un archivo csv para pasarlo a otra aplicación. Todo se escribe con éxito si el bucle de recogida de datos for(int i=Bars-1; i>=0; i--). Pero si optimizamos el código usando:

int barras_contadas=IndicadorContado(), límite;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

con un bucle for(int i=limit; i>=0; i--),

y en lugar de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

insert int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

entonces la barra de cero se escribe al principio del archivo. Si se utiliza FileSeek(), las líneas se añaden con cada tic, mientras que nosotros necesitamos sobrescribir la última línea de archivo en la barra actual.

Espero que todo esté claro ahora. Por si acaso, aquí está el código de trabajo completo no optimizado:

//+------------------------------------------------------------------+
//|                                                  iHisoryBars.mq4 |
//|                                        Copyright © 2009, Sibemol |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Sibemol"
#property link      ""

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 White
//---- input parameters
double v1[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators 
   SetIndexStyle(0,DRAW_LINE);  
   SetIndexBuffer(0, v1);      
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {  
  int counted_bars=IndicatorCounted(), limit;
  if ( counted_bars==0)  limit=Bars-1;
  if ( counted_bars>0)   limit=Bars- counted_bars-1;    
  int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV| FILE_WRITE, ",");
  //int f=FileOpen(Symbol()+" "+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",");    
  FileWrite( f,
  "<ticker>,<per>,<date>,<time>,<open>,<high>,<low>,<close>,<volume>,<oi>");
  for(int i=Bars-1; i>=0; i--)
    {
    v1[ i]=Close[ i];    
    int _Year=TimeYear(Time[ i]),
        _Month=TimeMonth(Time[ i]),
        _Day=TimeDay(Time[ i]),
        _Hour=TimeHour(Time[ i]),
        _Minute=TimeMinute(Time[ i]);
        
    string Y, M, D, H, Mi, Date, _Time;
        
    if(_Month<10) M="0"+DoubleToStr(_Month, 0); else M=DoubleToStr(_Month, 0);
    if(_Day<10) D="0"+DoubleToStr(_Day, 0); else D=DoubleToStr(_Day, 0);
    if(_Hour<10) H="0"+DoubleToStr(_Hour, 0); else H=DoubleToStr(_Hour, 0);
    if(_Minute<10) Mi="0"+DoubleToStr(_Minute, 0); else Mi=DoubleToStr(_Minute, 0);
    Date=DoubleToStr(_Year, 0)+ M+ D;
    _Time= H+ Mi;
        
    FileWrite( f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[ i], High[ i], Low[ i], Close[ i], Volume[ i], 0);
    
    }
    
    FileClose( f);
    
  return(0);
  }
//+------------------------------------------------------------------+
 
sibemol >> :

Mi tarea es sencilla: escribir las cotizaciones del instrumento actual en un archivo csv para transmitirlo a otra aplicación. Todo se escribe con éxito con el bucle de recogida de datos for(int i=Bars-1; i>=0; i--). Pero si optimizamos el código usando:

int barras_contadas=IndicadorContado(), límite;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

con bucle for(int i=limit; i>=0; i--),

y en lugar de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

insert int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

entonces la barra de cero se escribe al principio del archivo. Si se utiliza FileSeek(), las líneas se añaden con cada tic, mientras que nosotros necesitamos que la última línea del archivo se sobrescriba en la barra actual.

Espero que todo esté claro ahora. Por si acaso, código completo sin optimizar:


o no es más fácil recordar la posición actual en el archivo al principio.

Cambia con el cambio de barra.

 
Sorento >> :

o no es más fácil recordar la posición actual en el archivo al principio.

Cambia con el cambio de barra.


Si no te importa, ¿cómo se vería en código?

 

¿Puede decirme si existe una función para desactivar todos los scripts que están en otros gráficos del script actual? O mejor aún, apagar el terminal por completo.

La razón de esto es que si uno de los scripts habilitados "nota" que se acerca un desastre - se detendría a sí mismo y a todos los demás de trabajar. ¿Cómo se puede hacer esto si los casos anteriores siguen siendo imposibles de aplicar?

 
sibemol >> :

Mi tarea es sencilla: escribir en un archivo csv las cotizaciones del símbolo actual para enviarlo a otra aplicación. Todo se escribe con éxito con el bucle de recogida de datos for(int i=Bars-1; i>=0; i--). Pero si optimizamos el código usando:

int barras_contadas=IndicadorContado(), límite;
if (counted_bars==0) limit=Bars-1;
if (counted_bars>0) limit=Bars-counted_bars-1;

con bucle for(int i=limit; i>=0; i--),

y en lugar de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

insert int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_READ|FILE_WRITE, ",")

entonces la barra de cero se escribe al principio del archivo. Si se utiliza FileSeek(), las líneas se añaden con cada tic, mientras que nosotros necesitamos que la última línea del archivo se sobrescriba en la barra actual.

Espero que todo esté claro ahora. Por si acaso, código completo de trabajo no optimizado:


No entiendo cuál es el problema.

Aquí hay un extracto de su texto, lea los campos:

FileWrite( f,     
    Symbol(), Period(),
    Date, _Time,     
    Open[ i], High[ i], Low[ i], Close[ i], Volume[ i], 0);

Símbolo, período, fecha, hora, OHLCV - un total de 9 campos en CSV. En mi listado anterior todos se leen como cadena, pero no importa ya que no es su valor, sino su número en la cadena lo que nos importa.

Sustituye n por 9 y úsalo, la subrutina es universal.

Al mismo tiempo, como bien ha dicho Sorento, se puede escribir una variable que recuerde la posición del puntero antes de cada registro, y antes del siguiente registro se puede, si es necesario, mover el cursor al principio del último registro y sobrescribirlo. Tenga en cuenta que debe mover la apertura de archivos a init() y el cierre a deinit(). La variable f debe ser declarada globalmente.

Bueno, esto es lo más detallado posible. Considérelo como una tarea:)))))))

 
Mathers >> :

¿Puede decirme si existe una función para desactivar todos los scripts que están en otros gráficos del script actual? O mejor aún, apagar el terminal por completo.

La razón de esto es que si uno de los scripts habilitados "nota" que se acerca un desastre - se detendría a sí mismo y a todos los demás de trabajar. ¿Cómo se puede hacer esto, si los casos mencionados anteriormente siguen siendo imposibles de aplicar?

Establecería una bandera en forma de variable global para el script que podría ser leída por otros scripts y limpiar a tiempo.

 

alsu писал(а) >>

Bueno, eso es lo más detallado que se puede conseguir. Piensa en ello como en los deberes:)))))))

Gracias por tu respuesta, lo probaré y te contaré qué pasa.

 
Herehecho el indicador VSI.Quería obtener los volúmenes en más y en menos.El resultado es asombroso.¿De dónde viene lo que? Matemáticas poco claras.
Archivos adjuntos: