FORTES Por favor, ajude - página 6

 
Serj_Che:
Por que você repete no OnCalculate o que estava no OnInit? Isso é um feitiço assim?)

É uma magia simples de copiar/colar))

OK, eu explicarei a você popularmente. Não é suficiente verificar a prontidão dos dados uma vez no inite. Como os dados são gerados de forma assíncrona (para não retardar o processo principal), é possível obter um erro de dados no momento da verificação no init (depende de muitos fatores).

Portanto, você deve verificar e (ou apenas) no cálculo e não iniciar os cálculos principais até que todos os dados necessários estejam disponíveis - ou seja, verificar até que estejam prontos em cada tick.

 
Dima_S:

É uma magia simples de copiar/colar))

OK, eu explicarei a você popularmente. Não é suficiente verificar a prontidão dos dados uma vez no inite. Como os dados são gerados de forma assíncrona (para não retardar o processo principal), então, no momento da verificação no init, é bem possível obter um erro de dados (depende de muitos fatores).

É por isso que a verificação deve ser feita e(ou apenas) no cálculo e não iniciar os cálculos principais até que todos os dados necessários estejam disponíveis - ou seja, verificar até que estejam prontos em cada tique.

É disso que estamos falando, a função OnInit no indicador é uma farsa, ou os desenvolvedores não estão fazendo seu trabalho.

Copiar/colar é uma coisa ótima, eu mesmo o faço )).

 

Gritou e chamou de chukchi, mas o problema não foi resolvido!

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//
bool is_failed = false;
datetime start_time;
datetime end_time;
int mix_bars, rts_bars, si_bars;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
    start_time = StringToTime( "2015.03.17" );
    end_time = TimeCurrent();
//--- indicator buffers mapping
  mix_bars = GetBars( "MIX-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( mix_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. MIX-6.15 ");
  }
  rts_bars = GetBars( "RTS-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( rts_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. RTS-6.15 ");
  }
  si_bars = GetBars( "Si-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( si_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. Si-6.15 ");
  }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period, const datetime start_date, const datetime end_date )
{
  if ( !SymbolInfoInteger( symbol, SYMBOL_SELECT ) )
  {
    ResetLastError();
//---    
    if ( GetLastError() != ERR_MARKET_UNKNOWN_SYMBOL )
    {
      SymbolSelect( symbol, true );
    }
    else
    {
      Print( "GetBars: Неизвестный символ - ", symbol );
      return( 0 );
    }    
  }
//---  
  if ( MQL5InfoInteger( MQL5_PROGRAM_TYPE ) == PROGRAM_INDICATOR && Period() == period && Symbol() == symbol )
  {
    Print( "GetBars: Не пройдена проверка типа программы!" );
    return( 0 );
  }  
//---
  if ( SymbolIsSynchronized( symbol ) )
  {
    return( Bars( symbol, period, start_date, end_date ) );
  }
  else
  {
    long first_date = 0;
    datetime times[1];
//---    
    if ( SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date ) )
    {
      if ( first_date > 0 )
      {
//--- force timeseries build
        CopyTime( symbol, period, datetime( first_date ) + PeriodSeconds( period ), 1, times );
//--- check date
        if ( SeriesInfoInteger( symbol, period, SERIES_FIRSTDATE, first_date ) )
//---        
        if ( first_date > 0 && first_date <= long( start_date ) )
        {
          return( Bars( symbol, period, start_date, end_date ) );
        } 
      }
    }
    Print( "Необходима загрузка истории с сервера!");
  }       
//---  
  return( 0 );
}  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if ( is_failed )
   {
     Print( "Sorry! Get Bars failed." );
   }
   else Print( "Bingo! We done.");
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Ainda não escrevi o download do histórico, mas os dados estão no terminal, e NÃO saem dele na primeira vez!

2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Необходима загрузка истории с сервера!
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Init failed. RTS-6.15 
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Необходима загрузка истории с сервера!
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Init failed. Si-6.15 
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Sorry! Get Bars failed.
 
Serj_Che:

OK, interessante!

Os indicadores trabalham em seu próprio fio, as EAs em seu próprio fio. A menos, é claro, que seja uma única pedra fundamental.

Tudo acontece exatamente como está escrito na documentação. :)

Eu desenhei um indicador e a EA para testes + o resultado no vídeo.

1) Primeiro traço um Expert Advisor em um gráfico com a função OnTick funcionando por 20 segundos.

O resultado é que o gráfico continua funcionando e exibe tudo como deveria ser. O gráfico também funciona como esperado.

2) Depois aplicamos ao gráfico o indicador que tem a funçãoOnCalculate durante 20 segundos.

O resultado - o bate-papo fica pendurado. Ao mesmo tempo, a próxima janela de bate-papo com o mesmo símbolo e um período diferente também é suspensa. O vidro continua a funcionar como deveria. Depois que a função tiver funcionado, tudo volta ao normal.

3) O vídeo não o tem - mas se você jogar o indicador em um chat (set 60 seg), e o especialista no outro - o especialista não começa a trabalhar até que o indicador no outro chat falhe!

Anexei o vídeo separadamente - ele é lento no meu navegador.

 
MigVRN:

Tudo acontece exatamente como diz na documentação. :)

Esboçou um indicador e um Expert Advisor para verificação + o resultado no vídeo.

1) Primeiro eu o lanço para o gráfico do Expert Advisor que tem a função OnTick dentro dele que funciona por 20 segundos.

O resultado é que o gráfico continua funcionando e exibe tudo como deveria ser. O gráfico também funciona como esperado.

2) Depois aplicamos ao gráfico o indicador que tem a funçãoOnCalculate durante 20 segundos.

O resultado - o bate-papo fica pendurado. Ao mesmo tempo, a próxima conversa com o mesmo símbolo, que tem um período diferente, também é suspensa. O vidro continua a funcionar como deveria. Depois que a função tiver funcionado, tudo volta ao normal.

3) O vídeo não o mostra - mas se você lançar um indicador em um chat (set 60 seg), e um EA no outro - o EA não começa a funcionar até que o indicador funcione mal em outro chat!

Anexei o vídeo separadamente - ele está diminuindo a velocidade no meu navegador.

Obrigada, não consigo ver um vídeo, vou dar uma olhada nele.

 

Se você estiver tentando obter dados do ambiente comercial ao trabalhar com o indicador, não tente nem mesmo definir consultas no OnInit(). Faça consultas e verifique a resposta em OnCalculate(). Ao receber dados de outro símbolo ou de outro período de tempo, é quase garantido que mesmo na OnCalculate você não conseguirá receber dados desde a primeira vez. É por isso que você deve verificar o retorno dos valores. Se nenhum valor for obtido, tente obter dados sobre o próximo tick em OnCalculate().


Também já é interessante a resposta do servicedesk - o código que foi fornecido.

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

FORTES Por favor, ajude

alexvd, 2015.03.26 15:48

O código fonte lhe foi dado pela servisdesk. Tente colocar seu último código na função Teste().

Já com interesse esportivo - o autor continua escrevendo seu próprio código e ignora o código servicedesk?

 
barabashkakvn:

Se você estiver tentando obter dados do ambiente comercial ao trabalhar com o indicador, não tente nem mesmo definir consultas no OnInit(). Faça solicitações e verifique a resposta em OnCalculate(). Ao receber dados de outro símbolo ou de outro período de tempo, é quase garantido que mesmo na OnCalculate você não conseguirá receber dados desde a primeira vez. É por isso que você deve verificar o retorno dos valores. Se nenhum valor for recebido, tente receber dados sobre o próximo tick em OnCalculate().

++++ e assim por diante até o final. Isto é, se não houver dados - retorno;
 
MigVRN:
++++ e assim por diante até o final. Isto é, se não houver dados, retornar;
Depende do que você deseja consultar. E quantas consultas a serem feitas dependem inteiramente das preferências do autor do código.
 
barabashkakvn:
Depende do que se deve consultar. E quantas consultas - depende inteiramente das preferências do autor do código.

Você entende que

Se houver dados no terminal, então a função

SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date )

não deve retornar FALSO?

P/S o código SD também não funciona desde a primeira vez!

 

EM UM LUGAR.

da ajuda:

SérieInfoInteger

Retorna informações sobre o estado dos dados históricos. Existem 2 variantes da função.

Segunda variante:

bool  SeriesInfoInteger(
   string                     symbol_name,     // имя символа
   ENUM_TIMEFRAMES            timeframe,       // период
   ENUM_SERIES_INFO_INTEGER   prop_id,         // идентификатор свойства
   long&                      long_var         // переменная для получения информации
   );

SERIES_TERMINAL_FIRSTDATE.

Primeira data na história de acordo com o símbolo no terminal do cliente, independentemente do período

data/hora

A FUNÇÃO NÃO DEVE RETORNAR FALSOS SE HOUVER DADOS NO TERMINAL!!!

Não importa de onde você chama isso!