[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 410

 

Dans le tutoriel MQL , dans le chapitre Standard Functions, dans la section Graph Operations, il y a une fonction WindowHandle avec la description suivante :" ... renvoie le descripteur système de la fenêtre (poignée de fenêtre) contenant le graphique spécifié".

Question: que signifie "poignée de fenêtre" (qu'est-ce que c'est) et à quoi cela sert-il?

P.S. Afin de ne pas encombrer le forum, merci d'avance pour votre réponse.

 
7777877:

Dans le tutoriel MQL , dans le chapitre Standard Functions, dans la section Graph Operations, il y a une fonction WindowHandle avec la description suivante :" ... renvoie le descripteur système de la fenêtre (poignée de fenêtre) contenant le graphique spécifié".

Question: que signifie "poignée de fenêtre" (qu'est-ce que c'est) et à quoi cela sert-il?

P.S. Afin de ne pas encombrer le forum, merci d'avance pour la réponse.


Réponse :

Le descripteur de la fenêtre est un numéro.

un descripteur de fenêtre est nécessaire pour manipuler une fenêtre

 
int start()
{
  for (int i=OrdersHistoryTotal()-1;i>=0; i--)
  {
    if( OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
       if (TimeDay (OrderOpenTime())==Day()
        && TimeMonth(OrderOpenTime())==Month()
        && TimeYear (OrderOpenTime())==Year())
         if(OrderType()==OP_SELL && OrdersTotal()==0 || OrdersHistoryTotal()==0)
         {
            OrderSend( Symbol(), OP_BUY, 0.1, Ask, 5,Bid-25*Point,Bid+25*Point, "", 0, 0, Blue );
         }
         if( OrderType()==OP_BUY && OrdersTotal()==0 || OrdersHistoryTotal()==0)
         {
            OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5,Ask-25*Point,Ask+25*Point, "", 0, 0, Red );
         }
    }
  }
  return(0);
}

bonjour ! problème avec le code !!! j'ai besoin que les ordres s'ouvrent un par un vendre, baie, vendre etc., mais le comptage a été fait dans la journée, le lendemain par un nouveau, sans tenir compte de l'ordre d'ouverture des ordres de la journée précédente ! c'est un nouveau jour un nouveau cycle ! ci-dessus le code je pense qu'il devrait ressembler à ceci ! sauf que l'EA n'ouvre aucun ordre ! je ne peux pas comprendre ce qui ne va pas ...dites-moi si vous savez !!!

 
Comment le faire correctement.
Je veux que les ordres en attente soient fermés à l'arrivée d'un nouveau jour, s'ils n'ont pas été exécutés... Je l'ai écrit, mais il ne fonctionne pas. erreur 4051
  if (iTime(Symbol(),PERIOD_D1,0) != New_Day_DateTime)
   {
         New_Day_DateTime = iTime(Symbol(),PERIOD_D1,0); 
         GlobalVariableSet("gNew_Day_DateTime",New_Day_DateTime); 
  
for( i=1;i<=OrdersTotal(); i++)         
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {                                      

         if (OrderSymbol()!= Symb) continue;    
          Tip=OrderType();                   
         if (Tip==0) continue;           

            Limit_Stop=Tip;
             if (OrderMagicNumber()==3)                     
            {Ticket_B=OrderTicket();}
        }                                    
     }                                       

   while(true)                                
     {
      if (Limit_Stop==-1)                      
        {
         break;                                      
        }
       Ans_B=OrderDelete(Ticket_B);             

      if (Ans_B==true)                          
        {
         break;                                 
     }   }
        
for ( i=1; i<=OrdersTotal(); i++)         
     {        
    if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {                                      

         if (OrderSymbol()!= Symb) continue;    
          Tip=OrderType();                   
         if (Tip==1) continue;                 

      if (OrderMagicNumber()==4) 
      {Ticket_S=OrderTicket();}              
     }
     }
   while(true)                                
     {
      if (Limit_Stop==-1)                      
        {
         break;                                      
        }
        Ans_S=OrderDelete(Ticket_S);            

      if (Ans_S==true) 
        {
         break; 
        }
}
 
Egori4:


Lorsque vous ouvrez un ordre en suspens, définissez une heure d'expiration, disons 23:59, l'ordre se ferme de lui-même.

nt OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

 
lowech:

bonjour ! problème avec le code !!! j'ai besoin que les ordres s'ouvrent un par un vendre, baie, vendre etc., mais le comptage a été fait dans la journée, le lendemain par un nouveau, sans tenir compte de l'ordre d'ouverture des ordres de la journée précédente ! c'est un nouveau jour un nouveau cycle ! ci-dessus le code je pense qu'il devrait ressembler à ceci ! sauf que l'EA n'ouvre aucun ordre ! je ne peux pas comprendre ce qui ne va pas ...dites-moi si vous savez !!!


Et pourquoi devrait-elle ouvrir des ordres, surtout si l'historique est vide. Et apprenez à insérer du code humainement, je n'aime pas éditer les posts des autres.
 
Sepulca:
Merci ! Je vais essayer...
 

Comment ajouter à ce conseiller

//+------------------------------------------------------------------+

//| CCI.mq4 |

//| Copyright 2012, MetaQuotes Software Corp.

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "Copyright 2012, MetaQuotes Software Corp.

#lien de propriété "http://www.metaquotes.net"



extern double LotTrend = 0.1 ;

extern int TP=100 ;

extern int SL=250 ;


//+------------------------------------------------------------------+

//| fonction d'initialisation de l'expert |

//+------------------------------------------------------------------+

int init()

{

//----

//----

retour(0) ;

}

//+------------------------------------------------------------------+

//| fonction de désinitialisation des experts |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

retour(0) ;

}

//+------------------------------------------------------------------+

//| fonction de démarrage de l'expert |

//+------------------------------------------------------------------+

int start()

{

si (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)

{

si (Bid>iMA(Symbol(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_BUY,LotTrend,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,0,Green)

}

si (Bid<iMA(Symbol(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_SELL,LotTrend,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,0,Green) ;

}

}



//----

retour(0) ;

}

//+------------------------------------------------------------------+

1. ouvrir une transaction uniquement à la clôture d'une bougie (lorsque le prix traverse la SMA).

 

Bonjour ! J'ai une question concernant les indicateurs dans MQL4 et je n'arrive pas à la comprendre complètement... Par exemple, j'ai un indicateur fractal simple :

//+===========================================================================+ 
//|                                                                  FRAC.mq4 | 
//+===========================================================================+ 
// Параметры: 
// 
// По умолчанию frac_5 - оранжевый, frac_3 - темно-синий. 
//----- 
// History    - определяет на сколько глубоко в историю вам нужно отображение  
//              индикатора (в количестве свечей). Минимальное значение = 2. 
//-----  
// frac_3     - если значение "on", то frac_3 отображается, иначе нет. 
//-----  
// frac_5     - если значение "on", то frac_5 отображается, иначе нет. 
//+===========================================================================+ 
#property indicator_chart_window 
#property indicator_buffers            4     
#property indicator_color1  MidnightBlue 
#property indicator_color2  MidnightBlue  
#property indicator_color3        Orange 
#property indicator_color4        Orange 
//-----         
extern int         history     =     500; 
extern string       frac_3     =    "on";   
extern string       frac_5     =    "on";
extern int          metka      =      20;
//-----         
double FRAC_3_POS[]; 
double FRAC_3_NEG[]; 
double FRAC_5_POS[]; 
double FRAC_5_NEG[]; 

//+===========================================================================+ 

int init() 
   { 
     SetIndexBuffer (0, FRAC_3_POS);  
              
     SetIndexStyle  (0, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (0, 217); 
   //-----         
     SetIndexBuffer (1, FRAC_3_NEG);    
            
     SetIndexStyle  (1, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (1, 218); 
   //-----         
     SetIndexBuffer (2, FRAC_5_POS);      
          
     SetIndexStyle  (2, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (2, 217); 
   //-----         
     SetIndexBuffer (3, FRAC_5_NEG);        
        
     SetIndexStyle  (3, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (3, 218); 
      
    return(0); 
   } 

//+===========================================================================+ 

int start() 
   { 
    int i,Counted_bars; 
     
    Counted_bars = IndicatorCounted(); 
     
     i = Bars - Counted_bars - 1; 
     
     if (history < 2) 
      
         history = 2; 
                   
     if (i > history - 1) 
      
         i = history - 1;
         //i=Bars -  1;
    //----- 
     if (Digits <= 3) 
       
         double K = 0.01; 
       
     else       K = 0.0001;     
              
    while (i >= 0) 
          { 
           double FR_3P=0, FR_3N=0, 
                  FR_5P=0, FR_5N=0; 
          //-----         
           if (High[i+1] >= High[i+2] && High[i+1] >= High[i]) 
            
               FR_3P = High[i+1] + metka*K; 
          //-----         
           if (Low[i+1] <= Low[i+2] && Low[i+1] <= Low[i]) 
            
               FR_3N = Low[i+1] - metka*K; 
          //-----         
           if (High[i+2] >= High[i+4] && High[i+2] >= High[i+3] && High[i+2] >= High[i+1] && High[i+2] >= High[i]) 
            
               FR_5P = High[i+2] + metka*K; 
          //-----         
           if (Low[i+2] <= Low[i+4] && Low[i+2] <= Low[i+3] && Low[i+2] <= Low[i+1] && Low[i+2] <= Low[i]) 
            
               FR_5N = Low[i+2] - metka*K; 
          //-----  
           if (frac_3 != "on") 
              { 
               FR_3P = EMPTY; 
                 
               FR_3N = EMPTY; 
              }  
          //-----  
           if (frac_5 != "on") 
              { 
               FR_5P = EMPTY; 
                 
               FR_5N = EMPTY; 
              }       
          //-----  
            
               FRAC_3_POS[i+1] = FR_3P; 
                
               FRAC_3_NEG[i+1] = FR_3N; 
                
               FRAC_5_POS[i+2] = FR_5P; 
                
               FRAC_5_NEG[i+2] = FR_5N; 
               
               i--; 
          } 
      return(0); 
   } 
//+===========================================================================+ 

Si vous le compilez sous cette forme, il commence à avoir des problèmes lors de l'extension de la bordure gauche du graphique et du chargement de l'historique et affiche des marques là où elles ne devraient pas être (voir la capture d'écran dans la pièce jointe). Si on commente une partie du code :

if (history < 2) 
      
         history = 2; 
                   
     if (i > history - 1) 
      
         i = history - 1;

Ensuite, ces problèmes disparaissent... Les mêmes problèmes apparaissent lors du chargement de l'historique, si vous ne remplissez que les éléments "non vides" du tableau d'indicateurs et ne réinitialisez pas la valeur de l'indicateur là où il n'y a pas d'étiquettes...

Pourquoi cela se produit-il ? Pourquoi, en effet, est-il nécessaire de recalculer l'ensemble de l'indicateur lors du chargement de l'historique ? Et pourquoi dois-je annuler les valeurs des éléments "vides" du tableau ?

Si les barres étaient indexées de gauche à droite, au chargement de l'historique, les index des barres changeaient, et l'indicateur s'affichait incorrectement sans recalcul, alors on comprendrait ce problème .... Mais dans MT4 les barres sont indexées de droite à gauche, donc, lors du chargement de l'historique, les index de ces barres qui étaient là précédemment devraient être restés les mêmes (et les valeurs de l'indicateur aussi), alors pourquoi recalculer l'indicateur et d'où viennent ces décalages de marqueurs ?

 

Chers collègues, pourriez-vous répondre à la question suivante ?
J'ouvre 4 ordres d'achat à la main, j'exécute un EA qui supprime les ordres fixés au cours acheteur, le slippage est de 100 pips, la suppression en boucle, la vérification de l'occupation du fil et les mises à jour des cotations sont présentes. Pourquoi tous les ordres ne sont-ils pas supprimés dans la boucle ? Le journal montre que la suppression nécessite quelques initialisations de la fonction start()
.

int start()  
  {
   Print("Пришёл новый тик");
   int total=OrdersTotal();
   Print("Всего ордеров = "+total);
   for (int i=0;i<total;i++)
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         //Print("Всего ордеров = "+OrdersTotal());
         Print("удаляем ордер = "+i+" тикет ордера = "+OrderTicket());
         while(IsTradeContextBusy())
            {
            Print("Торговый поток занят");
            Sleep(100);
            }
         RefreshRates();       
         OrderClose(OrderTicket(),OrderLots(),Bid,100,0);
         Print("ошибка="+GetLastError());
         }  
   return(0);
  }
       

Voici le journal de l'EA :

17:16:59 temp EURUSD,M1 : chargé avec succès
17:17:51 temp EURUSD,M1 : Nouveau tick arrivé
17:17:51 temp EURUSD,M1 : Total des ordres = 4
17:17:51 temp EURUSD,M1 : delete order = 0 tick order = 2808657
17:17:52 temp EURUSD,M1 : close #2808657 buy 1.00 EURUSD à 1.28969 au prix de 1.28973
17:17:52 temp EURUSD,M1 : error=0
17:17:52 temp EURUSD,M1 : remove order = 1 ticket order = 2808659
17:17:52 temp EURUSD,M1 : close #2808659 buy 1.00 EURUSD à 1.28974 au prix de 1.28975
17:17:52 temp EURUSD,M1 : Error=0
17:17:54 temp EURUSD,M1 : New tick came
17:17:54 temp EURUSD,M1 : Total orders = 2
17:17:54 temp EURUSD,M1 : remove order = 0 tick order = 2808658
17:17:54 temp EURUSD,M1 : close #2808658 buy 1.00 EURUSD at 1.28969 at price 1.28976
17:17:54 temp EURUSD,M1 : Error=0
17:17:56 temp EURUSD,M1 : New tick came
17:17:56 temp EURUSD,M1 : Total orders = 1
17:17:56 temp EURUSD,M1 : remove order = 0 tick order = 2808660
17:17:56 temp EURUSD,M1 : close #2808660 buy 1.00 EURUSD à 1.28976 au prix de 1.28977
17:17:56 temp EURUSD,M1 : error=0