[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 364

 
Alsu, a variável 'n' em seu código não é clara. Se é o número de campos, como você pode encontrá-lo se não é conhecido de antemão?
 
sibemol >> :
Sr. alsu, eu não entendo a variável 'n' em seu código. Se é o número de campos, como você pode encontrá-lo se não o conhece de antemão?

Mas você vai escrever algo no arquivo, não vai? Ou você quer dizer que a estrutura do CSV não é conhecida de antemão? Então, qual é o sentido de acrescentar se não sabemos nem o número de campos, nem seu tipo (string, integer, floating, time), nem a carga semântica?

 
alsu >> :

Mas você vai escrever algo no arquivo, não vai? Ou você quer dizer que a estrutura do CSV não é conhecida de antemão? Então de que adianta acrescentar, se não sabemos nem o número de campos, nem seu tipo (string, integer, floating, time), nem seu significado?

Minha tarefa é simples - escrever no arquivo csv citações do instrumento atual para transferir para outra aplicação. Tudo é escrito com sucesso se o loop de coleta de dados for(int i=Bars-1; i>=0; i--). Mas se otimizarmos a utilização do código:

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

com um loop for(int i=limit; i>=0; i--),

e em vez de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

então a barra de zero é escrita no início do arquivo. Se você usar FileSeek(), as linhas são adicionadas a cada tick, enquanto precisamos que a última linha de arquivo seja sobrescrita na barra atual.

Espero que tudo esteja claro agora. Por via das dúvidas, aqui está o código de trabalho completo não otimizado:

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

Minha tarefa é simples - escrever citações do instrumento atual em um arquivo csv para transmissão para outra aplicação. Tudo é escrito com sucesso com loop de coleta de dados para(int i=Bars-1; i>=0; i--). Mas se otimizarmos a utilização do código:

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

com loop for(int i=limit; i>=0; i--),

e em vez de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

então a barra de zero é escrita no início do arquivo. Se você usar FileSeek(), as linhas são adicionadas a cada tick, enquanto precisamos que a última linha de arquivo seja sobrescrita na barra atual.

Espero que tudo esteja claro agora. Só por precaução, código de execução completo não otimizado:


ou não é mais fácil lembrar a posição atual no arquivo no início.

Mudança com a mudança de barra.

 
Sorento >> :

ou não é mais fácil lembrar a posição atual no arquivo no início.

Mudança com mudança de barra.


Se você não se importa, como ficaria em código?

 

Você pode me dizer se existe um recurso para desativar todos os roteiros que estão em outros gráficos do roteiro atual? Ou melhor ainda, desligue completamente o terminal.

A razão para isto é que se um dos scripts habilitados "perceber" que um desastre está vindo - ele pararia ele mesmo e todos os outros de funcionar. Como isso pode ser feito se os casos acima ainda são impossíveis de serem implementados?

 
sibemol >> :

Minha tarefa é simples - escrever em cotações de arquivo csv o símbolo atual para enviá-lo para outro aplicativo. Tudo é escrito com sucesso com loop de coleta de dados para(int i=Bars-1; i>=0; i--). Mas se otimizarmos a utilização do código:

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

com loop for(int i=limit; i>=0; i--),

e ao invés de int f=FileOpen(Symbol()+""+Period()+".csv", FILE_CSV|FILE_WRITE, ",");

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

então a barra de zero é escrita no início do arquivo. Se você usar FileSeek(), as linhas são adicionadas a cada tick, enquanto precisamos que a última linha de arquivo seja sobrescrita na barra atual.

Espero que tudo esteja claro agora. Só por precaução, código de trabalho completo não otimizado:


Eu não entendo qual é o problema.

Aqui está um trecho de seu texto, leia os campos:

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

Símbolo, período, data, hora, OHLCV - um total de 9 campos em CSV. Em minha lista acima são todos lidos como cordel, mas não importa porque não é o valor deles, mas o número deles no cordel que importa para nós.

Substituir 9 por n e utilizá-la, a sub-rotina é universal.

Ao mesmo tempo, como Sorento disse corretamente, você pode simplesmente escrever uma variável, que lembrará a posição do ponteiro antes de cada registro. Depois, antes do próximo registro, você pode, se necessário, mover o cursor para o início do último registro e sobregravá-lo. Observe que você deve mover a abertura do arquivo para init() e o fechamento para deinit(). A variável f deve ser declarada globalmente.

Bem, isso é o máximo de detalhes possível. Considere-o como lição de casa:)))))))

 
Mathers >> :

Você pode me dizer se existe um recurso para desativar todos os roteiros que estão em outros gráficos do roteiro atual? Ou melhor ainda, desligue completamente o terminal.

A razão para isto é que se um dos scripts habilitados "perceber" que um desastre está vindo - ele pararia ele mesmo e todos os outros de funcionar. Como isso pode ser feito se os casos acima mencionados são impossíveis de serem implementados?

Eu colocaria uma bandeira na forma de uma variável global para o roteiro, que poderia ser lida por outros roteiros e limpa a tempo.

 

alsu писал(а) >>

Bem, isso é o mais detalhado que você pode obter. Pense nisso como trabalho de casa:)))))))

Obrigado por sua resposta, vou experimentá-la e informá-lo do que acontece.

 
O resultado é espantoso. De onde veio oindicador VSI? Matemática pouco clara.
Arquivos anexados:
Razão: