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

 
Vladimir Pastushak:
Comment comprendre le type de compte de manière programmatique ? Couverture ou compensation ?
   if(m_account.MarginMode()!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Alert("Only Hedging!");
      return(INIT_FAILED);
     }
 

Ou comme ceci

Exemple d'information sur le compte

   m_label_info[3].Description(m_account.MarginModeDescription());

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

//+------------------------------------------------------------------+
//|                                        MarginModeDescription.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;     // account info wrapper
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   string Pr= m_account.MarginModeDescription();
   Alert(Pr);
  }
//+------------------------------------------------------------------+
 
Veuillez m'aider à trouver un EA (script) qui soit met une grille d'ordres virtuels en attente avec des paramètres spécifiés, soit ouvre des ordres (un par un) dans une direction spécifiée avec une prise spécifiée.
 

Veuillez me dire où se trouve l'erreur :

      for(int s=OrdersTotal()-1; s>=0; s--)          
         {
           if(o_orderInfo.SelectByIndex(s)) 
           if(o_orderInfo.OrderType()==ORDER_TYPE_SELL_STOP)
             {                 
               count_sell_stop++;
             }
         }  

      for(int s1=PositionsTotal()-1; s1>=0; s1--)          
         {
           if(o_orderInfo.SelectByIndex(s1)) 
           if(o_orderInfo.OrderType()==ORDER_TYPE_SELL)
             {                 
               count_sell++;
             }
         }  
         
      if(count_sell == 0 && count_sell_stop == 0)
         {
            sellstop_req3.action       = TRADE_ACTION_PENDING;
            sellstop_req3.symbol       = _Symbol;
            sellstop_req3.volume       = NormalizeDouble(lot_v, 2);
            sellstop_req3.price        = SymbolInfoDouble(sellstop_req3.symbol, SYMBOL_ASK) - 100*_Point;
            sellstop_req3.sl           = sellstop_req3.price + 110*_Point;
            sellstop_req3.type         = ORDER_TYPE_SELL_STOP;
            sellstop_req3.type_filling = ORDER_FILLING_RETURN;
            sellstop_req3.expiration   = ORDER_TIME_GTC;
            
            OrderSend(sellstop_req3, sellstop_res3);
         }
SELL_STOP - les ordres sont calculés, mais SELL ne le veut pas. Selon l'algorithme, s'il n'y en a aucun, l'ordre SELL_STOP est placé, et s'il y en a au moins un, l'ordre n'est pas placé.
 
Fergert Фергерт:

Veuillez me dire où se trouve l'erreur :

SELL_STOP - les ordres sont comptés, mais SELL ne veut pas. Selon l'algorithme, s'il n'y en a pas, l'ordre SELL_STOP est placé, et si au moins l'un d'entre eux est présent, aucun ordre n'est placé.

Ne confondez pas l'ORDRE LOCAL avec la POSITION.

//+------------------------------------------------------------------+
//|                                                     Script 1.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
//---
CPositionInfo  m_position;                   // object of CPositionInfo class
COrderInfo     m_order;                      // object of COrderInfo class
//---
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count_buys          = 0.0;
   int count_sells         = 0.0;
   int count_buy_limits    = 0.0;
   int count_sell_limits   = 0.0;
   int count_buy_stops     = 0.0;
   int count_sell_stops    = 0.0;
//---
   for(int i=PositionsTotal()-1; i>=0; i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
            count_buys++;
         else
            if(m_position.PositionType()==POSITION_TYPE_SELL)
               count_sells++;
        }
//---
   for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of current orders
      if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties
        {
         if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT)
            count_buy_limits++;
         else
            if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)
               count_sell_limits++;
            else
               if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)
                  count_buy_stops++;
               else
                  if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)
                     count_sell_stops++;
        }
//--- you code
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Dossiers :
Script_1.mq5  5 kb
 
Vladimir Karputov:

Ne confondez pas l'ORDRE à distance avec la POSITION.

MERCI)) Je l'ai...
 
Je ne comprends pas à quoi sert le paramètre begin dans la deuxième variante de la fonction onCalculate.
Chaque fois que la fonction onCalculate est appelée, elle est égale à 0.
Je sortais la valeur de begin via la fonction print.
Le livre de référence indique que le début est "le point de départ des données significatives". Ça ne me dit rien du tout.
 
MisterRight:
Je ne comprends pas à quoi sert le paramètre begin dans la deuxième variante de la fonction onCalculate.
Chaque fois que la fonction onCalculate est appelée, elle est égale à 0.
J'ai fait la sortie de la valeur de départ via la fonction print.
Le livre de référence indique que le début est "le point de départ des données significatives". Ça ne me dit rien du tout.

Consultez les codes de l'indicateur ouvert de l'exemple.

 
Mikhail Mishanin:

Regardez les codes de l'indicateur ouvert de l'exemple.

J'ai regardé. Toujours commencer = 0.

Ici, j'ai tiré un morceau de code de l'indicateur AMA

si(begin!=0)

PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodAMA+begin) ;


Et que devrait me dire ce code si la condition begin!=0 n'est jamais vraie ?

 
Pouvez-vous me dire ce qu'il faut utiliser pour compter les ordres fermés dans l'historique. J'ai essayé comme suit :

HistorySelect(0,TimeCurrent());

Alert("Количество ордеров в истории:  ",HistoryOrdersTotal());
Cela donne des bêtises à la fin, beaucoup plus que des ordres fermés.
Raison: