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

 
Vladimir Karputov:

Le problème vient de l'EA. D'ailleurs, les règles de l'hébergement partagé interdisent les dlls.

Ça marchait très bien avant. J'aurais dû l'essayer sur un hébergement gratuit. Quoi qu'il en soit, j'ai donné 15 livres à methaquotes ))))

Merci pour la réponse !

 

L'EA ouvre des ordres de marché, puis les modifie, fixe le TP et le SL. Vérification du testeur. Le premier ordre est modifié en utilisant les paramètres requis. Le second ordre est ouvert dans la même direction que le premier mais le premier ordre est modifié en fonction des paramètres du second et le second reste avec un SL et un TP nuls. Dans ce cas, la condition est la suivante : si SL == 0 et TP == 0, l'autre ordre est modifié car il a des paramètres non nuls. Pourquoi ? Changer la recherche du premier au dernier ne change rien.

Une dernière chose. Dans le testeur, si deux ordres sont ouverts, le profit de l'ordre est indiqué dans la colonne profit, c'est-à-dire que le profit du deuxième ordre est indiqué dans le premier ordre ouvert et vice versa. Pourquoi ?

Il y a plus. Nous devons tracer une ligne de tendance suivant deux extrema. La ligne est tracée mais il s'agit d'un talon d'Achille de bar en bar. Ce n'est pas une ligne de tendance mais juste un segment alors que nous aimerions voir une ligne.

void PositionModifiSell()
{
   int    i;
   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)
               {
                  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(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
               }
            }
         }
      }
   }
}
 
Youri Lazurenko:

L'EA ouvre des ordres de marché, puis les modifie, fixe le TP et le SL. Vérification du testeur. Le premier ordre est modifié en utilisant les paramètres requis. Le second ordre est ouvert dans la même direction que le premier mais le premier ordre est modifié en fonction des paramètres du second et le second reste avec un SL et un TP nuls. Dans ce cas, la condition est la suivante : si SL == 0 et TP == 0, l'autre ordre est modifié car il a des paramètres non nuls. Pourquoi ? Changer la recherche du premier au dernier ne change rien.

Une dernière chose. Dans le testeur, la colonne de profit montre les ordres avec deux ordres ouverts mais vice versa : le profit du deuxième ordre est montré dans le premier ordre ouvert et vice versa. Pourquoi ?

Il y a plus. Nous devons tracer une ligne de tendance suivant deux extrema. La ligne est tracée mais il s'agit d'un talon d'Achille de bar en bar. Ce n'est pas une ligne de tendance, juste un segment alors que nous aimerions voir une ligne.

1. Pas des ORDRES, mais des POSITIONS.

2. Formulez votre question - jusqu'à présent, j'ai vu un récit, et je n'ai pas vu de question ou d'algorithme pour "comment on voudrait que ça marche".

 
Vladimir Karputov:

1. Pas des ORDRES, mais des POSITIONS

2. Formulez votre question - jusqu'à présent, j'ai vu un récit, et je n'ai pas vu la question et l'algorithme "comment vous voulez que ça marche".

Vous savez que ce sont des positions, puisque c'est dans mql5. Et il y a une position dans le code. La question est de savoir pourquoi la première position est modifiée et pas la dernière, alors que c'est spécifié dans la condition :

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)
 
Youri Lazurenko:

Il est clair que les positions sont là, puisque c'est dans mql5. Et dans le code, c'est la position. La question est de savoir pourquoi la première position est modifiée et pas la dernière, alors que c'est spécifié dans la condition :

La question est de savoir où. Décrire l'algorithme "Je veux que l'algorithme soit ceci ...".

 
Vladimir Karputov:

La question est : où ? Décrire l'algorithme "Je veux que l'algorithme soit comme ceci ...".

Lorsque la ligne de tendance est cassée et que la barre ferme au-dessus/en dessous, nous ouvrons une position avec un SL et un TP nuls. Immédiatement après l'ouverture, les TP et SL nécessaires sont fixés (la position est modifiée). Pourquoi, ce n'est pas la dernière position qui est modifiée, mais la précédente, tout en violant la condition :

if(m_position.StopLoss() == 0 && m_position.TakeProfit() == 0)

C'est clair maintenant ? Même si nous introduisons le moment de l'ouverture d'une position dans la condition, rien ne change. Il n'y a pas de limite au nombre de postes.

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

Lorsque la ligne de tendance est cassée et que la barre ferme au-dessus ou en dessous, une position avec un SL et un TP nuls est ouverte. Immédiatement après l'ouverture, les TP et SL nécessaires sont fixés (la position est modifiée). Pourquoi, ce n'est pas la dernière position qui est modifiée, mais la précédente, tout en violant la condition :

C'est clair maintenant ? Même si nous introduisons le moment de l'ouverture d'une position dans la condition, rien ne change. Il n'y a pas de limite au nombre de postes.

Êtes-vous sûr qu'au moment de la modification, un nouveau poste existe déjà ? (L'envoi d'un ordre de transaction ne garantit pas l'existence de la position).

Lors de la saisie de la condition (SL == 0.0 et TP == 0.0), imprimez le ticket de position.

 
Vladimir Karputov:

Êtes-vous sûr que le nouveau poste est déjà disponible au moment de la modification ? (L'envoi d'un ordre de transaction ne garantit pas l'existence d'une position).

