FORTI Si prega di aiutare - pagina 29

 

Buon pomeriggio, Anton!

Seguendo i vostri consigli (LoadServerData() chiama SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE),

cioè si legge "prima data nella storia per simbolo sul server indipendentemente dal periodo".

Questa richiesta in sé non è effettivamente considerata una richiesta di cronologia, cioè non causa la costruzione di una cache,

non impedisce lo scarico dei dati del simbolo. Ha senso richiedere SERIES_FIRSTDATE o il numero di barre della serie temporale.),

Ho aggiunto una nuova funzione all'indicatore per evitare lo scarico dei dati del simbolo:

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

La funzione OnBookEvent() viene attivata sui caratteri BR-8.15 e BR-9.15 abbastanza spesso,

ma il risultato è lo stesso:

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

Allora qual è il problema?

Perché è impossibile ottenere Bars?

 
Михаил:

La funzione OnBookEvent() si attiva sui caratteri BR-8.15 e BR-9.15 abbastanza spesso,

ma il risultato è lo stesso:

Allora qual è il problema?

Perché è impossibile ottenere Bars?

La frequenza di "abbastanza spesso" non ispira fiducia. Meglio aggiungere l'output del log dalla funzione GetBars() per il debug.

Se volete capirlo, allora aprite una richiesta in servicedesk. Allega un esempio di codice completo, cercheremo di riprodurre il problema.

 
Anton:

La frequenza di "abbastanza spesso" non ispira fiducia. Meglio aggiungere l'output del log da GetBars() per il debug.

Se volete capirlo, allora aprite una richiesta nel servicedesk. Allega un esempio di codice completo, proviamo a riprodurre il problema.

Ok. Richiesta:Errori,MetaTrader 5 Client,Aperto,Iniziato: 2015.07.24 18:28,#1267768

P/S "Abbastanza spesso" è da 10 a 100 trigger OnBookEvent() su due strumenti altamente liquidi al MINUTO.

 

Urrà!

Squadra di supporto2015.07.29 16:29

Riprodotto il problema. Infatti i dati dei simboli venivano talvolta scaricati dalla memoria anche con le interrogazioni periodiche. L'errore sarà risolto.

Grazie!

 
Михаил:

Michael, sei riuscito a superare questo problema di ottenere serie da altri simboli? Sono stufo di combattere con il mio indicatore, perde costantemente la sincronizzazione con altri simboli.


In questo momento il server demo sta dando la Build 1159 del 22 giugno 2015. E anche gli indicatori multivaluta funzionano orribilmente. Bisogna cambiare periodo diverse volte o riavviare l'indicatore per farlo visualizzare correttamente. E dopo un po' non riceve più i dati della serie. Scrivo sempre nel registro.

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

Agli sviluppatori:

È impossibile fare una funzione, non per controllare se i dati sono sincronizzati o no, ma direttamente per sincronizzare e non per scaricare questi dati dalla memoria?

Il risparmio di risorse è buono, in termini di ottimizzazione dell'algoritmo. Ma perché dovrei essere così fanatico nello scaricare i dati dalla memoria?

Preferirei comprare un gigabyte o due di memoria in più nel mio PC invece di preoccuparmi di questa fastidiosa sincronizzazione in serie.

Fate una funzione che viene chiamata una volta a OnInit() per caricare i dati per il simbolo richiesto e non verrà scaricata finché l'indicatore è in funzione.

Il terminale dovrebbe preparare i dati e controllare la loro rilevanza, invece che l'utente che pensa al primo appuntamento, a quante barre ho e sul server, ecc.

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

Michael, sei riuscito a superare questo problema di ottenere serie da altri simboli? Sono stufo di combattere con il mio indicatore, perde costantemente la sincronizzazione con altri simboli.


In questo momento il server demo sta emettendo Bild 1159 del 22 giugno 2015. E in esso anche gli indicatori multivaluta funzionano orribilmente. Bisogna cambiare periodo diverse volte o riavviare l'indicatore per farlo visualizzare correttamente. E dopo un po' non riceve più i dati della serie. Scrivo sempre nel registro.

Agli sviluppatori:

Non si può fare una funzione, non per controllare se i dati sono sincronizzati o no, ma direttamente per sincronizzare e non per scaricare questi dati dalla memoria?

Il risparmio di risorse è buono, in termini di ottimizzazione dell'algoritmo. Ma perché dovrei essere così fanatico nello scaricare i dati dalla memoria?

Preferirei comprare un gigabyte o due di memoria in più nel mio PC invece di preoccuparmi di questa fastidiosa sincronizzazione in serie.

Fate una funzione che viene chiamata una volta in OnInit() per caricare i dati per il simbolo richiesto e non verrà scaricata di nuovo fino a quando l'indicatore non verrà eseguito.

Il terminale dovrebbe preparare i dati e monitorare i loro aggiornamenti, invece che l'utente che pensa al primo appuntamento, quante barre ho e sul server, ecc.

Buon pomeriggio!

Gli sviluppatori hanno risposto che lo sistemeranno nella nuova build.

Non si sa ancora quando sarà rilasciato.

 
Ci vogliono tre anni per ottenere ciò che ti viene promesso).
 

FORTI. Ho riscontrato un problema, le funzioni OrderCheck() e OrderCalcMargin() a volte (!) determinano erroneamente il GO richiesto per un trade e come risultato restituiscono FALSE.

Con il GO richiesto per RTS-12.15(SYMBOL_MARGIN_INITIAL) di 12.500 , la funzione richiede ben 143.105 rubli!

Allo stesso tempo tutto si apre perfettamente manualmente.

Come faccio a chiamare:

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

 

Provate in questo modo:

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

Ecco il mio risultato:

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
 
Grazie. Aggiunta la vostra opzione come controllo parallelo. Ora si tratta solo di cogliere il momento giusto.