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

 
Salutations. La question est plutôt d'ordre logique.
Le système dit anti-martingale, avec une limite au nombre d'augmentations. Si vous clôturez sur un bénéfice, le lot suivant est augmenté d'un facteur. S'il y a une perte, ou si le nombre de positions rentables dans une rangée dépasse le nombre spécifié, le lot est égal au lot de départ.
Une fois que le nombre spécifié de positions rentables est dépassé, comment puis-je recommencer le cycle d'augmentation ?
int K_U_=5;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);//лот последней закрытой позиции
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }


/

 
lil_lil:
Salutations. La question est plutôt d'ordre logique.
Le système dit anti-martingale, avec une limite au nombre d'augmentations. Si vous clôturez sur un bénéfice, le lot suivant est augmenté d'un facteur. S'il y a une perte, ou si le nombre de positions rentables dans une rangée dépasse le nombre spécifié, le lot est égal au lot de départ.
Une fois que le nombre spécifié de positions rentables est dépassé, comment puis-je recommencer le cycle d'augmentation ?


/

Exemple dans le codeStop Loss Take Profit: la taille du lot est stockée (écrasée, augmentée et remise au minimum) dans la variable "ExtLot", déclarée au niveau global du programme (dans l'en-tête). OnTradeTransaction() détecte les transactions de type "Market Exit" et vérifie comment la transaction a été clôturée - au niveau du Take Profit ou du Stop Loss :

         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               ExtLot*=2.0;
            else if(deal_reason==DEAL_REASON_TP)
               ExtLot=m_symbol.LotsMin();
           }

Si au Stop Loss, nous doublons le lot, si au Take Profit, nous réinitialisons la taille du lot à sa valeur minimale.


Note : dans l'Expert Advisor lui-même, le calcul du Stop Loss et du Take Profit est un peu incorrect - mais le code sera republié prochainement.

 
Vladimir Karputov:

Exemple dans le codeStop Loss Take Profit: la taille du lot est stockée (écrasée, augmentée et remise au minimum) dans la variable "ExtLot" déclarée au niveau global du programme (dans l'en-tête). OnTradeTransaction() détecte les transactions de type "Market Exit" et vérifie comment la transaction a été clôturée - au niveau du Take Profit ou du Stop Loss :

Si au Stop Loss, nous doublons le lot, si au Take Profit, nous réinitialisons la taille du lot à sa valeur minimale.


Note : dans le conseiller expert est légèrement incorrect calcul de Stop Loss et Take Profit - mais bientôt republié code.

Je calcule le nombre de trades rentables qui se suivent, s'il dépasse 5, alors je reviens au lot initial, la position 6 s'ouvre avec le lot initial et la position 7 devrait s'ouvrir avec le volume = lot 6 multiplié par le coefficient, etc. Lorsqu'il y a 5 autres positions rentables, revenez au lot initial.

Les positions rentables sont au nombre de 20 à la suite. Leurs lots devraient être 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16.


 
lil_lil:

Je compte le nombre de trades rentables à la suite, s'il dépasse 5, alors je reviens au lot initial, la position 6 s'ouvre avec le lot initial et la position 7 devrait s'ouvrir avec le volume = lot 6 multiplié par le coefficient, etc. Lorsqu'il y a 5 autres positions rentables, revenez au lot initial.

Les positions rentables sont au nombre de 20 à la suite. Leurs lots devraient être 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16.


Vous devez utiliser une variable statique dans la fonction de comptage des lots. Voici comment cela fonctionne :

//+------------------------------------------------------------------+
//|                                                       Test_1.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   static int counter=0;
   for(int i=0;i<18;i++)
     {
      Print(counter);
      counter++;
      if(counter==5)
         counter=0;
     }
  }
//+------------------------------------------------------------------+

Résultat :

0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
0
1
2
Dossiers :
Test_1.mq5  2 kb
 
Vladimir Karputov:

Vous devez utiliser une variable statique dans la fonction de comptage des lots. Voici comment cela fonctionne :

Résultat :

Je réinitialise selon votre exemple, mais je n'arrive pas à obtenir l'ordre d'augmentation du lot

Il y a 20 positions rentables, à la suite. Leurs lots devraient être 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 mais cela devrait être1, 2, 4, 8,16, 1, 1, 1, 1, 1, 1, .............

Qu'est-ce qui ne va pas ?

int K_U_=5;  double   Lots=1.0;
double  LotExponent=2.00;
//+------------------------------------------------------------------+
double llot()
  {
   double lt1=LotLastCloPos(Symbol(),m_magic);
   if(CountProfit(Symbol(),m_magic)>=1 && CountProfit(Symbol(),m_magic)<K_U_)
      LotSize=lt1*LotExponent;//
   else
      LotSize=Lots;
   return(LotSize);
  }
  
//+------------------------------------------------------------------

int CountProfit(const string Symb,const long MagicNumber=0)
  {
    int counter=0;
   ulong Ticket;

   if(HistorySelect(0,LONG_MAX))
      for(int i=HistoryDealsTotal()-1; i>=0; i--){
      
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {
            if(HistoryDealGetDouble(Ticket,DEAL_PROFIT)>0)
            counter++; else
               break;
           }
           }
   if(counter==K_U_)
      counter=0;
   return(counter);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LotLastCloPos(const string Symb,const long MagicNumber=0)
  {
   ulong Ticket;
   double lot_=0;

   if(HistorySelect(0,LONG_MAX))
      for(int i=0; i<HistoryDealsTotal(); i++)
         if((bool)(Ticket=HistoryDealGetTicket(i)) && 
            (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT) &&
            (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MagicNumber) &&
            (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb))
           {

            lot_=HistoryOrderGetDouble(Ticket,ORDER_VOLUME_INITIAL);

           }

   return(lot_);
  }
 
lil_lil:

Je mets à zéro selon votre exemple, mais je n'obtiens pas l'ordre d'augmentation du lot.

Il y a 20 positions rentables, à la suite. Leurs lots devraient être 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16, 1, 2, 4, 8,16 et il s'avère donc1, 2, 4, 8,16, 1, 1, 1, 1, 1, 1 ............

Qu'est-ce qu'il y a ?

Vous ne voulez donc toujours pas utiliser OnTradeTransaction de manière normale ? Vous préférez donc demander EXACTEMENT l'historique complet des transactions (depuis 1970) ? Pourquoi ?

 
Vladimir Karputov:

Vous ne voulez donc pas travailler correctement avec OnTradeTransaction? Vous préférez donc demander ABSOLUMENT TOUT l'historique des transactions (depuis 1970) ? Pourquoi ?

J'ai trouvé une raison, des parenthèses.

Que voulez-vous dire par je ne veux pas, qu'est-ce queOnTradeTransaction a à voiravec ma question ;)

 

Maintenant, je vois, deux posts avant ma question, un exemple de calcul.

Merci.

 
lil_lil:

J'ai trouvé la raison, entre parenthèses.

Que voulez-vous dire par je ne veux pas, qu'est-ce queOnTradeTransaction a à voiravec ma question ;)

Je demande juste l'historique des transactions

HistorySelect(0,LONG_MAX)

signifie demander tout, tout, tout l'historique de ce compte de trading depuis 1970. C'est très sous-optimal :

  • que faire s'il y a des milliers de transactions sur ce compte ?
  • Et si (Dieu nous en préserve) vous faites cette demande à chaque tique ?

 

Veuillez partager les fonctions qui fonctionnent avec l'historique des transactions.

J'ai besoin d'obtenir des informations sur la date de la dernière transaction : ouverture, clôture, volume, résultat financier et son type (achat ou vente).

Si vous avez des fonctions similaires, veuillez les partager.

Raison: