FORTES Por favor, ajude - página 29

 

Boa tarde, Anton!

Seguindo seu conselho (LoadServerData() chama SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE),

ou seja, lê-se "primeira data da história por símbolo no servidor, independentemente do período".

Este pedido em si não é realmente considerado um pedido de histórico, ou seja, não causa a construção de um cache,

não impede o descarregamento de dados de símbolos. Faz sentido solicitar o SERIES_FIRSTDATE ou o número de barras das séries de tempo.),

Adicionei uma nova função ao indicador para evitar o descarregamento de dados de símbolos:

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

A função OnBookEvent() é acionada nos caracteres BR-8.15 e BR-9.15 com bastante freqüência,

mas o resultado é o mesmo:

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

Então, qual é o problema?

Por que é impossível conseguir Bars?

 
Михаил:

A função OnBookEvent() aciona nos caracteres BR-8.15 e BR-9.15 com bastante freqüência,

mas o resultado é o mesmo:

Então, qual é o problema?

Por que é impossível conseguir Bars?

A freqüência de "com freqüência suficiente" não inspira confiança. Melhor adicionar a saída de log da função GetBars() para depuração.

Se você quiser entendê-lo, então abra um pedido em servicedesk. Anexar exemplo de código completo, tentaremos reproduzir o problema.

 
Anton:

A freqüência de "com freqüência suficiente" não inspira confiança. Melhor adicionar a saída de log da GetBars() para depuração.

Se você tiver vontade de descobrir, então abra um pedido no Servicedesk. Anexe um exemplo de código completo, vamos tentar reproduzir o problema.

Ok. Solicitação:Erros,Cliente MetaTrader 5,Aberto,Iniciado: 2015.07.24 18:28,#1267768

P/S "Muitas vezes" é 10 a 100 OnBookEvent() aciona em dois instrumentos altamente líquidos por MINUTO.

 

Viva!

Equipe de apoio2015.07.29 16:29

Reproduziu o problema. De fato, os dados dos símbolos às vezes eram descarregados da memória, mesmo com consultas periódicas. O erro será corrigido.

Obrigado!

 
Михаил:

Michael, você conseguiu superar este problema com a obtenção de séries de outros símbolos? Estou farto de lutar com meu indicador, ele perde constantemente a sincronização com outros símbolos.


Neste momento, o servidor demo está distribuindo o Build 1159 de 22 de junho de 2015. E nele os indicadores de múltiplas moedas também funcionam horrivelmente. Você tem que trocar os períodos várias vezes ou reiniciar o indicador para que ele seja exibido corretamente. E depois de um tempo não recebe os dados da série novamente. Eu sempre escrevo no diário de bordo.

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

Para os desenvolvedores:

É impossível fazer uma função, não para verificar se os dados estão sincronizados ou não, mas diretamente para sincronizar e não para descarregar esses dados da memória?

A economia de recursos é boa, em termos de otimização de algoritmos. Mas por que eu deveria ser tão fanático por descarregar dados da memória?

Eu preferiria comprar um ou dois gigabytes adicionais de memória em meu PC em vez de me preocupar com esta preocupação de sincronização em série.

Faça uma função que é chamada uma vez no OnInit() para carregar dados para o símbolo requerido e não será descarregada enquanto o indicador estiver funcionando.

O terminal deve preparar os dados e monitorar suas atualizações, ao invés de o usuário pensar na primeira data, quantas barras eu tenho e no servidor, etc.

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

Michael, você conseguiu superar este problema com a obtenção de séries de outros símbolos? Estou farto de lutar com meu indicador, ele perde constantemente a sincronização com outros símbolos.


Neste momento, o servidor demo está emitindo o build 1159 a partir de 22 de junho de 2015. E nele os indicadores de múltiplas moedas também funcionam de forma horrível. Você tem que trocar os períodos várias vezes ou reiniciar o indicador para que ele seja exibido corretamente. E depois de um tempo não recebe os dados da série novamente. Eu sempre escrevo no diário de bordo.

Para os desenvolvedores:

Você não pode fazer uma função, não para verificar se os dados estão sincronizados ou não, mas diretamente para sincronização e não para descarregar esses dados da memória?

A economia de recursos é boa, em termos de otimização de algoritmos. Mas por que eu deveria ser tão fanático por descarregar dados da memória?

Eu preferiria comprar um ou dois gigabytes adicionais de memória em meu PC em vez de me preocupar com esta preocupação de sincronização em série.

Faça uma função que é chamada uma vez no OnInit() para carregar dados para o símbolo requerido e não será descarregada novamente até que o indicador funcione.

O terminal deve preparar os dados e monitorar suas atualizações, ao invés de o usuário pensar na primeira data, quantas barras eu tenho e no servidor, etc.

Boa tarde!

Os desenvolvedores responderam que irão consertá-la na nova construção.

Ainda não se sabe quando será lançado.

 
Leva três anos para conseguir o que lhe é prometido).
 

FORTES. Encontrei um problema, funções OrderCheck() e OrderCalcMargin() algumas vezes (!) determinam incorretamente o GO necessário para uma troca e como resultado retornam FALSE.

Com o GO requerido para RTS-12.15(SYMBOL_MARGIN_INITIAL) de 12.500 , a função requer até 143.105 rublos!

Ao mesmo tempo, tudo se abre perfeitamente manualmente.

Como posso ligar:

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

 

Tente desta forma:

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

Aqui está o meu resultado:

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
 
Obrigado. Acrescentou sua opção como uma verificação paralela. Agora é apenas uma questão de pegar o momento certo.
Razão: