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

 
Sergey Likho:

Pouvez-vous me dire comment calculer la garantie d'une transaction ?


J'ai essayé deux approches

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


Et celui-ci

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



Le premier donne des résultats étranges sur l'EURJPY si ma devise de dépôt est l' USD. Dois-je ajouter quelque chose à la formule ?

La seconde ne fonctionne également qu'une seule fois, parfois elle donne la bonne valeur, parfois elle donne un non-sens (cela dépend du dépôt).

Pour être plus précis, la variable val indique la valeur des fonds gratuits après que la commande ait été passée et la variableFreeMarginCheck indique la valeur du dépôt lui-même.

 
Igor Makanu:

La deuxième option est la manière correcte de calculer la marge, ou plutôt vous obtenez la valeur des fonds libres dans la variable val après avoir passé un ordre, et la variableFreeMarginCheck est la valeur de la marge elle-même.

Vous êtes sûr ?

Contrôle de la marge libre du compte

Renvoie le montant des fonds libres qui resteront après l' ouverture de l'ordre spécifié au prix actuel dans le compte courant.


Il y a aussi une subtilité :

Si des contre-opérations sont ouvertes, c'est-à-dire s'il existe un verrouillage complet ou incomplet du compte, la fonction peut donner des valeurs incorrectes.


 
Sergey Likho:

Vous êtes sûr ?

Oui, vous avez raison, c'est exactement ça :

Renvoie le montant des fonds libresrestant après l'ouverture de l'ordre spécifié au prix actuel dans le compte courant.

en ce qui concerne les transactions ouvertes, vous devez vérifier, je ne me souviens pas, mais très probablement ce que le terminal écrit, devrait correspondre aux données calculées : le nombre total de lots dans chaque sens des transactions (BAY/SELL) pour tous les symboles puis appeler pour chaque symbole

AccountFreeMarginCheck() en passant des lots dans chaque sens et en additionnant ces résultats

le marché fonctionne aujourd'hui, il n'est pas difficile de le vérifier, c'est comme ça

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

Salutations, pourriez-vous me dire ce qui ne va pas avec la fonction ? La fonction effectue une pause commerciale par temps, les paramètres sont le début de la pause et la fin de la pause.
La fonction lit l'heure non pas à partir du serveur du courtier, mais à partir de l'ordinateur, malgré le fait que TimeCurrent soit prescrit. En général, les transactions sont fermées pendant la pause, c'est-à-dire que la fonction ne fonctionne pas.

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

Salutations, pourriez-vous me dire ce qui ne va pas avec la fonction ? La fonction effectue une pause commerciale par temps, les paramètres comprennent le début de la pause et la fin de la pause.
La fonction lit l'heure non pas à partir du serveur du courtier, mais à partir de l'ordinateur, malgré le fait que TimeCurrent soit prescrit. En général, les transactions sont fermées pendant une pause, cela signifie que la fonction ne fonctionne pas.

DésimprimerTimeStart etStrToTime(TimeStart) ;

then unprintTimeCurrent()

votreTimeStart n'est pas au format de date complet, c'est-à-dire que l'heure sera toujours le jour, le mois et l'année en cours lorsque vous exécuterez l'EA, puis elle changera ?

Et globalement ... pour déterminer les heures et les minutes de trading, il faut comparer l' heure et la minute de l' heure du serveur, vous ne comparez que le fait que l'heure du serveur est plus longue que celle spécifiée

SZZ : pour éviter toute confusion, vous pouvezconsidérer la date comme un int, ce qu'elle est, et en comparant deuxdates, vous comparez deux int.

PSPS :

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

votre code va probablement fonctionner, vous devriez l'essayer de cette façon :

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


Je compte habituellement le temps de cette façon :

int h = TimeHour(TimeCurrent()) ;

int m = TimeMinute(TimeCurrent()) ;

et ensuite le comparer avec les paramètres de l'EA

 
Igor Makanu:

Merci, je vais essayer de comprendre, je suis juste un débutant), avec l'option && au lieu de || je n'ai pas encore essayé en ligne, d'ailleurs dans le testeur ce code fonctionne, il lit le temps à partir du terminal, pas de fermeture des ordres pendant la pause, mais en ligne c'est différent.

 

Bonjour, le terminal ne démarre pas dans le testeur de stratégie. Je règle la date, par exemple (2017,04,01 à 2018,05,29), j'appuie sur start, il donne immédiatement un stop. Dans le journal, il est indiqué ce qui suit,

TestGenerator : pas de données historiques 'EURUSD30' de 2017.04.01 à 2018.05.29. Et ainsi de suite pour tous les segments. Mon ordinateur fonctionne, je pensais qu'il n'avait peut-être pas assez de RAM. Même chose sur l'ordinateur personnel, le redémarrage n'aide pas, mais il fonctionne pendant un moment. J'ai téléchargé Expert Advisor sur le marché, à l'essai. Si quelqu'un en connaît la raison, veuillez nous en informer.


 
danil77783:

Bonjour, le terminal ne démarre pas dans le testeur de stratégie. Je règle la date, par exemple (2017,04,01 à 2018,05,29), j'appuie sur start, il donne immédiatement un stop. Dans le journal, il est indiqué ce qui suit,

TestGenerator : pas de données historiques 'EURUSD30' de 2017.04.01 à 2018.05.29. Et ainsi de suite pour tous les segments. Mon ordinateur fonctionne, je pensais qu'il n'avait peut-être pas assez de RAM. Même chose sur l'ordinateur personnel, le redémarrage n'aide pas, mais il fonctionne pendant un moment. J'ai téléchargé le Conseiller Expert depuis le Marché, essai. Si j'ai une idée de la raison, pouvez-vous me donner un indice ?


Je pense que le testeur dit qu'il n'y a pas de données historiques, appuyez sur F2 et téléchargez l'historique, puis redémarrez le terminal.

 
danil77783:

Bonjour, le terminal ne démarre pas dans le testeur de stratégie. Je règle la date, par exemple (2017,04,01 à 2018,05,29), j'appuie sur start, il donne immédiatement un stop. Dans le journal, il est indiqué ce qui suit,

TestGenerator : pas de données historiques 'EURUSD30' de 2017.04.01 à 2018.05.29. Et ainsi de suite pour tous les segments. Mon ordinateur fonctionne, je pensais qu'il n'avait peut-être pas assez de RAM. Même chose sur l'ordinateur personnel, le redémarrage n'aide pas, mais il fonctionne pendant un moment. J'ai téléchargé le Conseiller Expert depuis le Marché, essai. Si je connais la raison, veuillez me conseiller.


L'absence de données historiques ne signifie-t-elle rien ?

 
Igor Makanu:

Je pense que le testeur vous dit qu'il n'y a pas de données historiques, appuyez sur F2 et téléchargez l'historique, puis rechargez le terminal.

Merci ! Je vais essayer. La mise à jour du terminal l'affecte-t-elle de quelque manière que ce soit ? Qu'il soit mis à jour ou non, bien qu'il vous le dise lui-même.......