Questions des débutants MQL5 MT5 MetaTrader 5 - page 1113

 

Salutations. J'ai regardé la vidéo compétente "From MQL4 to MQL5 - how to rewrite EAs for Metatrader 5".
Merci à l'auteur. J'ai décidé de l'essayer moi-même. J'ai décidé de l'essayer moi-même. L'idée est la suivante :
1. J'ai défini dtriger = 1 dans les entrées - L'achat s'ouvre.
2. Je règle dtriger = -1 - La vente s'ouvre.
3. J'ai réglé dtriger = 0 - tous les ouverts sont fermés.
J'ai lu dans la FAQ que dans MT5 il n'est pas possible de maintenir des positions opposées,
et je les ai.
Question : comment prescrire correctement la fermeture d'une position existante ?
La question est la suivante : comment enregistrer correctement la fermeture d'une position existante lors de l'ouverture d'une position inverse ?
Merci beaucoup.

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int          triger            = 0;
input double    StartLot             = 0.01;
input double    lpos_volume       = 1.0;
input int          Step         = 10;
input int          MagicNumber    = 12345;      //      Magic   nuaber
input int          Slippage          = 30;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else 
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime              lpos_time          =        0;
      double                lpos_price_open    =        0.0;
      ENUM_POSITION_TYPE   lpos_type           =        -1;
      int                      pos_count               =        0;
      double                sum_profit         = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--) 
   {
      if (o_order.SelectByIndex(i)) 
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if(dtriger == 0 )
   {
      CloseAll();
      return;               
   } 
   
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
      
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
     
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
      
    return(true);
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{ 
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); 
 
   return((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- ) 
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
 
procom:

Salutations. J'ai regardé le clip utile "From MQL4 to MQL5 - how to rewrite EAs for Metatrader 5".
Je tiens à féliciter l'auteur. J'ai décidé de l'essayer moi-même. Je l'ai écrit. Mon idée est la suivante :
1. je règle dtriger = 1 - ouvre l'achat.
2. Je règle dtriger = -1 - La vente s'ouvre.
3. J'ai réglé dtriger = 0 - tous les ouverts sont fermés.
J'ai lu dans la FAQ que dans MT5 il n'est pas possible de maintenir des positions opposées,
et je les ai.
Question : comment prescrire correctement la fermeture d'une position existante ?
La question est la suivante : comment enregistrer correctement la fermeture d'une position existante lors de l'ouverture d'une position inverse ?
Merci beaucoup.

Vous avez dû être très inattentif en lisant la fiche d'information.

Référence :Principes généraux - Opérations de négociation.

En résumé : MetaTrader 5 dispose à la fois dessystèmes Netting et Hedging.

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 

Je formulerais votre tâche différemment :

1. dtriger = 1 - Achat ouvre.
2. dtriger = -1 - Vente ouvre.
3. dtriger = 0 - tous les ouverts sont fermés.

Le conseiller expert doit faire ce qui suit :

  • si vous avez besoin d'ouvrir une position d'achat, vous devez d'abord fermer une position de vente (émettez une commande pour fermer les positions de vente - peu importe qu'elles soient là ou non).
  • si vous devez ouvrir une position de vente, vous devez d'abord fermer une position d'achat (une commande pour fermer une position d'achat sera émise, qu'elle existe ou non).
  • si le client a besoin de tout clôturer, il suffit de clôturer toutes les positions (qu'elles soient ACHETEUSES ou VENDEUS).

Deux algorithmes sont nécessaires pour la mise en œuvre (le nombre magique y contribue également) - il peut être désactivé.

//+------------------------------------------------------------------+
//| Close positions                                                  |
//+------------------------------------------------------------------+
void ClosePositions(const ENUM_POSITION_TYPE pos_type)
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            if(m_position.PositionType()==pos_type) // gets the position type
               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }

и

//+------------------------------------------------------------------+
//| Close all positions                                              |
//+------------------------------------------------------------------+
void CloseAllPositions(void)
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==InpMagic)
            m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol
  }


L'idée générale est de faire une boucle autour de toutes les positions dePositionsTotal()-1 à 0. C'est de PositionsTotal()-1 à 0, et non de zéro à PositionsTotal()-1. C'est important.

 
Un conseil également : lorsque vous travaillez dans MetaTrader 5, un ordre est un ORDRE ENLEVÉ. Il est donc fortement recommandé de ne pas évoquer le mot "commande" à ce stade initial, afin de ne pas créer de confusion dans votre esprit.
 
Vladimir Karputov:
Un conseil également : lorsque vous travaillez dans MetaTrader 5, un ordre est un ORDRE ENLEVÉ. Il est donc fortement recommandé de ne même pas se souvenir du mot "ordre" au départ, afin de ne pas créer de confusion dans votre esprit.

Il existe également des ordres de marché Achat et Vente, ainsi que des ordres CloseBy.

 

Merci beaucoup, comme la musique.

 
procom:

Merci beaucoup, comme la musique.

Si vous avez besoin d'une explication de mes codes, n'hésitez pas à demander.
 

Eh bien, si vous êtes si gentil, plus alors.
J'ai mis les entrées et prescrit une pré-clôture, mais à nouveau les ordres sont suspendus là et là.

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.PositionClose(o_symbol.Name());
         }
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }
 
procom:

Eh bien, si vous êtes si gentil, plus alors.
J'ai inséré les entrées et prescrit une pré-clôture, mais là encore, il y a des ordres suspendus ici et là.

Les opérations de fermeture et d'ouverture doivent être séparées, c'est-à-dire qu'il ne faut pas effectuer ces opérations dans un tas.
Un exemple de plan : OnTick() vérifie d'abord trois drapeaux : ExtNeedCloseBuy, ExtNeedCloseSell et ExtNeedCloseAll.
Et seulement ensuite, nous vérifions deux drapeaux : ExtNeedOpenBuy et ExtNeedOpenSell.
De cette façon, tout se déroulera dans un ordre strict.
Et oui, il n'y a pas d'ordres : il y a des positions ouvertes.
 
procom:

Merci beaucoup, tout comme les notes.

Quel est le signal d'ouverture ? Parce que le code n'est pas complet - seulement des positions de fermeture, mais j'ai aussi besoin d'ouvrir des positions...


Commande commerciale.mq5
#propriété version "1.000"

Pour l'instant, il n'effectue que trois actions :

  • Fermer tous les achats
  • Fermer toutes les ventes
  • Fermer tous les achats et ventes
Les fonctions Take Profit, Stop Loss et Trailing sont déjà intégrées. La seule chose qui manque est la description des signaux pour ouvrir des positions.
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Dossiers :