FORTS Bitte helfen Sie - Seite 6

 
Serj_Che:
Warum wiederholen Sie in OnCalculate, was in OnInit war? Ist das so ein Spruch?)

Es ist ein einfacher Kopier-/Einfüge-Zauber))

OK, ich erkläre es Ihnen auf populäre Weise. Es reicht nicht aus, die Datenbereitschaft einmal in der Einrichtung zu überprüfen. Da die Daten asynchron erzeugt werden (um den Hauptprozess nicht zu verlangsamen), ist es möglich, dass zum Zeitpunkt der Überprüfung im Init ein Datenfehler auftritt (hängt von vielen Faktoren ab).

Daher sollten Sie bei jedem Tick prüfen und (oder nur) in rechnen und erst dann mit den Hauptberechnungen beginnen, wenn alle benötigten Daten vorhanden sind - also prüfen bis fertig.

 
Dima_S:

Es ist ein einfacher Kopier-/Einfüge-Zauber))

OK, ich erkläre es Ihnen auf populäre Weise. Es reicht nicht aus, die Datenbereitschaft einmal in der Einrichtung zu überprüfen. Da die Daten asynchron generiert werden (um den Hauptprozess nicht zu verlangsamen), ist es durchaus möglich, dass zum Zeitpunkt der Überprüfung im Init ein Datenfehler auftritt (hängt von vielen Faktoren ab).

Aus diesem Grund sollte die Prüfung in der Berechnungsphase erfolgen underst dann mit den Hauptberechnungen begonnen werden, wenn alle erforderlichen Daten verfügbar sind - d. h. die Prüfung sollte bei jedem Tick erfolgen, bis sie abgeschlossen ist.

Die OnInit-Funktion des Indikators ist eine Täuschung, oder die Entwickler haben ihre Arbeit nicht gemacht.

Kopieren/Einfügen ist eine großartige Sache, ich mache das selbst )).

 

Geschrien und gerufen chukchi, aber das Problem wurde nicht gelöst!

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

Ich habe den Verlaufsdownload noch nicht geschrieben, aber die Daten sind im Terminal, und sie kommen beim ersten Mal NICHT aus dem Terminal heraus!

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, interessant!

Indikatoren arbeiten in ihrem eigenen Thread, EAs in ihrem eigenen Thread. Es sei denn natürlich, es handelt sich um einen einzelnen Kernstein.

Alles geschieht genau so, wie es in der Dokumentation beschrieben ist. :)

Ich habe einen Indikator und EA zum Testen skizziert + das Ergebnis im Video.

1) Zunächst stelle ich einen Expert Advisor auf einem Chart dar, wobei die OnTick-Funktion für 20 Sekunden läuft.

Das Ergebnis ist, dass das Diagramm weiterhin funktioniert und alles so anzeigt, wie es sein sollte. Auch das Diagramm funktioniert wie erwartet.

2) Dann wenden wir auf das Diagramm den Indikator an, der die FunktionOnCalculate für 20 Sekunden hat.

Das Ergebnis: Der Chat bleibt hängen. Gleichzeitig wird das nächste Chat-Fenster mit demselben Symbol und einem anderen Zeitraum ebenfalls ausgesetzt. Das Glas funktioniert weiterhin wie es soll. Nachdem die Funktion funktioniert hat, ist alles wieder normal.

3) Das Video hat es nicht - aber wenn man den Indikator auf einen Chat wirft (60 Sek. eingestellt), und den Experten auf den anderen - der Experte beginnt nicht zu arbeiten, bis der Indikator auf dem anderen Chat glitches!

Ich habe das Video separat angehängt - in meinem Browser ist es langsam.

 
MigVRN:

Alles geschieht genau so, wie es in der Dokumentation steht. :)

Skizzierte einen Indikator und einen Expert Advisor zur Überprüfung + das Ergebnis auf dem Video.

1) Zuerst habe ich es auf den Chart des Expert Advisors übertragen, der die Funktion OnTick enthält, die 20 Sekunden lang funktioniert.

Das Ergebnis ist, dass das Diagramm weiterhin funktioniert und alles so anzeigt, wie es sein sollte. Auch das Diagramm funktioniert wie erwartet.

