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

 
MakarFX:

Versuchen Sie es (ich habe es nicht getestet)

Merci, je vérifierai plus tard.

 
Eugen8519:



Veuillez m'aider à positionner la fonction correctement

...

Mais comment et où insérer

Pour envoyer un message lorsqu'un stop loss ou untake profit est atteint ?


MakarFX:

Est-ce qu'on parle de la même chose ?

J'ai trouvé un exemple qui suit la sortie du SL avecOnTradeTransaction: https://www.mql5.com/ru/code/21147.

Candle shadows v1
Candle shadows v1
  • www.mql5.com
Анализ размера свечи и тени свечи. В OnTradeTransaction отлавливаем открытие (DEAL_ENTRY_IN) и закрытие позиций (DEAL_ENTRY_OUT), а также закрытие по Stop loss (DEAL_REASON_SL).
 

Le même EA sur deux instruments différents

Bonjour ! Pourriez-vous m'aider ?

J'ai un EA qui fonctionne sur le graphique sur lequel il a été glissé (la valeur Symbol() est prise comme le nom du symbole).

Mais cette EA a également une variable ticket_exist qui contient un ticket d'un ordre placé et l'EA comprend que si la variable ticket_exist n'est pas égale à zéro, l'ordre est placé ici.

Question : Si j'ouvre un tel EA sur deux instruments différents et que la variable ticket_exist n'est pas égale à zéro sur un instrument, la variable portant le même nom restera-t-elle égale à zéro sur l'autre instrument ?

SU.

 
Mihail Nefedov:

Le même EA sur deux instruments différents

Bonjour ! Pourriez-vous m'aider ?

J'ai un EA qui fonctionne sur le graphique sur lequel il a été glissé (la valeur Symbol() est prise comme le nom du symbole).

Mais cet EA a aussi une variable ticket_exist qui contient un ticket de l'ordre fixé et l'EA comprend que si le ticket_exist n'est pas égal à zéro, l'ordre est fixé ici.

Question : Si j'ouvre un tel EA sur deux instruments différents et que la variable ticket_exist n'est pas égale à zéro sur un instrument, la variable portant le même nom restera-t-elle égale à zéro sur l'autre instrument ?

SU.

La valeur de la variable dans un EA n'est pas disponible pour un autre EA. L'essentiel est que soit les symboles, soit les magies, soit les deux sont différents.

 

Pouvez-vous me dire quelle heure il est, en ticks ? Heure du serveur ou UTC ?

Je me souviens avoir lu quelque part, mais je ne me souviens plus où...

 
Alexey Viktorov:

La valeur d'une variable dans un EA n'est pas disponible pour un autre EA. L'essentiel est que soit les symboles, soit les magies, soit les deux soient différents.

Si j'ai bien compris, pour qu'un conflit d'EA (deux absolument identiques) fonctionne avec des symboles différents, leurs variables devraient être définies comme globales (pour tout le terminal) ou, par exemple, un ordre devrait être accessible par son numéro de séquence ou simplement par le fait de son existence ?

 
MakarFX:

Essayez ceci (je ne l'ai pas testé)

Ça ne marche pas, ça donne des erreurs de compilation.


J'ai essayé de cette façon et il compile sans aucun problème mais je ne peux pas le tester avec la patinoire fermée.

Je reprends le travail demain.

  void OnTradeTransaction(const MqlTradeTransaction &trans,
                          const MqlTradeRequest &request,
                          const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      long     deal_reason       =-1;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
         deal_reason=HistoryDealGetInteger(trans.deal,DEAL_REASON);
        }
      else
         return;

      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_OUT)
           {
            if(deal_reason==DEAL_REASON_SL)
               SendNotification ("Закрыл  позицию > StopLoss");

            if(deal_reason==DEAL_REASON_TP)
               SendNotification ("Закрыл  позицию > TakeProfit");
           }
       }
  }
Dossiers :
x4.PNG  11 kb
 
Eugen8519:

cela ne fonctionne pas, cela donne des erreurs de compilation


J'ai essayé de cette façon, il compile sans aucun problème, mais lorsque la patinoire est fermée, je ne peux pas le tester.

Je le finirai demain.

vous n'avez pas mis le code correctement !

Je l'ai arrangé un peu et ça marche.

  datetime lastclouse; 
//+------------------------------------------------------------------+
int OnInit()
  {
   lastclouse=TimeCurrent();
   .....
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   if(LastClouseProfit()!=EMPTY_VALUE)
     {
      SendNotification (LastClouseProfit()); lastclouse=TimeCurrent();
     }
   .....   
  }
//+------------------------------------------------------------------+
double LastClouseProfit()
  {
   ulong ticket=0;
   double profit=EMPTY_VALUE;
   HistorySelect(lastclouse,TimeCurrent());
   uint total=HistoryDealsTotal(); 
   for(uint i=0;i<total;i++) 
     { 
      if((ticket=HistoryDealGetTicket(i))>0) 
        { 
         profit+=HistoryDealGetDouble(ticket,DEAL_PROFIT); 
        }
     } 
   return(profit);
  }
//+------------------------------------------------------------------+
 
MakarFX:

vous n'avez pas mis le code correctement !

Je l'ai corrigé un peu, il fonctionne (je l'ai vérifié).

Ici, nous devons retracer le fait que la transaction a été conclue exactement à SL ou TP. Et en utilisantOnTradeTransaction, nous obtenons des données prêtes à l'emploi juste après la conclusion de la transaction.

double LastClouseProfit()
  {
   ulong ticket=0;
   double profit=EMPTY_VALUE;
   HistorySelect(lastclouse,TimeCurrent());
   uint total=HistoryDealsTotal(); 
   for(uint i=0;i<total;i++) 
     { 
      if((ticket=HistoryDealGetTicket(i))>0) 
        { 
         profit=HistoryDealGetDouble(ticket,DEAL_PROFIT); 
        }
     } 
   return(profit);
  }

S'il y a plus d'une transaction fermée à TimeCurrent, quel résultat doit être renvoyé ? Et la présence d'un profit ne signifie pas que la transaction a été fermée par le SL ou le TP. Cela doit être suivi, comme je l'ai déjà dit. Ainsi, l'utilisation deOnTradeTransaction est la solution la plus simple !

 
Mihail Matkovskij:

Ici, nous devons également vérifier que la transaction a été clôturée exactement sur le SL ou le TP.

J'ai compris qu'il s'agissait d'une notification de la conclusion d'un marché, peut-être que je me suis trompé...

Mihail Matkovskij:

Si plus d'une transaction est fermée à TimeCurrent, quel résultat dois-je obtenir ?

je ne sais pas, je dois vérifier

Raison: