FORTS Bitte helfen Sie - Seite 29

 

Guten Tag, Anton!

Ihrem Rat folgend (LoadServerData() ruft SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE),

d.h. sie lautet "erstes Datum in der Geschichte nach Symbol auf dem Server unabhängig vom Zeitraum".

Diese Anfrage selbst wird nicht als History-Anfrage betrachtet, d.h. sie führt nicht zum Aufbau eines Caches,

verhindert das Entladen von Symboldaten nicht. Es ist sinnvoll, entweder SERIES_FIRSTDATE oder die Anzahl der Balken der Zeitreihe abzufragen.),

Ich habe dem Indikator eine neue Funktion hinzugefügt, um das Entladen von Symboldaten zu verhindern:

//+------------------------------------------------------------------+
// Custom indicator Book Event function                              |
//+------------------------------------------------------------------+
void OnBookEvent( const string &symbol )
{
  if ( ( ( symbol == _Symbol ) || ( symbol == sec_symbol ) ) && ( !IsStopped() ) )
  {
    GetBars( sec_symbol, time_frame );
  }  
}

//+------------------------------------------------------------------+
// Custom indicator Check timer function                             |
//+------------------------------------------------------------------+
bool CheckTimer( const uint start_value, const uint per_value )
{
  uint end_value = GetTickCount();
  
  if ( end_value < start_value )
  {
    if ( ( start_value - end_value ) >= per_value ) return( true );
  } 
  else
  {
    if ( ( end_value - start_value ) >= per_value ) return( true );
  }
  return( false );
}
//+------------------------------------------------------------------+
//| Custom indicator Get local data function                         |
//+------------------------------------------------------------------+
int GetLocalData( const string a_symbol, ENUM_TIMEFRAMES a_period )
{
  long first_date;
  int fail_cnt = 0;
//---  
  while ( ( fail_cnt < 3 ) && !IsStopped() )
  {
    first_date = long( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE ) );
//---    
    if ( first_date > 0 )
    {
      int f_cnt = 0;
      datetime times[1];
      long a_bars = 0;
//---  
      while ( ( f_cnt < 5 ) && !IsStopped() )
      {
        if ( bool( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_BARS_COUNT, a_bars ) ) )
        {
          if ( a_bars > 0 )
          {
            if ( bool( SeriesInfoInteger( a_symbol, a_period, SERIES_BARS_COUNT, a_bars ) ) )
              if ( a_bars > 0 ) return( int( a_bars ) );
          }
        }
        else
        {
//--- force timeseries build
          CopyTime( a_symbol, a_period, 0, 1, times );
          uint start_tick = GetTickCount();
//---        
          while ( !CheckTimer( start_tick, 5 ) )
          {
            f_cnt--;
            f_cnt++;
          }  
        }
        f_cnt++;
      } 
  //    Print( "GetLocalData: Таймсерия не построена!" );
    }
    else
    {
      uint start_tick = GetTickCount();
//---        
      while ( !CheckTimer( start_tick, 5 ) )
      {
        fail_cnt--;
        fail_cnt++;
      }
    }
//---   
    fail_cnt++;
  }
//  Print( "GetLocalData: Нет данных в терминале!" );
  return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator Get server data function                        |
//+------------------------------------------------------------------+
int LoadServerData( const string a_symbol, ENUM_TIMEFRAMES period )
{
  int fail_cnt = 0;
//---
  while ( ( fail_cnt < 5 ) && !IsStopped() )
  {   
    long first_date = long( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE ) );
//---
    if ( first_date > 0 )
    {
      if ( SymbolIsSynchronized( a_symbol ) )
      {
  //      Print( "LoadServerData: Первая дата на сервере есть. Пробуем получить локальные данные..." );
        return( GetLocalData( a_symbol, period ) );
      }  
    }
    else
    {
      uint start_tick = GetTickCount();
//---        
      while ( !CheckTimer( start_tick, 10 ) )
      {
        fail_cnt--;
        fail_cnt++;
      }
    }    
    fail_cnt++;
  }
 // Print( "LoadServerData: Первой даты на сервере нет!" );
  return( 0 );  
}
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period )
{
  if ( !IsStopped() )
  {
    int a_bars = Bars( symbol, period );
//---
    if ( a_bars > 0 )
    {
      return( a_bars ); 
    }
    else
    {
  //    Print( "GetBars: Бары не получены проверяем синхронизации..." );
//---Check symbol is synchronized  
      if ( SymbolIsSynchronized( symbol ) )
      {
    //    Print( "GetBars: Символ сихронизирован. Проверяем таймсерию..." );
//---Check series is synchronized
        if ( bool( SeriesInfoInteger( symbol, period, SERIES_SYNCHRONIZED ) ) )
        {
     //     Print( "GetBars: Серия синхронизирована. Пробуем получить бары..." );
          a_bars = Bars( symbol, period );  
//---           
          if ( a_bars > 0 )
          {
            return( a_bars );
          }
          else
          {
            return( GetLocalData( symbol, period ) );
          }  
        }
        else
        {
      //    Print( "GetBars: Серия не сихронизирована. Пробуем получить данные из терминала..." );
          return( GetLocalData( symbol, period ) );
        }    
      }  
      else
      {
    //    Print( "GetBars: Символ не синхронизирован. Пробуем получить данные с сервера..." );
        return( LoadServerData( symbol, period ) );
      }  
    }   
  }  
  return( 0 );
}

Die Funktion OnBookEvent() wird bei BR-8.15- und BR-9.15-Zeichen recht häufig ausgelöst,

aber das Ergebnis ist das gleiche:

2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15

Wo liegt also das Problem?

Warum ist es unmöglich, Bars zu bekommen?

 
Михаил:

Die Funktion OnBookEvent() wird bei den Zeichen BR-8.15 und BR-9.15 recht häufig ausgelöst,

aber das Ergebnis ist das gleiche:

Wo liegt also das Problem?

Warum ist es unmöglich, Bars zu bekommen?

Die Häufigkeit von "oft genug" ist nicht vertrauenserweckend. Besser ist es, die Log-Ausgabe der GetBars()-Funktion zur Fehlersuche hinzuzufügen.

Wenn Sie es verstehen wollen, dann öffnen Sie eine Anfrage in Servicedesk. Fügen Sie ein vollständiges Codebeispiel bei, wir werden versuchen, das Problem zu reproduzieren.

 
Anton:

Die Häufigkeit von "oft genug" ist nicht vertrauenserweckend. Besser ist es, die Log-Ausgabe von GetBars() zur Fehlersuche hinzuzufügen.

Wenn Sie es herausfinden wollen, dann öffnen Sie eine Anfrage im Servicedesk. Hängen Sie ein vollständiges Codebeispiel an, damit wir das Problem reproduzieren können.

Gut. Anfrage:Fehler,MetaTrader 5 Client,Eröffnet,Gestartet: 2015.07.24 18:28,#1267768

P/S "Ziemlich oft" sind 10 bis 100 OnBookEvent()-Auslösungen bei zwei hochliquiden Instrumenten pro MINUTE.

 

Hurra!

Support-Team2015.07.29 16:29

Das Problem wurde reproduziert. In der Tat wurden die Symboldaten manchmal selbst bei regelmäßigen Abfragen nicht aus dem Speicher geladen. Der Fehler wird behoben.

Ich danke Ihnen!

 
Михаил:

Michael, ist es Ihnen gelungen, dieses Problem mit dem Abrufen von Reihen aus anderen Symbolen zu lösen? Ich bin es leid, mit meinem Indikator zu kämpfen, er verliert ständig die Synchronisation mit anderen Symbolen.


Im Moment gibt der Demoserver Build 1159 vom 22. Juni 2015 aus. Und auch die Mehrwährungsindikatoren funktionieren furchtbar. Man muss mehrmals die Periode wechseln oder den Indikator neu starten, damit er richtig angezeigt wird. Und nach einer Weile werden die Seriendaten nicht mehr abgerufen. Ich schreibe immer ins Protokoll.

Данные символа "Si-12.15" не синхронизированы с торговым сервером.

An die Entwickler:

Ist es unmöglich, eine Funktion zu erstellen, die nicht prüft , ob Daten synchronisiert sind oder nicht, sondern direkt synchronisiert und diese Daten nicht aus dem Speicher entlädt?

Die Ressourceneinsparung ist im Hinblick auf die Optimierung des Algorithmus gut. Aber warum sollte ich so fanatisch sein, wenn es um die Auslagerung von Daten aus dem Speicher geht?

Ich würde lieber ein oder zwei Gigabyte zusätzlichen Speicher in meinem PC kaufen, als mich mit dieser lästigen Synchronisierung von Serien zu belasten.

Erstellen Sie eine Funktion, die einmal bei OnInit() aufgerufen wird, um Daten für das gewünschte Symbol zu laden, und die nicht entladen wird, solange der Indikator läuft.

Das Terminal sollte die Daten vorbereiten und ihre Aktualisierung überwachen, anstatt dass der Benutzer über das erste Datum nachdenkt, wie viele Takte ich habe und auf dem Server, usw.

SynchronizeSymbol("RTS-12.15");
SynchronizeSymbol("BR-10.15");
SynchronizeSymbol("Si-12.15");
 
demonsn:

Michael, ist es Ihnen gelungen, dieses Problem mit dem Abrufen von Reihen aus anderen Symbolen zu lösen? Ich bin es leid, mit meinem Indikator zu kämpfen, er verliert ständig die Synchronisation mit anderen Symbolen.


Im Moment gibt der Demoserver den Build 1159 vom 22. Juni 2015 aus. Und auch die Mehrwährungsindikatoren funktionieren furchtbar. Man muss mehrmals die Periode wechseln oder den Indikator neu starten, damit er richtig angezeigt wird. Und nach einer Weile werden die Seriendaten nicht mehr abgerufen. Ich schreibe immer ins Protokoll.

An die Entwickler:

Ist es unmöglich, eine Funktion zu erstellen, die nicht prüft , ob Daten synchronisiert sind oder nicht, sondern direkt synchronisiert und diese Daten nicht aus dem Speicher entlädt?

Die Ressourceneinsparung ist im Hinblick auf die Optimierung des Algorithmus gut. Aber warum sollte ich so fanatisch sein, wenn es um die Auslagerung von Daten aus dem Speicher geht?

Lieber kaufe ich ein oder zwei Gigabyte zusätzlichen Speicher in meinem PC, als mich mit dieser lästigen Seriensynchronisation herumzuschlagen.

Erstellen Sie eine Funktion, die einmal in OnInit() aufgerufen wird, um Daten für das gewünschte Symbol zu laden, und die erst wieder entladen wird, wenn der Indikator läuft.

Das Terminal sollte die Daten vorbereiten und ihre Aktualisierung überwachen, anstatt dass der Benutzer über das erste Datum nachdenkt, wie viele Takte ich habe und auf dem Server, usw.

Guten Tag!

Die Entwickler haben geantwortet, dass sie das Problem mit dem neuen Build beheben werden.

Es ist noch nicht bekannt, wann es veröffentlicht wird.

 
Es dauert drei Jahre, bis man bekommt, was einem versprochen wurde.)
 

FORTS. Ich bin auf ein Problem gestoßen, die Funktionen OrderCheck() und OrderCalcMargin() ermitteln manchmal (!) den erforderlichen GO für einen Trade falsch und geben infolgedessen FALSE zurück.

Mit dem erforderlichen GO für RTS-12.15(SYMBOL_MARGIN_INITIAL) von 12.500 , erfordert die Funktion so viel wie 143.105 Rubel!

Gleichzeitig lässt sich alles perfekt manuell öffnen.

Wie kann ich anrufen?

MqlTradeRequest MtRequest = {0}; 

MqlTradeRequest.action = TRADE_ACTION_DEAL;
MqlTradeRequest.magic  = 0;
MqlTradeRequest.order  = 0;
MqlTradeRequest.symbol = "RTS-12.15";
MqlTradeRequest.volume = 1.00;
MqlTradeRequest.price  = 86470;
MqlTradeRequest.stoplimit = 0;
MqlTradeRequest.sl = 0;
MqlTradeRequest.tp = 0;
MqlTradeRequest.deviation = 50;
MqlTradeRequest.type = ORDER_TYPE_SELL;
MqlTradeRequest.type_filling = ORDER_FILLING_FOK;
MqlTradeRequest.type_time = gtc;
MqlTradeRequest.expiration = 0;
MqlTradeRequest.comment = NULL;

MqlTradeCheckResult MtCheckResult = {0};

OrderCheck(MtRequest,MtCheckResult);

Получаю в ответ False и такую структуру:

MqlTradeCheckResult.retcode:      10019 (There is not enough money to complete the request)
MqlTradeCheckResult.balance:      132727.37
MqlTradeCheckResult.equity:       130772.91
MqlTradeCheckResult.profit:       0.00
MqlTradeCheckResult.margin:       143104.55
MqlTradeCheckResult.margin_free: -12331.64
MqlTradeCheckResult.margin_level: 91.38
MqlTradeCheckResult.comment:      No money

 

Versuchen Sie es auf diese Weise:

  MqlTradeRequest MtRequest = {0}; 
  MqlTradeCheckResult MtCheckResult = {0};
//---
  MtRequest.action = TRADE_ACTION_DEAL;
  MtRequest.magic  = 7777777777;
  MtRequest.symbol = "RTS-12.15";
  MtRequest.volume = 1.00;
  MtRequest.price  = 86470;
  MtRequest.type = ORDER_TYPE_SELL;
  MtRequest.type_filling = ORDER_FILLING_FOK;
  MtRequest.type_time = ORDER_TIME_DAY;
//---
 if ( OrderCheck( MtRequest, MtCheckResult ) )
 {
   Print( "retcode = ", MtCheckResult.retcode );
   Print( "balance = ", MtCheckResult.balance );
   Print( "equity = ",  MtCheckResult.equity );
   Print( "profit = ", MtCheckResult.profit );
   Print( "margin = ", MtCheckResult.margin );
   Print( "margin_free = ", MtCheckResult.margin_free  );
   Print( "margin_level = ", MtCheckResult.margin_level );
 }

Hier ist mein Ergebnis:

2015.10.22 15:38:39.520 LastPrice (RTS-12.15,M1)        margin_level = 979.8676728569379
2015.10.22 15:38:39.334 LastPrice (RTS-12.15,M1)        margin_free = 112198.35
2015.10.22 15:38:39.151 LastPrice (RTS-12.15,M1)        margin = 12751.73
2015.10.22 15:38:38.973 LastPrice (RTS-12.15,M1)        profit = 0.0
2015.10.22 15:38:38.797 LastPrice (RTS-12.15,M1)        equity = 124950.08
2015.10.22 15:38:38.623 LastPrice (RTS-12.15,M1)        balance = 124950.08
2015.10.22 15:38:38.397 LastPrice (RTS-12.15,M1)        retcode = 0
 
Ich danke Ihnen. Ihre Option wurde als Parallelprüfung hinzugefügt. Jetzt kommt es nur noch darauf an, den richtigen Moment zu erwischen.