Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 938

 
Seric29:

Je veux créer un tableau unidimensionnel où les éléments 0 à 4 stockeront le double, 5 à 9 stockeront le nom de la donnée, 10 à 14 stockeront l'int. Est-il possible de l'organiser dans mql4 ? Si oui, pouvez-vous me montrer comment, j'ai vu un exemple avec des structures en C++, mais j'ai perdu le lien vers le site ?

Si vous avez des cellules de tableau spécifiques allouées pour chaque type, faites une structure au lieu d'un tableau.

 
Koldun Zloy:

Si vous avez des cellules de tableau spécifiques allouées pour chaque type, alors faites une structure au lieu d'un tableau.

Malheureusement, il ne peut même pas formaliser la tâche

D'un côté, on dirait qu'il veut s'éloigner du typage strict en C++ / MQL, voici un bon fil de discussion, bien que je doute que cela l'aidehttps://www.mql5.com/ru/forum/294094.

Au cours de cette discussion (je crois qu'elle dure depuis 3 mois déjà ?), il s'avère que@Seric29 a besoin de s'éloigner de la description des signatures de fonctions et d'obtenir unefonction "fantôme" qui accepte un nombre arbitraire de paramètres

Il s'avère ensuite, au cours de la discussion, que des tableaux dynamiques multidimensionnels doivent être impliqués dans tout cela, et que ces tableaux doivent être transmis à la fonction en tant que paramètres.

C'est-à-dire qu'il s'agit d'une tâche non formalisée, dont la solution se termine constamment par des "cris du terrain", les développeurs ont réduit la fonctionnalité de quelque chose et me donnent le code source des opérateurs de boucle, je vais les refaire, puis le dernier :

Seric29:
Comment écrire une lettre aux développeurs de mql4 comment voir le code du compilateur, y a-t-il un moyen d'y ajouter plus de fonctionnalités pour qu'il ne soit pas si statique ?

... c'est à peu près tout... la phrase "époustouflant" est le moins que l'on puisse dire ))))

 

C'est pourquoi je ne donne pas de détails.

Il est indispensable d'apprendre les bases.

 
Koldun Zloy:

Il est indispensable d'apprendre les bases.

Il est intéressant qu'un homme n'apprenne pas les bases, mais essaie de montrer qu'il sait déjà tout, et vous êtes tous des méta-citations l'empêchant de faire son travail).

 
Taras Slobodyanik:

il est intéressant de constater que l'homme n'apprend pas les bases, mais essaie de montrer qu'il sait déjà tout, et que vous êtes tous des méta-citations l'empêchant de faire son travail)

Salutations. J'ai regardé la vidéo Expert Advisor "From MQL4 to MQL5 - How to Rewrite an EA 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.
3. j'ai mis dtriger = 0 dans les multiplugs - tous ceux qui sont 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 ouverte ?
La question est la suivante : comment enregistrer correctement la fermeture d'une position existante à l'ouverture d'une flèche (retournement) ?
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 ;

entrée int triger = 0 ;
entrée double StartLot = 0,01 ;
entrée double lpos_volume = 1.0 ;
entrée int Step = 10 ;
input int MagicNumber = 12345 ; // nuaber magique
input int Slippage = 30 ; // glissade

int dtriger ;
int dStep ;

//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
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) ;
}
sinon si (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC) ;
}
sinon
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN) ;
}
o_trade.SetDeviationInPoints(Slippage) ;

if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}

return(INIT_SUCCEEDED) ;
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation des experts|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| fonction tick expert|
//+------------------------------------------------------------------+
void OnTick()
{
datetimelpos_time = 0 ;
double lpos_price_open = 0.0 ;
ENUM_POSITION_TYPE lpos_type = -1 ;
intpos_count = 0 ;
double sum_profit = 0 ;

for (int i = PositionsTotal() - 1 ; i>=0 ; i--)
{
si (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
si (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() ;
}
}
}

// Comptez le nombre d'ordres en attente
int stop_count=0 ;

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

si (!RefreshRates())
retour ;

si(dtriger == 0 )
{
CloseAll() ;
retour ;
}

// + ----- Ouvrir la première commande ++++++++++
si (pos_count == 0 && stop_count == 0 )
{
si ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()) ; // S E L L 11111
}

si ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()) ; // B U Y 11111
}
}


// + ----- Inverse ++++++++++++++++++++++++++++

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

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


si(pos_count>0 && stop_count>0)
DeleteStopOrders() ;

}
//-----------------------------------------------------------
bool RefreshRates()
{
si (!o_symbol.RefreshRates())
return(false) ;

si (o_symbole.Ask() == 0 || o_symbole.Bid() == 0)
retour (faux) ;

retour (vrai) ;
}
//--- ---------------------------------------------------------
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())
}
}
}
}

//-----------------------------------------------------------
// Supprimer tous les ordres en attente
//-------------------------------------
void DeleteStopOrders()
{
for (int i = OrdersTotal() - 1 ; i >= 0 ; i-- )
{
si (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket())
}
}

//+------------------------------------------------------------------+

 
procom:

Salutations....

Veuillez insérer le code correctement :


 
Artyom Trishkin:

Veuillez insérer le code correctement :


ok
#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());
   }
 } 
 
//+------------------------------------------------------------------+
Dossiers :
Stend_t1.mq5  12 kb
 
Igor Makanu:

commencez à lire au moins un livre sur le C++, vos questions sont une explosion, vous écrivez des termes techniques, à première vue il semble que vous posiez une question spécifique, mais en fait vous opérez juste en termes sans comprendre l'essence .... qu'est-ce que la macro va retourner ? où va-t-elle retourner ? dans le corps de la macro une fonction rechargeable.... Je ne peux même pas commencer à expliquer à quoi ressemble votre question.

Pour comprendre ce qu'est une macro, épellez le terme correctement, macroSETTING , peut-être cela sera-t-il plus facile pour vous de comprendre ce qu'il en est.

Dans mql4 les fonctionnalités et le C++ sont réduits, en d'autres termes, c'est un langage trop statique. Je peux dire que mon idée a échoué, j'ai écrit une simple surcharge sans classes, j'ai ajouté des arguments et leur ai donné 0, j'ai essayé de l'appeler dans une macro, j'ai eu une erreur comme quoi il y a 3 fonctions, donc il s'avère que je dois encore décrire laquelle appeler et comment, et je ne dis pas quel genre de pierres d'achoppement je vais devoir gérer plus tard. C'est probablement mieux de ne rien faire, comme ça tu ne feras pas d'erreur.

 
Seric29:

mql4 a des fonctionnalités réduites et du C++, autrement dit un langage trop statique.

Qu'est-ce qui a été coupé, exactement ?

En d'autres termes, vous n'avez pas à le faire, surtout que même Google ne connaît pas leterme " langagetrop statique". Le C++ est un langage à typage statique et y réfléchir n'a aucun sens - c'est comme ça.

Seric29:

C'est probablement mieux de ne rien faire, comme ça tu ne feras pas d'erreur.

Je serai bref RTFM ( lurkmore )

 

La question est purement d'ordre esthétique.

Comment faire pour qu'il y ait une image propre ici ? MT4



Raison: