Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 979

 
Rustam Bikbulatov:
Bonjour, j'ai besoin de conseils. Pourquoi mon dernier texte ne s'affiche-t-il pas ? Qu'est-ce qui ne va pas ici ? Pouvez-vous me dire comment le réparer ?

Pourquoi avez-vous besoin d'une boucle si vous ne prenez que le nom d'un seul objet à tout moment ?

for(int no1=0; no1<ObjectsTotal(OBJ_TEXT); no1++)
  {
   if(ObjectName(0)=="Profit1"+iBarShift(NULL,1440,0))
     {
      double name;
      name = ObjectDescription(0);;
      Comment(name);
     }
  }
 

Iurii Tokman:

no1<=ObjectsTotal(OBJ_TEXT);

Vous ne pouvez pas exactement faire cela - ce sera en dehors des limites du tableau. S'il y a 10 objets, l'indice du dernier sera de 9. Parce que ça compte à partir de zéro.

 
Artyom Trishkin:

Pourquoi une boucle si on ne prend que le nom d'un objet à la fois ?

dites-moi exactement comment déterminer l'avant-dernier texte de cet objet.

 
Rustam Bikbulatov:

dites-moi exactement comment déterminer l'avant-dernier texte de cet objet.

C'est difficile de savoir ce que vous voulez.

 
void Profit()
  {
   ObjectCreate("Profit"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.6);
   ObjectSetText("Profit"+iBarShift(NULL,1440,0),DoubleToStr(AccountProfit(),2),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit1()
  {
   double  Prof = ObjectDescription("Profit1"+iBarShift(NULL,1440,0));
   double  P = -Prof;
   ObjectCreate("Profit1"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),0.1);
   ObjectSetText("Profit1"+iBarShift(NULL,1440,0),DoubleToStr(MathMax(-AccountProfit(),-P),1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit1"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit2()
  {
   ObjectCreate("Profit2"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.4);
   ObjectSetText("Profit2"+iBarShift(NULL,1440,0),iBarShift(NULL,1440,0)-1000,11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit2"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }
void Profit3()
  {
   for(int no1=0; no1<=ObjectsTotal(OBJ_TEXT); no1++)
     {
      if(ObjectFind(1,"Profit2"+iBarShift(NULL,1440,0))!=0)
        {

         string   obj_name;
         obj_name = ObjectName(3);
         string   name;
         name = ObjectDescription(obj_name);
         Comment(obj_name);
        }
     }

   ObjectCreate("Profit3"+iBarShift(NULL,1440,0),OBJ_TEXT,1,TimeCurrent(),-0.9);
   ObjectSetText("Profit3"+iBarShift(NULL,1440,0),DoubleToStr(name,1),11,"Arial",clrWhite);
   ObjectSetInteger(0,"Profit3"+iBarShift(NULL,1440,0),OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
   return;
  }

Provit - montre les bénéfices totaux pendant le test en cours de journée

Provit1 - indique le tirage maximal pour la journée

Provit2 - ligne numérique normale commençant par un

Provit3 - Cible ! Faites la somme de Provit1 et divisez-la par Provit2. Je veux connaître le drawdown quotidien moyen pour la durée totale du test. Aide pour comprendre Provit3

 

Chers collègues, que peut être cette erreur de fermeture et comment y remédier ? Voici le code ci-dessous, lorsque le profit est dépassé - fermer toutes les positions unidirectionnelles. Merci.

        
             
 // ЗАКРЫВАЕМ ВИРТУАЛЬНЫЕ ТР БАЙ позы            
     if(takeprofit < ProfitB)    
      {   
        Print(" ЗАКРЫТИЕ BUY POSITIONS. общий ProfitB = ", ProfitB," мин общий takeprofit buys positions = ", takeprofit);   
        for (i=OrdersTotal()-1; i>=0; i--)         
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {             
             if(OrderType()==OP_BUY)    
                             //if(OrderOpenPrice()+takeprofit*Point<=MarketInfo(Symbol(),MODE_BID) || 
                             //   OrderOpenPrice()-stoploss*Point>=MarketInfo(Symbol(),MODE_BID))   
                     
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray))  
                   Print(" закрытие бай, тикет = ", OrderTicket());
               else  Print(" ошибка закрытия бай, Error = ", GetLastError());          
            }
       }     
      
       if(takeprofit < ProfitS)     
        { 
         Print(" ЗАКРЫТИЕ СЕЛЛов. общий ProfitS = ", ProfitS," мин общий takeprofit СЕЛЛов = ", takeprofit);   
 
         for (i=OrdersTotal()-1; i>=0; i--)      
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
          if (OrderSymbol()==Symbol() &&  Magic_Прямой==OrderMagicNumber()) 
            {                       
             if(OrderType()==OP_SELL)    
                             //  if(OrderOpenPrice()-takeprofit*Point>=MarketInfo(Symbol(),MODE_ASK) ||
                             //     OrderOpenPrice()+stoploss  *Point<=MarketInfo(Symbol(),MODE_ASK))                
             
               if (OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*2,Digits()),clrGray)) 
                   Print(" закрытие SELL,  тикет = ", OrderTicket());
               else   Print(" ошибка закрытия sell, Error = ", GetLastError());     
            }       
         }    
           
 
Roman Shiredchenko:

Chers collègues, quelle peut être cette erreur de fermeture et comment y faire face ? Si je veux utiliser le code ci-dessous, je dois fermer tous les ordres unidirectionnels lorsqu'ils sont rentables. Merci.

Quelle est l'erreur ? mauvais écran

en théorie, cela devrait fonctionner, mais je n'ai pas vu de clôture aussi sophistiquée, prenant en compte le spread et l'ajoutant comme slippage - à mon avis, si vous décidez de clôturer, alors le slippage n'est pas la chose la plus importante à surveiller, les erreurs de clôture sont plus importantes, puis les requotes, puis la connexion est complètement perdue


Retirez OrderClose(....) et remplacez-le par ClosePosBySelect() de Kimhttps://www.mql5.com/ru/forum/131859/page2#comment_3359664.

l'utiliser, vous verrez alors clairement où il se brise - soit dans vos conditions de fermeture, soit dans le serveur qui présente un bogue.

 
Igor Makanu:

Quelle est l'erreur ? mauvais écran

en théorie, cela devrait fonctionner, mais je n'ai pas vu de clôture aussi sophistiquée prenant en compte l'écart et l'ajoutant comme slippage - imho, si vous décidez de clôturer, alors le slippage n'est pas la chose la plus importante à surveiller, les erreurs de clôture sont plus importantes, puis les requotes, puis la connexion est complètement perdue


supprimez OrderClose(....) et passez le ticket à la place à ClosePosBySelect() de Kim, alors il deviendra clair où cela ne fonctionne pas - soit dans vos conditions de fermeture, soit le serveur a un bug

Il a un prix zéro près de là. Par conséquent, nous devons contrôler ce qui a été renvoyé par la fonction MarketInfo, mais il n'y a pas de contrôle. Cependant, comme d'habitude sur quatre, certaines personnes sont habituées à écrire - quelque chose reçu, ce qui - n'a pas vérifié, mais a envoyé un argument.

 
Artyom Trishkin:

Il a un prix zéro près de là. Par conséquent, nous devons contrôler ce qui a été renvoyé par la fonction MarketInfo, mais il n'y a pas de contrôle. Cependant, comme d'habitude sur le quatre certaines personnes sont habituées à écrire - quelque chose reçu, ce qui - n'a pas vérifié, mais a envoyé l'argument.

Je l'ai vu, je doute qu'il puisse tout annuler lui-même, c'est pourquoi j'ai suggéré d'utiliser le contrôle ClosePosBySelect() pour fermer l'ordre sélectionné viaOrderSelect( ) - il peut le faire, du moins je l'ai vu assembler des codes avec le constructeur ;)))

SZY : J'ai un autre soupçon : un ordre est fermé deux fois, mais la fonction de Kim s'imprime dans le journal, il semble qu'il n'y ait pas de boucles séparées à fermer par la deuxième condition.

 
Igor Makanu:

Je l'ai vu, je doute qu'il puisse tout désamorcer tout seul, c'est pourquoi j'ai suggéré d'utiliser la fermeture éprouvée d'un ordre en surbrillance via OrderSelect()

Bien sûr, les fonctions d'Igor feront tout pour l'utilisateur (et même certains utilisateurs arrivent à faire une erreur avec elles). Mais dans ce cas, il n'apprendra jamais à faire quoi que ce soit lui-même. Même si, bien sûr, c'est leur choix.