2) Dann wenden wir auf das Diagramm den Indikator an, der die FunktionOnCalculate für 20 Sekunden hat.

Das Ergebnis: Der Chat bleibt hängen. Gleichzeitig wird der nächste Chat mit demselben Symbol, der einen anderen Zeitraum hat, ebenfalls ausgesetzt. Das Glas funktioniert weiterhin wie es soll. Nachdem die Funktion funktioniert hat, ist alles wieder normal.

3) Das Video zeigt es nicht - aber wenn Sie einen Indikator auf einen Chat werfen (60 Sek. eingestellt) und einen EA auf den anderen - beginnt der EA nicht zu arbeiten, bis der Indikator auf einem anderen Chat versagt!

Ich habe das Video separat angehängt - es verlangsamt sich in meinem Browser.

Danke, ich bekomme kein Video zu sehen, ich werde es mir ansehen.

 

Wenn Sie versuchen, Daten aus der Handelsumgebung zu erhalten, während Sie mit dem Indikator arbeiten, versuchen Sie gar nicht erst, Abfragen in OnInit() zu setzen. Machen Sie Abfragen und überprüfen Sie die Antwort in OnCalculate(). Wenn Sie Daten von einem anderen Symbol oder einem anderen Zeitrahmen empfangen, ist es fast garantiert, dass es Ihnen auch in OnCalculate nicht gelingen wird, Daten vom ersten Mal zu empfangen. Aus diesem Grund sollten Sie die Rückgabe der Werte überprüfen. Wenn keine Werte erhalten werden, versuchen Sie, die Daten beim nächsten Tick in OnCalculate() zu erhalten.


Auch schon interessant die Antwort von servicedesk - der Code, der bereitgestellt wurde.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

FORTS Bitte helfen Sie

alexvd, 2015.03.26 15:48

Sie haben den Quellcode von servisdesk erhalten. Versuchen Sie, Ihren letzten Code in die Funktion Test() einzufügen.

Schon sportliches Interesse - der Autor schreibt weiter seinen eigenen Code und ignoriert den servicedesk Code?

 
barabashkakvn:

Wenn Sie versuchen, Daten aus der Handelsumgebung zu erhalten, während Sie mit dem Indikator arbeiten, versuchen Sie gar nicht erst, Abfragen in OnInit() zu setzen. Stellen Sie Anfragen und prüfen Sie die Antwort in OnCalculate(). Wenn Sie Daten von einem anderen Symbol oder von einem anderen Zeitrahmen empfangen, ist es fast garantiert, dass es Ihnen auch in OnCalculate nicht gelingen wird, Daten vom ersten Mal zu empfangen. Aus diesem Grund sollten Sie die Rückgabe der Werte überprüfen. Wenn keine Werte empfangen werden, versuchen Sie, beim nächsten Tick in OnCalculate() Daten zu empfangen.

+++ und so weiter bis zum Ende. D.h. wenn es keine Daten gibt - zurück;
 
MigVRN:
+++ und so weiter bis zum Ende. D.h. wenn keine Daten vorhanden sind, zurück;
Das hängt davon ab, was Sie abfragen wollen. Und wie viele Abfragen gemacht werden sollen, hängt ganz von den Vorlieben des Codeschreibers ab.
 
barabashkakvn:
Es kommt darauf an, was abgefragt werden soll. Und wie viele Abfragen - das hängt ganz von den Vorlieben des Codeschreibers ab.

Sie verstehen, dass

Wenn Daten im Terminal vorhanden sind, wird die Funktion

SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date )

nicht FALSE zurückgeben sollte?

P/S der SD-Code funktioniert auch nicht beim ersten Mal!

 

EINMAL MEHR.

aus der Hilfe:

SeriesInfoInteger

Gibt Informationen über den Zustand der historischen Daten zurück. Es gibt 2 Varianten der Funktion.

Zweite Variante:

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

SERIEN_TERMINAL_ERSTDATUM.

Erstes Datum in der Historie entsprechend dem Symbol im Client-Terminal, unabhängig vom Zeitraum

datetime

DIE FUNKTION SOLLTE NICHT FALSE ZURÜCKGEBEN, WENN DATEN IM TERMINAL VORHANDEN SIND!!!

Ganz gleich, von wo aus Sie es anrufen!