[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 364

 
Alsu, la variabile 'n' nel tuo codice non è chiara. Se è il numero di campi, come puoi trovarlo se non è noto in anticipo?
 
sibemol >> :
Signor alsu, non capisco la variabile 'n' nel suo codice. Se è il numero di campi, come puoi trovarlo se non lo sai in anticipo?

Ma stai per scrivere qualcosa nel file, vero? O vuoi dire che la struttura del CSV non è nota a priori? Allora che senso ha aggiungerci se non conosciamo né il numero di campi, né il loro tipo (stringa, intero, floating, tempo), né il carico semantico?

 
alsu >> :

Ma stai per scrivere qualcosa nel file, vero? O vuoi dire che la struttura del CSV non è nota a priori? Allora che senso ha aggiungerlo, se non conosciamo né il numero di campi, né il loro tipo (stringa, intero, floating, tempo), né il loro significato?

Il mio compito è semplice - scrivere in un file csv le quotazioni dello strumento corrente per trasferirle ad altre applicazioni. Tutto viene scritto con successo se il ciclo di raccolta dati for(int i=Bars-1; i>=0; i--). Ma se ottimizziamo il codice usando:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
se (counted_bars>0) limit=Bars-counted_bars-1;

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

e invece di int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

allora la barra zero viene scritta all'inizio del file. Se usate FileSeek(), le linee vengono aggiunte ad ogni tick, mentre noi abbiamo bisogno che l'ultima linea del file venga sovrascritta alla barra corrente.

Spero che ora sia tutto chiaro. Nel caso, ecco il codice completo non ottimizzato e funzionante:

//+------------------------------------------------------------------+
//|                                                  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 >> :

Il mio compito è semplice: scrivere le quotazioni dello strumento corrente in un file csv per la trasmissione a un'altra applicazione. Tutto è scritto con successo con il ciclo di raccolta dati for(int i=Bars-1; i>=0; i--). Ma se ottimizziamo il codice usando:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
se (counted_bars>0) limit=Bars-counted_bars-1;

con ciclo for(int i=limite; i>=0; i--),

e invece di int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

allora la barra zero viene scritta all'inizio del file. Se usate FileSeek(), le linee vengono aggiunte ad ogni tick, mentre noi dobbiamo sovrascrivere l'ultima linea di file sulla barra corrente.

Spero che ora sia tutto chiaro. Per sicurezza, codice in esecuzione completo e non ottimizzato:


o non è più facile ricordare la posizione attuale nel file all'inizio.

Cambia con il cambio della barra.

 
Sorento >> :

o non è più facile ricordare la posizione attuale nel file all'inizio.

Cambia con il cambio della barra.


Se non ti dispiace, come sarebbe nel codice?

 

Puoi dirmi se c'è una funzione per disabilitare tutti gli script che sono su altri grafici dallo script corrente? O meglio ancora, spegnete del tutto il terminale.

La ragione di questo è che se uno degli script abilitati si "accorge" che sta arrivando un disastro - fermerebbe se stesso e tutti gli altri dal lavorare. Come si può fare se i casi di cui sopra sono ancora impossibili da attuare?

 
sibemol >> :

Il mio compito è semplice - scrivere in un file csv le quotazioni del simbolo corrente per inviarlo a un'altra applicazione. Tutto è scritto con successo con il ciclo di raccolta dati for(int i=Bars-1; i>=0; i--). Ma se ottimizziamo il codice usando:

int counted_bars=IndicatorCounted(), limit;
if (counted_bars==0) limit=Bars-1;
se (counted_bars>0) limit=Bars-counted_bars-1;

con ciclo for(int i=limite; i>=0; i--),

e invece di int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

allora la barra zero viene scritta all'inizio del file. Se usate FileSeek(), le linee vengono aggiunte ad ogni tick, mentre noi abbiamo bisogno che l'ultima linea del file venga sovrascritta alla barra corrente.

Spero che ora sia tutto chiaro. Nel caso, codice completo non ottimizzato e funzionante:


Non capisco quale sia il problema.

Ecco un estratto del tuo testo, leggi i campi:

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

Simbolo, periodo, data, ora, OHLCV - un totale di 9 campi in CSV. Nel mio elenco precedente sono tutti letti come stringa, ma non importa, poiché non è il loro valore, ma il loro numero nella stringa che conta per noi.

Sostituisci 9 per n e usalo, la subroutine è universale.

Allo stesso tempo, come ha giustamente detto Sorento, si può semplicemente scrivere una variabile, che ricorderà la posizione del puntatore prima di ogni record. Poi prima del prossimo record si può, se necessario, spostare il cursore all'inizio dell'ultimo record e sovrascriverlo. Notate che dovreste spostare l'apertura dei file in init() e la chiusura in deinit(). La variabile f dovrebbe essere dichiarata globalmente.

Beh, questo è il massimo dei dettagli possibili. Consideralo come un compito a casa:)))))))

 
Mathers >> :

Puoi dirmi se c'è una funzione per disabilitare tutti gli script che sono su altri grafici dallo script corrente? O meglio ancora, spegnere del tutto il terminale.

La ragione di questo è che se uno degli script abilitati si "accorge" che sta arrivando un disastro - fermerebbe se stesso e tutti gli altri dal lavorare. Come si può fare se i casi sopra menzionati sono impossibili da attuare?

Imposterei un flag sotto forma di variabile globale per lo script che potrebbe essere letto da altri script e ripulito in tempo.

 

alsu писал(а) >>

Beh, questo è quanto di più dettagliato si possa ottenere. Pensatelo come un compito a casa:)))))))

Grazie per la tua risposta, lo proverò e ti farò sapere cosa succede.

 
Ho rielaborato l'indicatore VSI. volevo ottenere i volumi in più e in meno. il risultato è sbalorditivo. Matematica poco chiara.
File: