FORTI Si prega di aiutare - pagina 6

 
Serj_Che:
Perché ripetete in OnCalculate ciò che era in OnInit? È un incantesimo del genere?).

È una semplice magia di copia/incolla))

Ok, te lo spiego in modo popolare. Non è sufficiente controllare la prontezza dei dati una volta nell'inite. Poiché i dati sono generati in modo asincrono (per non rallentare il processo principale), è possibile ottenere un errore di dati al momento del controllo nell'init (dipende da molti fattori).

Pertanto, si dovrebbe controllare e (o solo) in calcola e non iniziare i calcoli principali fino a quando tutti i dati richiesti sono disponibili - vale a dire controllare fino a quando è pronto su ogni tick.

 
Dima_S:

È una semplice magia di copia/incolla))

Ok, te lo spiego in modo popolare. Non è sufficiente controllare la prontezza dei dati una volta nell'inite. Poiché i dati sono generati in modo asincrono (per non rallentare il processo principale), allora, al momento del controllo nell'init, è abbastanza possibile ottenere un errore di dati (dipende da molti fattori).

Ecco perché il controllo dovrebbe essere fatto e(o solo) nel calcolo e non iniziare i calcoli principali fino a quando tutti i dati necessari sono disponibili - cioè controllare fino a quando è pronto su ogni tick.

È di questo che stiamo parlando, la funzione OnInit nell'indicatore è una farsa, o gli sviluppatori non stanno facendo il loro lavoro.

Il copia/incolla è una grande cosa, lo faccio anch'io )).

 

Gridato e chiamato chukchi, ma il problema non è stato risolto!

//+------------------------------------------------------------------+
//|                                                         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);
  }

Non ho ancora scritto il download della storia, ma i dati sono nel terminale, e NON escono la prima volta!

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!

Gli indicatori lavorano nel proprio thread, gli EA nel proprio thread. A meno che, naturalmente, non si tratti di una pietra a nucleo singolo.

Tutto avviene esattamente come è scritto nella documentazione. :)

Ho abbozzato un indicatore e un EA da testare + il risultato nel video.

1) Prima traccio un Expert Advisor su un grafico con la funzione OnTick in esecuzione per 20 secondi.

Il risultato è che il grafico continua a funzionare e visualizza tutto come dovrebbe essere. Anche il grafico funziona come previsto.

2) Poi applichiamo al grafico l'indicatore che ha la funzioneOnCalculate per 20 secondi.

Il risultato - la chat si blocca. Allo stesso tempo viene sospesa anche la prossima chat con lo stesso simbolo che ha un periodo diverso. Il vetro continua a funzionare come dovrebbe. Dopo che la funzione ha funzionato, tutto torna alla normalità.

3) Il video non ce l'ha - ma se lanci l'indicatore su una chat (impostata a 60 sec), e l'esperto sull'altra - l'esperto non inizia a lavorare finché l'indicatore sull'altra chat non va in glitch!

Ho allegato il video separatamente - il mio browser è lento.

 
MigVRN:

Tutto avviene esattamente come dice la documentazione. :)

Abbozzato un indicatore e un Expert Advisor per il controllo + il risultato sul video.

1) Per prima cosa l'ho lanciato sul grafico dell'Expert Advisor che ha al suo interno la funzione OnTick che funziona per 20 secondi.

Il risultato è che il grafico continua a funzionare e visualizza tutto come dovrebbe essere. Anche il grafico funziona come previsto.

2) Poi applichiamo al grafico l'indicatore che ha la funzioneOnCalculate per 20 secondi.

Il risultato - la chat si blocca. Allo stesso tempo viene sospesa anche la prossima chat con lo stesso simbolo che ha un periodo diverso. Il vetro continua a funzionare come dovrebbe. Dopo che la funzione ha funzionato, tutto torna alla normalità.

3) Il video non lo mostra - ma se lanci un indicatore su una chat (impostata a 60 sec), e un EA sull'altra - l'EA non inizia a funzionare fino a quando l'indicatore non funziona male su un'altra chat!

Ho allegato il video separatamente - il mio browser è lento.

Grazie, non riesco a trovare un video da guardare, mi informerò.

 

Se state cercando di ottenere dati dall'ambiente di trading quando lavorate dall'indicatore, non provate nemmeno a impostare le query in OnInit(). Fate delle query e controllate la risposta in OnCalculate(). Quando si ricevono dati da un altro simbolo o da un altro timeframe è quasi garantito che anche in OnCalculate non si riesca a ricevere i dati della prima volta. Ecco perché dovreste controllare il ritorno dei valori. Se non si ottiene alcun valore, cerca di ottenere i dati al prossimo tick in OnCalculate().


Inoltre è già interessante vedere la risposta di servicedesk - il codice che è stato fornito.

Forum sul trading, sistemi di trading automatico e test di strategia

FORTS si prega di aiutare

alexvd, 2015.03.26 15:48

Il codice sorgente vi è stato dato da servisdesk. Provate a mettere il vostro ultimo codice nella funzione Test().

Già interesse sportivo - l'autore continua a scrivere il proprio codice e ignora il codice servicedesk?

 
barabashkakvn:

Se state cercando di ottenere dati dall'ambiente di trading quando lavorate dall'indicatore, non provate nemmeno a impostare le query in OnInit(). Fate delle query e controllate la risposta in OnCalculate(). Quando si ricevono dati da un altro simbolo o da un altro timeframe è quasi garantito che anche in OnCalculate non si riesca a ricevere i dati della prima volta. Ecco perché è necessario controllare se i valori vengono restituiti. Se non viene ricevuto alcun valore, prova a ricevere i dati al prossimo tick in OnCalculate().

+++ e così via. Cioè se non ci sono dati - ritorno;
 
MigVRN:
+++ e così via fino alla fine. Cioè se non ci sono dati, ritorna;
Dipende da cosa si vuole interrogare. E quante query fare dipende interamente dalle preferenze di chi scrive il codice.
 
barabashkakvn:
Dipende da cosa interrogare. E quante query - dipende interamente dalle preferenze di chi scrive il codice.

Lei capisce che

Se ci sono dati nel terminale, allora la funzione

SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date )

non dovrebbe restituire FALSE?

P/S anche il codice SD non funziona dalla prima volta!

 

ANCORA UNA VOLTA.

dall'aiuto:

SeriesInfoInteger

Restituisce informazioni sullo stato dei dati storici. Ci sono 2 varianti della funzione.

Seconda variante:

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

SERIE_TERMINALE_FIRSTDATE.

Prima data nella storia secondo il simbolo nel terminale del cliente indipendentemente dal periodo

datetime

LA FUNZIONE NON DOVREBBE RESTITUIRE FALSE SE CI SONO DATI NEL TERMINALE!!!

Non importa da dove lo chiami!

Motivazione: