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

 
Youri Lazurenko:


S'il n'y a pas de code complet, je ne pourrai pas vous aider. Veuillez joindre le code complet (en utilisant le bouton Joindre le fichier).

 
Si dans void OnTick(), ça ressemble à ça :
   if(currentTime >= OpenTrade && currentTime < CloseTrade)
   {
      if(SignalBuy1() || SignalBuy2())
      { 
         if(timeBarInside != iTime(NULL, 0, 1))
         {
            OpenOrderBuy();
            PositionModifiBuy();
            CandleColor(ColorCandleBuy);
            timeBarInside = iTime(NULL, 0, 1);
         }
      }
      
      if(SignalSell1() || SignalSell2()) 
      {
         if(timeBarInside != iTime(NULL, 0, 1))
         {
            OpenOrderSell();
            PositionModifiSell();
            CandleColor(ColorCandleSell);
            timeBarInside = iTime(NULL, 0, 1);
         }
      }  
   }
Que signifie le code complet ? L'ensemble de l'EA ? C'est assez lourd, et le reste des fonctions n'a rien à voir avec la modification. Je comprends que l'on peut définir immédiatement le SL et le TP lorsqu'une position est ouverte, mais je veux le faire de cette façon, je me demande déjà pourquoi cela ne fonctionne pas. Dans mql4, ça se fait comme deux doigts... et ici c'est une plaie.
 

Et retour au dessin de la ligne de tendance. Si vous avez besoin d'un code.

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
{
   ObjectDelete(0, name);  
      
   if(ObjectCreate(0, name, OBJ_TREND, 0, time1, price1, time2, price2))
   {
      ObjectSetInteger(0, name, OBJPROP_COLOR, clr); 
      ObjectSetInteger(0, name, OBJPROP_STYLE, TrendStyle); 
      ObjectSetInteger(0, name, OBJPROP_WIDTH, TrendWidth); 
      
      ChartRedraw(); 
      Sleep(10);
      
      return(true);
   }
   else 
   {
      Print("Ошибка в создании линии"); 
      return (false);
   }
}
Dossiers :
1.png  82 kb
2.png  36 kb
 
Youri Lazurenko:

Et retour au dessin de la ligne de tendance. Si vous avez besoin d'un code.

Lire la documentation ! !!

OBJ_TREND

Note

Le mode d'extension de la ligne de tendance vers la droite et/ou vers la gauche peut être spécifié (propriétés OBJPROP_RAY_RIGHT et OBJPROP_RAY_LEFT respectivement).

Par défaut, ces propriétés sont définies sur false.

Ma question est donc la suivante : pourquoi supprimer l'objet et le recréer ? N'est-il pas plus simple de ne créer que si un tel objet n'est pas présent sur le graphique ? Et même s'il est nécessaire de modifier les coordonnées de l'ancre, il n'est pas nécessaire de supprimer l'objet et de le créer à nouveau.

 
Youri Lazurenko:


Pour la troisième et dernière fois : veuillez joindre le code complet.

 
Alexey Viktorov:

Lisez la documentation ! !!

Ces propriétés sont définies à false par défaut.

Et question : pourquoi supprimer un objet et le recréer ? N'est-il pas plus simple de ne créer que si un tel objet n'est pas présent sur le graphique ? Et même s'il est nécessaire de modifier les coordonnées de l'ancrage, il n'est pas nécessaire de supprimer l'objet et de le recréer.

Merci, je vais regarder maintenant. Et merci pour ces précieux commentaires. Je ne suis pas un programmeur, juste pour moi, j'utilise souvent le travail de quelqu'un d'autre.

 
Vladimir Karputov:

S'il vous plaît, pour la troisième et dernière fois : joignez le code complet.

Le problème est déjà résolu. Je modifie via Tisket, pas Symbol. Je ne comprends pas ce que le code complet a à voir avec, par exemple, ce que la condition d'ouverture de position a à voir avec la modification ?

Et maintenant ça ressemble à ça, peut-être que quelqu'un en aura besoin.

void PositionModifiSell()
{
   int    i;
   ulong  ticket;
   double sl    = 0; 
   double tp    = 0;  
   int    total = PositionsTotal();
   
   for(i = total-1; i >= 0; i--)
   {
      if(m_position.SelectByIndex(i))                            
      {
         if(m_position.Symbol() == Symbol() && m_position.Magic() == Magic)
         {
            if(m_position.PositionType() == POSITION_TYPE_SELL)
            {               
               if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
               {
                  ticket = m_position.Ticket();
                  
                  sl = NormalizeDouble(iHigh(NULL, 0, ExtrimUp()) + VS*_Point, _Digits);
                   
                  if(PriceCurrentDw1() - PriceDwHigh() < LastPriceOpenOrder() - (sp+PW)*_Point)
                  {
                     tp = NormalizeDouble(PriceCurrentDw1() - PriceDwHigh(), _Digits);
                  }
                  else
                     tp = NormalizeDouble(bid - TP*_Point, _Digits);
                  }
                  
                  if(!m_trade.PositionModify(ticket, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:


Étudiez l'aide - quelle est la différence entre la sélection d'une position par ticket et par symbole. Cela vous sera utile pour ne pas faire d'erreurs :

PositionSelect

bool  PositionSelect(
   string  symbol     // имя инструмента
   );

Note

Avec la comptabilité des positions "netting" (ACCOUNT_MARGIN_MODE_RETAIL_NETTING etACCOUNT_MARGIN_MODE_EXCHANGE), une seuleposition peut être ouverte parsymbole à un moment donné, qui résulte d'une ou plusieurstransactions. Il ne faut pas confondre les positions et lesordres en attente actifs, qui sont également affichés dans l'onglet "Trade" du panneau "Toolbox".

Si les positions sont affichées indépendamment (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), plusieurs positions peuvent être ouvertes simultanément pour chaque symbole. Dans ce cas, PositionSelect sélectionnera la position avec le plus petit tick.

Документация по MQL5: Торговые функции / PositionSelect
Документация по MQL5: Торговые функции / PositionSelect
  • www.mql5.com
PositionSelect - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

Lisez la documentation ! !!

Ces propriétés sont définies à false par défaut.

Et question : pourquoi supprimer un objet et le recréer ? N'est-il pas plus simple de ne créer que si un tel objet n'est pas présent sur le graphique ? Et même s'il est nécessaire de modifier les coordonnées de l'ancrage, il n'est pas nécessaire de supprimer l'objet et de le recréer.

Merci encore, maintenant la ligne est comme une ligne, agréable à voir. Mais j'ai besoin deObjectDelete(0, name) ; sinon la ligne une fois dessinée n'est pas redessinée. Même chose dans mql4, j'ai juste oublié.

 
Youri Lazurenko:

Merci encore, maintenant la ligne est comme une ligne, agréable à voir. SeulObjectDelete(0, name); ; est nécessaire, sinon une fois dessinée la ligne n'est pas redessinée. La même chose dans mql4, j'ai juste oublié.

Quelle idée absurde. L'objet graphique dessiné se déplace en douceur. Un exemple est donné dans l'aide de chaque objet (pour la ligne horizontaleOBJ_HLINE).

Vous pouvez également modifier n'importe quelle propriété d'un objet déjà dessiné : couleur, style, odeur...
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_HLINE
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_HLINE
  • www.mql5.com
OBJ_HLINE - Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5