Erreurs, bugs, questions - page 52

 
Ce n'était pas comme ça dans MT4, merci. Je viens de l'enlever.
 

Pendant le test des conseillers experts :
Exp_TEMA.mq5, de l'article : "Création d'un conseiller expert qui négocie sur différents symboles". L'expression Told[] Tnew[1]prend les valeurs suivantes :
Told[] L'expression n'a pas pu être évaluée
Tnew[1] Plage de tableau non valide.

Et My_First_EA.mq5, de l'article : "Un guide pas à pas pour écrire des conseillers experts MQL5 pour les débutants", l'expression
New_Time[1] obtient la valeur:Invalid array range

Que signifient les valeurs Expression could not be evaluated, Invalid array range, et comment affectent-elles les résultats des experts ?

 

Told - tableau vide sans taille

Tnew[1] - hors tableau, le tableau est décrit comme Tnew[1], donc ses éléments ne peuvent être accédés que comme Tnew[0], car l'index commence à zéro.

 
Renat:

Told - tableau vide sans taille

Tnew[1] - hors tableau, le tableau est décrit comme Tnew[1], donc ses éléments ne peuvent être accédés que comme Tnew[0], car l'index commence à zéro.


Quant à Tnew, je l'ai déjà mentionné dans un autre fil du forum, apparemment, un commentaire des développeurs était nécessaire :)
 

Veuillez m'indiquer comment ouvrir une seule transaction par condition. Avec mon code, le terminal ouvre plusieurs transactions sur cette condition, mais je n'en ai besoin que d'une seule.

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

Le résultat est l'image suivante :

Comment puis-je vérifier si une transaction a été effectuée avec cette condition ou non ? J'ai essayé de cette façon, mais ça ne marche pas :

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

Veuillez m'indiquer comment ouvrir une seule transaction par condition. Avec mon code, le terminal ouvre plusieurs transactions sur cette condition, mais je n'en ai besoin que d'une seule.

Le résultat est l'image suivante :

Comment puis-je vérifier si une transaction a été effectuée avec cette condition ou non ? J'ai essayé de cette façon, mais ça ne marche pas :

Et pourquoi organiser la recherche dans la boucle s'il existe une chose aussi merveilleuse que PositionSelect?

Nous vérifions simplement l'existence de la position sur le symbole intéressant et si c'est vrai, nous allons boire du cognac et fumer des cigares... :)

PS

Si je comprends bien, PositionGetString sansPositionSelect ne devrait pas fonctionner. Nous n'avons pas besoin de connaître les symboles de toutes les poses ouvertes, n'est-ce pas ?

 
Interesting:

Il n'est pas nécessaire de chercher dans la boucle quand il existe une chose aussi merveilleuse que PositionSelect?

Il suffit de vérifier la présence d'une position sur l'outil qui nous intéresse et si le résultat est positif, nous allons tranquillement boire du cognac et fumer des cigares... :)

PS

Si je comprends bien, PositionGetString sansPositionSelect ne devrait pas fonctionner. Nous n'avons pas besoin de connaître les symboles de toutes les poses ouvertes, n'est-ce pas ?

Ce code tient compte de la présence d'une position ouverte :

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

Mais il continue à ouvrir des positions lorsque la condition Buy_Signal est remplie. Ce que je veux, c'est qu'avant que Sell_Signal ne se produise, une position à Buy_Signal ne soit pas réouverte. J'essaie de l'implémenter de cette façon :

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
Ça ne va pas.
 
AM2:

Ce code tient compte de la présence d'une position ouverte :

Mais il continue à ouvrir des positions lorsque la condition Buy_Signal est remplie. Je dois m'assurer qu'avant que la condition Sell_Signal ne se produise, aucune autre position ne sera ouverte par Buy_Signal. J'essaie de le mettre en œuvre de cette façon :

Ce n'est pas le cas.

Pourquoi ce code ? Cela ne ressemble guère à ce que je voulais dire (je doute que tout y soit correct).

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

Et je voulais dire quelque chose comme ça :

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

On pourrait au moins le faire en bloc.

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

Pourquoi ce code particulier ? Ce n'est pas du tout similaire à ce que je voulais dire (je doute même que ce soit juste).

Et je voulais dire quelque chose comme ça :

Au minimum, tout peut être fait dans un bloc.

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

Ce code et le code ci-dessus n'ouvrent pas de position tant qu'ils ne sont pas fermés, mais ils en ouvrent une nouvelle après la fermeture sur la prochaine barre si la condition est remplie. Je l'ai mis en œuvre de cette façon :

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

Merci ! J'ai tenu compte de tous vos souhaits et tout fonctionne maintenant. J'ai posté le conseiller expert pour publication. Je peux faire quelques changements supplémentaires dans le code. Il n'y a pas de limite à la séduction))))

 
Je n'ai pas trouvé de description des codes de réponse (Retcode) pour la structure des résultats de contrôle des demandes de commerce MqlTradeCheckResult dans la documentation. Y en aura-t-il ?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5