La grande et terrible MT4 pour toujours (ou comment organiser une transition) - page 27

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

OrderModify() dans MQL5 ?

Edward Munroe, 2021.05.27 00:51

Posez une question simple, obtenez une réponse simple !? Pourquoi est-ce que presque tout dans mql5 doit être si désordonné ?

Bonne question.

 

Traditionnellement, une tâche simple avant le week-end.

Une position ouverte correspond à 1 lot. Après avoir exécuté le script, nous devons faire en sorte que la position devienne 0.9 lots.

Il est clair que le scénario peut être lancé à tout moment. C'est pourquoi de nombreuses situations peuvent se produire.


Comme d'habitude, j'ai essayé de résoudre le problème de manière classique.

// Частичное закрытие позиции.

#include <Trade\Trade.mqh>

void OnStart()
{
  CTrade Trade;
  
  if (Trade.Buy(1)) // Пытаемся открыть позицию на 1 лот.
  {
    const ulong Ticket = Trade.ResultOrder();
    
    // Ждем, пока не появится.
    while (!IsStopped() && !PositionSelectByTicket(Ticket))
      Sleep(0);
      
    // А теперь просто закрываем 0.1 лота в случае, если объем позиции равен 1.
    // Цикл - для эмуляции запуска скрипта в любой момент.
    while (!IsStopped() && PositionSelectByTicket(Ticket) && (PositionGetDouble(POSITION_VOLUME) == 1))
      Trade.PositionClosePartial(Ticket, 0.1);
  }
}


Ce script montre une position à 0.8 lots. Nous avons besoin de 0,9.

 
fxsaber:

L'exécution de ce script donne une position de 0,8 lots. J'ai besoin de 0,9.

Testé plusieurs fois sur 2 serveurs, je n'ai obtenu que 0.9


La logique des tests est claire - nous essayons de nous débarrasser de l'exécution asynchrone sur un tick, le schéma général de ce processus (comment se synchroniser sur un tick) est important à connaître.

 
fxsaber:

Traditionnellement, une tâche simple avant le week-end.


Putain de merde ! Et j'ai 0.8 (sur MQDemo -0.9). Combien d'autres de ces râteaux y aura-t-il ?

 
 
fxsaber:
Résolu.

C'est probablement la tâche la plus difficile de toutes les tâches faciles à formuler dans ce fil pour le moment.

Un test très fort de la maîtrise de la partie trading de MQL5.

 

ouvrir un ordre d'achat avec un SL et un TP nuls, puis fixer un SL et un TP de 30 pips (si ma mémoire est bonne, il s'agit du type de compte Market Execution - le SL et le TP ne peuvent être fixés en une seule fois)

Pour MT4, ce code fonctionne :

void OnStart()
{
   int ticket;
   if((ticket = OrderSend(_Symbol, OP_BUY, 0.1, Ask, 30, 0.0, 0.0)) < 0 ||
         !OrderSelect(ticket, SELECT_BY_TICKET) ||
         !OrderModify(ticket, OrderOpenPrice(), NormalizeDouble(OrderOpenPrice() - 300 * _Point, _Digits), NormalizeDouble(OrderOpenPrice() + 300 * _Point, _Digits), OrderExpiration()))
   {
      Print("Error Open order # ", GetLastError());
   }
}
 
Igor Makanu:

ouvrir un ordre d'achat avec un SL et un TP nuls, puis fixer un SL et un TP de 30 pips (si ma mémoire est bonne, il s'agit du type de compte Market Execution - le SL et le TP ne peuvent être fixés en une seule fois)

Pour MT4, ce code fonctionne :

Il y a deux ou trois ans, la reconnaissance du type d'exécution a été introduite au niveau des terminaux. Maintenant, même avec l'exécution au marché, vous pouvez définir un SL et un TP et le terminal lui-même divisera l'ordre en deux ordres de transaction.

 
Igor Makanu:

Ouvrez un ordre d'achat avec un SL et un TP nuls, puis placez un SL et un TP de 30 pips (si ma mémoire est bonne, il s'agit du type de compte Market Execution - le SL et le TP ne peuvent pas être placés simultanément).

Une tâche commune.