[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 4. - pagina 410

 

Nel tutorial MQL nel capitolo Funzioni standard nella sezione Operazioni grafiche c'è una funzione WindowHandle con la seguente descrizione:" ... restituisce il descrittore di sistema della finestra (window handle) contenente il grafico specificato".

Domanda: cosa significa "window handle" (cos'è) e a cosa serve?

P.S. Per non ingombrare il forum, vi ringrazio in anticipo per la vostra risposta

 
7777877:

Nel tutorial MQL nel capitolo Funzioni standard nella sezione Operazioni grafiche c'è una funzione WindowHandle con la seguente descrizione:" ... restituisce il descrittore di sistema della finestra (window handle) contenente il grafico specificato".

Domanda: cosa significa "window handle" (cos'è) e a cosa serve?

P.S. Per non ingombrare il forum, grazie in anticipo per la risposta


Risposta:

Il descrittore della finestra è un numero.

un descrittore di finestra è necessario per manipolare una finestra

 
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);
}

ciao! problema con il codice!!! ho bisogno che gli ordini si aprano uno per uno sell, bay, sell ecc, ma il conteggio è stato fatto durante il giorno, il giorno successivo da uno nuovo, senza considerare l'ordine degli ordini di apertura del giorno precedente! che è un nuovo giorno un nuovo ciclo! sopra il codice penso che dovrebbe apparire così! tranne che l'EA non apre alcun ordine! non riesco a capire cosa c'è di sbagliato ...dimmi se sai!!!

 
Come farlo correttamente.
Voglio che gli ordini pendenti siano chiusi quando arriva un nuovo giorno, se non sono stati eseguiti... L'ho scritto, ma non funziona. errore 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:


Quando aprite un ordine pendente, impostate una scadenza, diciamo le 23:59, l'ordine si chiuderà da solo.

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:

ciao! problema con il codice!!! ho bisogno che gli ordini si aprano uno per uno sell, bay, sell ecc, ma il conteggio è stato fatto durante il giorno, il giorno successivo da uno nuovo, senza considerare l'ordine degli ordini di apertura del giorno precedente! che è un nuovo giorno un nuovo ciclo! sopra il codice penso che dovrebbe essere così! tranne che l'EA non apre alcun ordine! non riesco a capire cosa c'è di sbagliato ...dimmi se lo sai!!!


E perché dovrebbe aprire gli ordini, soprattutto se la storia è vuota. E impara come inserire il codice umanamente, non mi piace modificare i post degli altri.
 
Sepulca:
Grazie! Proverò...
 

Come aggiungere a questo consulente

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

//| CCI.mq4 |

//| Copyright 2012, MetaQuotes Software Corp.

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

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

#property copyright "Copyright 2012, MetaQuotes Software Corp.

#proprietà link "http://www.metaquotes.net"



extern double LotTrend = 0.1;

extern int TP=100;

extern int SL=250;


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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

ritorno(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

ritorno(0);

}

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

//| funzione di inizio esperto |

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

int start()

{

se (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==Falso)

{

se (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,Green)

}

se (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,Green);

}

}



//----

ritorno(0);

}

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

1. Aprire un trade solo alla chiusura di una candela (quando il prezzo incrocia la SMA)

 

Salve, ho una domanda riguardante gli indicatori in MQL4 e non riesco a capirlo completamente... Per esempio, ho un semplice indicatore frattale:

//+===========================================================================+ 
//|                                                                  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); 
   } 
//+===========================================================================+ 

Se lo si compila in questa forma, comincia ad avere dei glitch quando si estende il bordo sinistro del grafico e si carica la cronologia e mostra dei segni dove non dovrebbero essere (vedere lo screenshot nell'allegato). Se commentiamo una parte del codice:

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

Poi questi glitch spariscono... Gli stessi problemi appaiono quando si carica la storia, se si riempiono solo gli elementi "non vuoti" dell'array di indicatori e non si resetta il valore dell'indicatore dove non ci sono etichette...

Perché succede questo? Perché, a quanto pare, è necessario ricalcolare l'intero indicatore quando si carica la storia? E perché devo annullare i valori degli elementi "vuoti" dell'array?

Se le barre fossero indicizzate da sinistra a destra, al caricamento della storia gli indici delle barre cambierebbero, e l'indicatore sarebbe visualizzato erroneamente senza ricalcolo, allora capiremmo questo inconveniente... Ma in MT4 le barre sono indicizzate da destra a sinistra, quindi, quando si carica lo storico, gli indici di quelle barre che c'erano prima dovrebbero essere rimasti gli stessi (e anche i valori dell'indicatore), allora perché ricalcolare l'indicatore e da dove vengono questi spostamenti di marker?

 

Colleghi, potreste rispondere alla seguente domanda?
Apro 4 ordini di acquisto a mano, eseguo un EA che cancella gli ordini impostati al prezzo Bid, lo slippage è di 100 pips, la cancellazione in loop, il controllo dell'occupazione del thread e gli aggiornamenti delle quote sono presenti. Perché non vengono cancellati tutti gli ordini nel ciclo? Il log mostra che la cancellazione richiede alcune inizializzazioni della funzione 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);
  }
       

Ecco il registro EA:

17:16:59 temp EURUSD,M1: caricato con successo
17:17:51 temp EURUSD,M1: nuovo tick arrivato
17:17:51 temp EURUSD,M1: ordini totali = 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 a 1,28969 al prezzo 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 at 1.28974 at price 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 a 1,28976 al prezzo 1,28977
17:17:56 temp EURUSD,M1: error=0