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

 
teetrinker:

Myexpert.Time(10) doit-il retourner l'heure de la dixième barre du graphique ? Et comment l'écrire correctement ?

Merci.

En théorie, oui, ça devrait...

La méthode Time , selon la documentation, obtient la valeur de l'élément Time par l'indice spécifié. C'est une méthode de la classe CExpertBase, qui est une classe de base pour CExpert et toutes les classes auxiliaires des stratégies de trading.

Cher sergeev vous dit correctement... il est préférable d'utiliser Debugger pour déterminer le rôle de la méthode Time() dans la vie de votre EA...

 

Merci, Yedelkin ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Et EnumToString(timeframe), fonction cool ! !! ET JE SUIS BARAN !!!!!!

 
Dites-moi s'il vous plaît, voici une fonction
 bool  PositionModify( ulong  PositionTicket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
      {  MqlTradeRequest request  = {0};
         MqlTradeResult result = {0};
        request.action= TRADE_ACTION_SLTP; 
        request.order= PositionTicket; 
        request.price= price;
        request.symbol= Symbol();
        request.sl= stoploss;
        request.tp= takeprofit;
        return (OrderSend( request,   result    ));   
      }

La fonction semble avoir un ,,côté,,- request.symbol= Symbol() ; Pourquoi Symbol() ? C'est là que le symbole pour lequel nous avons fixé TP et SL doit être transféré. Alors, pouvons-nous simplement supprimer la chaîne request.symbol= Symbol() ;, comme si elle était stupide nada ?

 

Veuillez me conseiller sur la manière de définir un ordre de reconduction au niveau du stop de l'ordre principal ouvert, puis de le supprimer si l'ordre principal est clôturé au niveau du TP ?

J'ai placé les deux ordres dans le code en même temps :

        
 // основной ордер +++++++++++++++++++++++++++++++++++++++      
        {
         request.action = TRADE_ACTION_PENDING;
         request.magic=magic_number;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = NormalizeDouble(volume()/1,2);
         request.price=NormalizeDouble(Ask+StopLevel*_Point,_Digits);
         request.sl = NormalizeDouble(request.price - SL*_Point,_Digits);
         request.tp = NormalizeDouble(request.price + TP*_Point,_Digits);
         request.deviation=0;
         request.type=ORDER_TYPE_BUY_STOP;
         request.type_filling=ORDER_FILLING_FOK;
         
           {
            OrderSend(request,result);
            if(result.retcode==10009 || result.retcode==10008)
               Print("Установлен ордер BuyStop");
            else
              {
               Print(ResultRetcodeDescription(result.retcode));
                           
              }
           }      
 // переворотный ордер +++++++++++++++++++++++++++++++++++++++
        
         request.action = TRADE_ACTION_PENDING;
         request.magic=magic_number1;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = NormalizeDouble(volume()/2,2);
         request.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits);
         request.sl = NormalizeDouble(request.price + SL*_Point,_Digits);
         request.tp = NormalizeDouble(request.price - (TP-900)*_Point,_Digits);
         request.deviation=0;
         request.type=ORDER_TYPE_SELL_STOP;
         request.type_filling=ORDER_FILLING_FOK;
         
           {
            OrderSend(request,result);
            if(result.retcode==10009 || result.retcode==10008)
               Print("Установлен ордер SellStop");
            else
              {
               Print(ResultRetcodeDescription(result.retcode));
               return;
              }
           }        
       } } 
}

L'ordre principal s'ouvre et se ferme au niveau du TP, et l'ordre de renversement est suspendu. Si l'ordre principal a été clôturé au niveau du stop, il n'y aurait pas de problème ;)). Quelle est la meilleure fonction à fermer ?

Dois-je passer par les commandes en cours et les supprimer de cette façon ?

      {
         request.action = TRADE_ACTION_REMOVE;
         request.magic=magic_number1;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = 0;
         request.price=0;
         request.sl = 0;
         request.tp =0;
         request.deviation=0;
         request.type=0;
         request.type_filling=0;
         
           {
            OrderSend(request,result);
Ou existe-t-il un moyen plus simple ?


	          
 
Crucian: L'ordre principal s'ouvre et se ferme au TP et l'ordre de reconduction se bloque. Si l'ordre principal avait été clôturé au moment du stop, il n'y aurait pas eu de problème ;). Quelle fonction serait la plus appropriée pour le fermer ? Devrais-je passer par les ordres en attente et les supprimer de cette façon ? Ou existe-t-il un moyen plus simple ?

La question se résume donc à savoir comment supprimer un ordre en attente qui n'est pas un ordre SL ou TP lorsque certains événements se produisent (en particulier, lorsqu'un ordre TP se déclenche sur une position ouverte).

Actuellement, un tel ordre en attente ne peut être supprimé obligatoirement qu'en envoyant la demande "Supprimer l'ordre en attente" correspondante. Nous devons donc surveiller du côté du terminal l'occurrence de certains événements et envoyer une requête. Mais contrairement à votre variante, il n'y a que deux champs à spécifier dans la requête, dont l'un est request.l'ordre.

Dans la situation que vous mentionnez, les ordres OCO ("One Cansels Other(s)") seraient utiles : au niveau TP, un ordre serait placé avec un volume égal à la position ouverte, au niveau SL, un ordre avec le volume nécessaire pour "inverser" la position serait placé. Si l'un de ces ordres OCO se déclenchait, le second serait automatiquement supprimé du côté du serveur. Cependant, tout au long de la vie de ce forum, les développeurs de la plateforme ont été inflexibles sur le fait qu'ils n'introduiraient pas de types d'ordres supplémentaires, y compris les ordres OCO.

 
Yedelkin:

Cependant, depuis que ce forum existe, les développeurs de la plateforme n'ont catégoriquement pas accepté d'introduire des types d'ordres supplémentaires, y compris les ordres OCO.

Et pourquoi les introduire lorsque cela peut être mis en œuvre de manière programmatique ?
 
A100: Pourquoi les saisir quand on peut le faire par programme ?
Essayez de taper le mot "OCO" en latin et en cyrillique dans un forum de recherche et lisez-le.
 
Yedelkin:
Essayez de taper le mot "OCO" en latin et en cyrillique dans un forum de recherche et lisez-le.
OCO n'est pas un mandat autonome et il n'est pas nécessaire de le saisir
 
A100: La DPA n'est pas un mandat autonome et il n'y a pas lieu de l'introduire
Je vois. Donc vous n'avez rien lu. Mais vous êtes prêt à partager votre opinion. OK, votre avis est accepté : vous n'avez pas besoin de ce type de commande.
 
Yedelkin:
Vous n'avez pas besoin de ce type de commande.
Certaines plateformes ont la possibilité de lier 1 (parfois 2) ordres CCA. Dans MT4/5, j'implémente par programme une chaîne d'ordres liés (parfois assez complexe) et je trouve cette option plus pratique.
Raison: