FORTS : Pour aider les débutants - page 3

 

Fonctions utiles et fréquemment utilisées:

Contrôle du prix limite de la session :

//+------------------------------------------------------------------+
//| Expert Check price range function                                |
//+------------------------------------------------------------------+
bool CheckPriceRange( const string a_symbol, const double price )
{
  double min_price = SymbolInfoDouble( a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MIN );
  double max_price = SymbolInfoDouble( a_symbol, SYMBOL_SESSION_PRICE_LIMIT_MAX );
  if ( ( price >= min_price ) && ( price <= max_price ) )
  {
    return( true );
  }
  return( false );
}
 

Fonctions utiles et fréquemment utilisées:

Redéfinition de la fonction GetPositionPrice() :

//+------------------------------------------------------------------+
//| Expert Get position price function                               |
//+------------------------------------------------------------------+
double GetPositionPrice( const string aSymbol )
{
  double price_in = 0;
  double volume_in = 0;
  double price_out = 0;
  double volume_out = 0;
  double price = 0;
  double volume = 0;
//---  
  ulong pos_id = ulong( PositionGetInteger( POSITION_IDENTIFIER ) );
    
  if ( pos_id > 0 )
  {
      if ( HistorySelectByPosition( pos_id ) )
      {
        int deals = HistoryDealsTotal();
      
        for( int i = 0; i < deals; i++ )
        {
          ulong deal_ticket = HistoryDealGetTicket( i );
          ulong order_ticket = ulong( HistoryDealGetInteger( deal_ticket, DEAL_ORDER ) );
        
          if ( order_ticket > 0 )
          {
            ENUM_DEAL_ENTRY deal_entry = ENUM_DEAL_ENTRY( HistoryDealGetInteger( deal_ticket, DEAL_ENTRY ) );
              
            if ( deal_entry == DEAL_ENTRY_IN )
            {
              price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_in += price * volume;
              volume_in += volume;  
            }
            else
            if ( deal_entry == DEAL_ENTRY_OUT )
            {
              price = HistoryDealGetDouble( deal_ticket, DEAL_PRICE );
              volume = HistoryDealGetDouble( deal_ticket, DEAL_VOLUME );
                                
              price_out += price * volume;
              volume_out += volume;  
            }
          }
        }
//---  
        price = price_in - price_out;
        volume = volume_in - volume_out;
//---
        if ( volume > 0 )
        {       
          return( NormalizeDouble( price / volume, _Digits ) );
        }
      }
      else
      {
        Print( "GetPositionPrice: Невозможно получить историю позиции по символу ", aSymbol );
      }
    }
    else
    {
      Print( "GetPositionPrice: Невозможно определить идентификатор позиции по символу ", aSymbol );
    }
  return( 0 );
} 
 

Une petite modification de la fonction (pour la polyvalence)

au lieu de :

if ( volume_in > 0 )
{
  return( NormalizeDouble( price_in / volume_in, _Digits ) );
}

faites-le comme ça :

if ( volume_in > 0 )
{
  int symb_digits = int( SymbolInfoInteger( aSymbol, SYMBOL_DIGITS ) );
  return( NormalizeDouble( price_in / volume_in, symb_digits ) );
}
 
Build 1241. compte réel. si un ordre en attente est fixé et partiellement exécuté, son état ne passe pas à ORDER_STATE_PLACED, mais reste ORDER_STATE_PARTIAL.
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Quand la nouvelle version de MT5 sera-t-elle disponible et où trouver ce qui est attendu d'elle ?

comp, 2016.03.21 08:52

Si, par exemple, je le fais moi-même : ouvrir un compte réel et mettre l'accès aux investissements sur les forums afin que tout le monde puisse voir le flux réel de FORTS en temps réel et avoir accès aux tests normaux, pourrait-il y avoir un problème ? Ou est-ce clair ?

 
Bonjour, existe-t-il un modèle de système de trading simple ou un exemple d'EA pour FORTS, prenant en compte les caractéristiques décrites dans ce fil de discussion ? J'ai besoin que cela fonctionne correctement avec les commandes sur les FORTS.
 

"Recommandation:

Lors de la conception d'EA pour FORTS, je ne recommande pas d'utiliser l'événement Tick, mais plutôt

Il est préférable d'utiliserl'événement BookEvent".

Il n'est pas expliqué pourquoi c'est mieux, peut-être dans certains cas c'est mieux, dans d'autres cas c'est mieux surTick. Pourriez-vous être plus précis ?

 
Alexander:

"Recommandation:

Lors de la conception d'EA pour FORTS, je ne recommande pas d'utiliser l'événement Tick, mais plutôt

Il est préférable d'utiliserl'événement BookEvent".

Il n'est pas expliqué pourquoi c'est mieux, peut-être dans certains cas c'est mieux, dans d'autres cas c'est mieux surTick. Pourriez-vous être plus précis ?

L'auteur est dans le ban et vous n'entendrez pas de réponse ici avant un certain temps.

Voici ce que j'en pense :

L'événement Tick ne se produit que lorsque Bid, Ask, Last sont modifiés. De plus, l'événement Tick est cumulatif (comme l'ont dit les développeurs), car plusieurs changements de prix peuvent survenir en un seul Tick.

L'événement BookEvent arrive lors de toute modification des ordres sur le marché des paris et lors de l'exécution des transactions. L'événement BookEvent est beaucoup plus fréquent.

Il est préférable d'utiliser OnTick() si vous n'avez pas besoin d'analyser la liquidité du marché.

Sur les symboles très liquides, l'événement BookEvent survient très souvent et s'il y a des calculs lourds ou plusieurs indicateurs lourds dans le gestionnaire, il fonctionnera comme une boucle.

Si votre conseiller expert a d'autres gestionnaires d'événements, comme OnTimer, vous pouvez manquer ces événements.Je ne connais pas les événementsOnTradeTransaction etOnTrade, peut-être peuvent-ils être ignorés.

Voici quelques informations pour vous :

La longueur de la file d'attente des transactions est de 1024 éléments. Si la fonction OnTradeTransaction() prend trop de temps pour traiter une autre transaction, les anciennes transactions de la file d'attente peuvent être remplacées par des transactions plus récentes.

 
Sergey Chalyshev:

L'auteur est en interdiction et vous n'entendrez pas parler de lui ici pendant un certain temps.

Cela fait un moment que Michael a été libéré des bains publics... Ici, il a changé son nom de jeune fille.
 
Alexey Kozitsyn:
Cela fait longtemps que Michael a été libéré des bains publics... Ici, il a changé d'avatar.
Qu'est-ce que son ava a à voir avec ça ? Il ne peut pas écrire sur le forum, il est banni pour toujours.