Lorsque vous entrez la condition (SL == 0.0 et TP == 0.0), imprimez le ticket de position.

Oui, la deuxième position est déjà là. Je lis le journal. La méthode Sell a réussi, code 10009. (Ticket #3). Et ensuite suit une modification, uniquement de la position avec le ticket #2, qui est également exécutée avec succès (modification, bien que, je le souligne, selon les conditions ne devrait pas se produire, SL n'est plus 0 !).

J'ai déjà écrit, j'ai essayé à la fois par heure d'ouverture et par ticket, sans succès, cela modifie la position précédente. Par exemple :

void PositionModifiSell()
{
   int      i;
   datetime Time;
   double   sl    = 0; 
   double   tp    = 0;  
   datetime time  = 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)
            {
               Time = m_position.Time();
               
               if(Time > time)
               {
                  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(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кода: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  time = Time;
               }
            }
         }
      }
   }
}
//------------ или
void PositionModifiSell()
{
   int      i;
   ulong  Ticket;
   double sl     = 0; 
   double tp     = 0;  
   ulong  ticket = 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)
            {
               Tiсket = m_position.Ticket();
               
               if(ticket != 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(_Symbol, sl, tp))
                  {
                     Print("Метод PositionModify() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
                           ". Описание кодa: ", m_trade.ResultRetcodeDescription());
                  }
                  else
                  {
                     Print("Метод PositionModify() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
                           " (", m_trade.ResultRetcodeDescription(),")");
                  }
                  ticket = Ticket;
               }
            }
         }
      }
   }
}
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Oui, la deuxième position est déjà là. Je lis le journal. La méthode Sell a réussi, code 10009. (Ticket #3). Et ensuite la modification suit, seulement la position avec le ticket #2, qui est aussi fait avec succès.

Déjà écrit, essayé à la fois par l'heure d'ouverture et par le billet, pas moyen, modifie la position précédente. Par exemple :


C'est-à-dire : vous ne vérifiez pas le résultat de la position et vous ne voulez même pas imprimer le ticket. Si c'est le cas, joignez le code complet (en utilisant le bouton Joindre le fichier).

 
Vladimir Karputov:

C'est-à-dire : vous ne vérifiez pas le résultat de la position et vous ne voulez même pas imprimer le ticket. Dans ce cas, joignez le code complet (en utilisant le bouton ).

Vous ne voulez même pas imprimer le ticket - je ne comprends pas. Voici l'extrait du journal.

2021.02.01 12:54:55.338 2018.01.02 17:00:00 marché vendre 0.01 EURUSD (1.20384 / 1.20402)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 deal #2 vendre 0.01 EURUSD à 1.20384 fait (basé sur l'ordre #2)

2021.02.01 12:54:55.338 2018.01.02 17:00:00 affaire conclue [#2 vendre 0.01 EURUSD à 1.20384]

2021.02.01 12:54:55.338 2018.01.02 17:00:00 ordre exécuté vendre 0.01 à 1.20384 [#2 vendre 0.01 EURUSD à 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 CTrade::OrderSend : marché vendre 0.01 EURUSD [fait à 1.20384]

2021.02.01 12:54:55.344 2018.01.02 17:00:00 Méthode Sell() terminée avec succès. Code de retour = 10009 (fait à 1.20384)

2021.02.01 12:54:55.344 2018.01.02 17:00:00 position modifiée [#2 sell 0.01 EURUSD 1.20384 sl : 1.20813 tp : 1.20013]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 CTrade::OrderSend : modifier la position #2 EURUSD (sl : 1.20813, tp : 1.20013) [done]

2021.02.01 12:54:55.346 2018.01.02 17:00:00 La méthode PositionModify() a été exécutée avec succès. Code de retour = 10009 (terminé).

============================================================================================================== разделил, появление второй позиции

2021.02.01 12:55:48.819 2018.01.03 09:00:00 marché vendre 0.01 EURUSD (1.20442 / 1.20460)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 deal #3 sell 0.01 EURUSD at 1.20442 done (based on order #3)

2021.02.01 12:55:48.819 2018.01.03 09:00:00 affaire conclue [#3 vendre 0.01 EURUSD à 1.20442]

2021.02.01 12:55:48.819 2018.01.03 09:00:00 ordre exécuté vendre 0.01 à 1.20442 [#3 vendre 0.01 EURUSD à 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 CTrade::OrderSend : marché vendre 0.01 EURUSD [fait à 1.20442]

2021.02.01 12:55:48.821 2018.01.03 09:00:00 Méthode Sell() terminée avec succès. Code de retour = 10009 (fait à 1.20442)

====================================================================================================================== après une position ouverte avec succès, modification, mais ordre précédent

2021.02.01 12:55:48.821 2018.01.03 09:00:00 position modifiée [#2 sell 0.01 EURUSD 1.20384 sl : 1.20663 tp : 1.20154]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 CTrade::OrderSend : modifier la position #2 EURUSD (sl : 1.20663, tp : 1.20154) [done]

2021.02.01 12:55:48.823 2018.01.03 09:00:00 La méthode PositionModify() a été exécutée avec succès. Code de retour = 10009 (terminé)


J'ai posté le code complet de modification de la position sur Sell, avec les options.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением...