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

 
MrBrooklin #:

Je l'ai maintenant. Merci ! Il s'avère que s'il y a au moins une position ouverte, le code d'erreur 4753 n'apparaîtra jamais.

Cordialement, Vladimir.

Il apparaîtra si vous écrivez ce qui suit

PositionSelect("мой символ");
 
Alexey Viktorov #:

Il apparaîtra si vous écrivez ceci

Bonjour Alexey, une précision. Est-il nécessaire d'utiliser PositionSelect() au lieu d'une boucle, ou ai-je encore mal compris quelque chose ?

Cordialement, Vladimir.

 
MrBrooklin #:

Bonjour Alexey, une précision. Est-il nécessaire d'utiliser PositionSelect() au lieu d'une boucle ou ai-je encore mal compris quelque chose ?

Cordialement, Vladimir.

Vous pouvez l'écrire comme vous voulez, l'essentiel est d'écrire un caractère inexistant pour obtenir une erreur...

 
Alexey Viktorov #:

Vous pouvez l'écrire comme vous le souhaitez, l'essentiel étant d'écrire un caractère inexistant pour obtenir une erreur....

Mais ne me jetez pas de pantoufles à la figure !!! Je n'arrive pas à obtenir le code d'erreur. ((((

void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   string symb = "BrooklinUSDrfd";
   PositionSelect(symb);
   PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = ", symb, GetLastError());
  }

Cordialement, Vladimir.

 
MrBrooklin #:
Erreur = "
Le spécificateur %lu devrait être présent
 
Artyom Trishkin #:
Il devrait y avoir un spécificateur à cet endroit

Merci Artem, ça a marché ! !! Merci beaucoup à tous !

Bien à vous, Vladimir.

 

En bref, j'ai résolu le problème décrit ici d'une manière différente :

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   if(!PositionSelect(_Symbol))
      PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = %lu", _Symbol, GetLastError());
   int pos_total = PositionsTotal(); // объявим переменную для хранения количества открытых позиций
   if(pos_total > 0) // если есть открытые позиции
     {
      for(int i=0; i<pos_total; i++) // запустим цикл и переберём все открытые позиции
        {
         if(PositionGetSymbol(i) == _Symbol) // выберем все открытые позиции по текущему символу
           {
            ulong  pos_id = PositionGetInteger(POSITION_IDENTIFIER);
            double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = PositionGetDouble(POSITION_TP);
            double pos_sl = PositionGetDouble(POSITION_SL);
            PrintFormat("Позиция #%d цена = %G тейк-профит = %G стоп-лосс = %G", pos_id, pos_price, pos_tp, pos_sl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

Salutations, Vladimir.

 

Bonsoir à tous !

J'essaie de créer une fonction qui ouvre une position supplémentaire (sans stop and take) à une position ouverte existante. J'ai écrit le code :

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Add_Pos_Buyl()
  {
   for(int i=pos_total-1; i<pos_total; i++) // ищем последнюю по списку открытую позицию
     {
      PositionGetTicket(i); // получим тикет позиции по индексу в списке открытых позиций
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && // если совпадает символ открытой позиции
         PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && // если совпадает тип открытой позиции
         PositionGetInteger(POSITION_MAGIC) == Magic_Number) // и если совпадет мэджик
        {
         double pos_price_open=PositionGetDouble(POSITION_PRICE_OPEN); // объявим и инициализируем переменную для цены открытой позиции
         if(// тут задано условие для открытия позиции)
           {
            double new_price_pos=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            trade.Sell(0.01,_Symbol,new_price_pos,0,0);
           }
        } 
     }
  }

mais pour une raison quelconque, il ne voit pas la position ouverte. J'ai essayé de trouver le problème avec le débogueur, mais après avoir démarré la boucle, il quitte immédiatement la fonction sans voir ce qui est écrit à l'intérieur. J'ai placé un point d'arrêt à PositionGetTicket(i). Pourriez-vous me dire où se trouve le problème dans mon code ?

Cordialement, Vladimir.

 
MrBrooklin position ouverte existante. J'ai écrit le code :

mais pour une raison quelconque, il ne voit pas la position ouverte. J'ai essayé de trouver le problème avec le débogueur, mais après avoir démarré la boucle, il quitte immédiatement la fonction sans voir ce qui est écrit à l'intérieur. J'ai placé un point d'arrêt sur PositionGetTicket(i). Pourriez-vous m'indiquer où se trouve le problème dans mon code ?

Cordialement, Vladimir.

Qu'est-ce que pos_total ?

 
Alexey Viktorov #:

Quelle est la valeur de pos_total ?

Bonjour Alexey, la variable pos_TotalPositionsTotal(), mais elle était définie au niveau global. Maintenant je l'ai déplacée à l'intérieur de la fonction et il s'est avéré que c'était là le problème. Tout fonctionne. Quel est le problème ? Je n'ai pas du tout compris l'astuce !!!

Maintenant, pour le bien de l'expérience, j'ai déplacé pos_total au niveau global à nouveau et cela a cessé de fonctionner à nouveau, mais quand je l'ai mis à l'intérieur de la fonction, cela fonctionne comme il se doit ! Quelques miracles, en tout cas pour moi !!!! )))

Il s'avère qu'une variable au niveau global ne peut pas être initialisée par une fonction ? Est-ce le cas ?

Cordialement, Vladimir.

Raison: