FORTS Veuillez nous aider - page 29

 

Bonjour, Anton !

Suivant vos conseils (LoadServerData() appelle SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE),

c'est-à-dire qu'on lit "première date dans l'historique par symbole sur le serveur sans tenir compte de la période".

Cette requête elle-même n'est pas considérée comme une requête d'historique, c'est-à-dire qu'elle ne provoque pas la construction d'un cache,

n'empêche pas le déchargement des données du symbole. Il est logique de demander soit SERIES_FIRSTDATE, soit le nombre de barres de la série chronologique.),

J'ai ajouté une nouvelle fonction à l'indicateur pour empêcher le déchargement des données des symboles :

//+------------------------------------------------------------------+
// 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 fonction OnBookEvent() est déclenchée assez souvent sur les caractères BR-8.15 et BR-9.15,

mais le résultat est le même :

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

Alors quel est le problème ?

Pourquoi est-il impossible d'obtenir des Bars ?

 
Михаил:

La fonction OnBookEvent() se déclenche assez souvent sur les caractères BR-8.15 et BR-9.15,

mais le résultat est le même :

Alors quel est le problème ?

Pourquoi est-il impossible d'obtenir des Bars ?

La fréquence des "assez souvent" n'inspire pas confiance. Il est préférable d'ajouter la sortie du journal de la fonction GetBars() pour le débogage.

Si vous voulez le comprendre, ouvrez une demande dans Servicedesk. Joignez un exemple de code complet, nous allons essayer de reproduire le problème.

 
Anton:

La fréquence des "assez souvent" n'inspire pas confiance. Il est préférable d'ajouter la sortie du journal de GetBars() pour le débogage.

Si vous voulez le découvrir, ouvrez une demande dans le servicedesk. Joignez un exemple de code complet, essayons de reproduire le problème.

Ok. Demande :Erreurs,MetaTrader 5 Client,Ouvert,Démarré : 2015.07.24 18:28,#1267768

P/S "Assez souvent", c'est 10 à 100 déclenchements OnBookEvent() sur deux instruments très liquides par MINUTE.

 

Hourra !

Équipe de soutien2015.07.29 16:29

J'ai reproduit le problème. En effet, les données des symboles étaient parfois déchargées de la mémoire même avec des requêtes périodiques. L'erreur sera corrigée.

Merci !

 
Михаил:

Michael, avez-vous réussi à surmonter ce problème d'obtention de séries à partir d'autres symboles ? J'en ai assez de me battre avec mon indicateur, il perd constamment la synchronisation avec les autres symboles.


En ce moment, le serveur de démonstration donne la Build 1159 du 22 juin 2015. Et les indicateurs multidevises y fonctionnent aussi très mal. Vous devez changer de période plusieurs fois ou redémarrer l'indicateur pour qu'il s'affiche correctement. Et au bout d'un moment, il ne récupère plus les données de la série. J'écris toujours dans le journal.

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

Aux développeurs:

Est-il impossible de faire une fonction, non pas pour vérifier si les données sont synchronisées ou non, mais directement pour synchroniser et non pas pour décharger ces données de la mémoire ?

L'économie de ressources est bonne, en termes d'optimisation des algorithmes. Mais pourquoi devrais-je être aussi fanatique pour décharger les données de la mémoire ?

Je préfère acheter un ou deux gigaoctets de mémoire supplémentaires dans mon PC plutôt que de m'embêter avec cette pénible synchronisation de séries.

Créez une fonction qui est appelée une fois à OnInit() pour charger les données du symbole requis et qui ne sera pas déchargée avant l'exécution de l'indicateur.

Le terminal doit préparer les données et contrôler leur pertinence, au lieu que l'utilisateur pense au premier rendez-vous, au nombre de bars que j'ai et au serveur, etc.

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

Michael, avez-vous réussi à surmonter ce problème d'obtention de séries à partir d'autres symboles ? J'en ai assez de me battre avec mon indicateur, il perd constamment la synchronisation avec les autres symboles.


Actuellement, le serveur de démonstration émet la build 1159 du 22 juin 2015. Et les indicateurs multidevises y fonctionnent également très mal. Vous devez changer de période plusieurs fois ou redémarrer l'indicateur pour qu'il s'affiche correctement. Et au bout d'un moment, il ne récupère plus les données de la série. J'écris toujours dans le journal.

Aux développeurs:

Est-il impossible de faire une fonction, non pas pour vérifier si les données sont synchronisées ou non, mais directement pour synchroniser et non pas pour décharger ces données de la mémoire ?

L'économie de ressources est bonne, en termes d'optimisation des algorithmes. Mais pourquoi devrais-je être aussi fanatique pour décharger les données de la mémoire ?

Je préfère acheter un ou deux gigaoctets de mémoire supplémentaires dans mon PC plutôt que de m'embêter avec cette pénible synchronisation de séries.

Créez une fonction qui est appelée une fois dans OnInit() pour charger les données pour le symbole requis et qui ne sera plus déchargée jusqu'à ce que l'indicateur fonctionne.

Le terminal doit préparer les données et surveiller leurs mises à jour, au lieu que l'utilisateur pense au premier rendez-vous, au nombre de bars que j'ai et au serveur, etc.

Bonjour !

Les développeurs ont répondu qu'ils allaient corriger ce problème dans la nouvelle version.

La date de sa sortie n'est pas encore connue.

 
Il faut trois ans pour obtenir ce que l'on vous promet).
 

FORTS. J'ai rencontré un problème, les fonctions OrderCheck() et OrderCalcMargin() déterminent parfois ( !) incorrectement le GO requis pour une transaction et renvoient donc FALSE.

Avec le GO requis pour RTS-12.15(SYMBOL_MARGIN_INITIAL) de 12.500 , la fonction nécessite pas moins de 143.105 roubles !

En même temps, tout s'ouvre parfaitement manuellement.

Comment puis-je appeler :

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

 

Essayez de cette façon :

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

Voici mon résultat :

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
 
Merci. Ajout de votre option comme contrôle parallèle. Maintenant, il s'agit juste d'attraper le bon moment.