FORTALEZAS Por favor, ayuda - página 29

 

¡Buenas tardes, Anton!

Siguiendo tu consejo (LoadServerData() llama a SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE),

Es decir, se lee "primera fecha en el historial por símbolo en el servidor, independientemente del periodo".

Esta solicitud en sí no se considera una solicitud de historial, es decir, no provoca la creación de una caché,

no impide la descarga de los datos de los símbolos. Tiene sentido solicitar la SERIES_FIRSTDATE o el número de barras de la serie temporal.),

He añadido una nueva función al indicador para evitar la descarga de los datos de los 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 );
}

La función OnBookEvent() se activa en los caracteres BR-8.15 y BR-9.15 con bastante frecuencia,

pero el resultado es el mismo:

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

¿Cuál es el problema?

¿Por qué es imposible conseguir Bares?

 
Михаил:

La función OnBookEvent() se activa en los caracteres BR-8.15 y BR-9.15 con bastante frecuencia,

pero el resultado es el mismo:

¿Cuál es el problema?

¿Por qué es imposible conseguir Bares?

La frecuencia de "lo suficiente" no inspira confianza. Es mejor añadir la salida de registro de la función GetBars() para la depuración.

Si quieres entenderlo, abre una solicitud en servicedesk. Adjunte un ejemplo de código completo, intentaremos reproducir el problema.

 
Anton:

La frecuencia de "lo suficiente" no inspira confianza. Es mejor añadir la salida del registro de GetBars() para la depuración.

Si tienes ganas de averiguarlo, abre una solicitud en el servicedesk. Adjunto un ejemplo de código completo, vamos a intentar reproducir el problema.

Bien. Solicitud:Errores,Cliente MetaTrader 5,Abierto,Iniciado: 2015.07.24 18:28,#1267768

P/S "Bastante a menudo" es de 10 a 100 disparos de OnBookEvent() en dos instrumentos de gran liquidez por MINUTO.

 

¡Hurra!

Equipo de apoyo2015.07.29 16:29

He reproducido el problema. De hecho, los datos de los símbolos se descargaban a veces de la memoria incluso con consultas periódicas. El error será corregido.

Gracias.

 
Михаил:

Michael, ¿has conseguido superar este problema con la obtención de series de otros símbolos? Estoy harto de pelearme con mi indicador, constantemente pierde la sincronización con otros símbolos.


Ahora mismo el servidor de demostración está dando la Build 1159 del 22 de junio de 2015. Y en él los indicadores multidivisa funcionan horriblemente también. Hay que cambiar de periodo varias veces o reiniciar el indicador para que se muestre correctamente. Y después de un tiempo no vuelve a obtener los datos de la serie. Siempre escribo en el registro.

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

A los desarrolladores:

¿Es imposible hacer una función, no para comprobar si los datos están sincronizados o no, sino directamente para sincronizar y no para descargar estos datos de la memoria?

El ahorro de recursos es bueno, en términos de optimización del algoritmo. Pero, ¿por qué debería ser tan fanático de la descarga de datos de la memoria?

Prefiero comprar uno o dos gigabytes más de memoria en mi PC en lugar de molestarme con esta molesta sincronización de series.

Hacer una función que se llama una vez en OnInit() para cargar los datos para el símbolo requerido y no se descargará mientras el indicador se está ejecutando.

El terminal debe preparar los datos y controlar su relevancia, en lugar de que el usuario piense en la primera cita, en cuántas barras tengo y en el servidor, etc.

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

Michael, ¿has conseguido superar este problema con la obtención de series de otros símbolos? Estoy harto de pelearme con mi indicador, constantemente pierde la sincronización con otros símbolos.


Ahora mismo el servidor de demostración está emitiendo la build 1159 del 22 de junio de 2015. Y en él los indicadores multidivisa también funcionan fatal. Hay que cambiar de periodo varias veces o reiniciar el indicador para que se muestre correctamente. Y después de un tiempo no vuelve a obtener los datos de la serie. Siempre escribo en el registro.

A los desarrolladores:

¿No se puede hacer una función, no para comprobar si los datos están sincronizados o no, sino directamente para la sincronización y no para descargar estos datos de la memoria?

El ahorro de recursos es bueno, en términos de optimización del algoritmo. Pero, ¿por qué debería ser tan fanático de la descarga de datos de la memoria?

Prefiero comprar uno o dos gigabytes adicionales de memoria en mi PC en lugar de molestarme con esta molestia de la sincronización de series.

Haga una función que sea llamada una vez en OnInit() para cargar los datos del símbolo requerido y no será descargada de nuevo hasta que el indicador se ejecute.

El terminal debe preparar los datos y controlar sus actualizaciones, en lugar de que el usuario piense en la primera cita, en cuántas barras tengo y en el servidor, etc.

¡Buenas tardes!

Los desarrolladores han respondido que lo arreglarán en la nueva versión.

Todavía no se sabe cuándo saldrá a la venta.

 
Se necesitan tres años para conseguir lo que se promete).
 

FORTALEZAS. He encontrado un problema, las funciones OrderCheck() y OrderCalcMargin() a veces (!) determinan incorrectamente el GO requerido para una operación y como resultado devuelven FALSE.

Con el GO requerido para RTS-12.15(SYMBOL_MARGIN_INITIAL) de 12.500 , ¡la función requiere nada menos que 143.105 rublos!

Al mismo tiempo, todo se abre perfectamente de forma manual.

¿Cómo puedo llamar?

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

 

Inténtalo de esta manera:

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

Este es mi 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
 
Gracias. Se ha añadido su opción como comprobación paralela. Ahora sólo es cuestión de aprovechar el momento adecuado.
Razón de la queja: