Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 328

 

Salve, voglio ottenere una data di scadenza per i futures

EXPIRATION=(datetime)SymbolInfoInteger(Symbol(),SYMBOL_EXPIRATION_TIME);

Dà 1970 01 01 00 00

 

Salve, qualcuno può consigliarmi come fare in modo che un EA apra un ordine in un certo punto del grafico quando si clicca su un certo punto? Quando si installa uno script o un EA, la funzione NormalizeDouble(WindowPriceOnDropped(),Digits); definisce il punto quando si clicca il mouse. Ma la questione è che questo può essere fatto in qualsiasi momento da un EA in esecuzione. Esiste una tale possibilità.

Vedo una funzione ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE,0,1) Non so ancora come usarlo, è possibile determinare dove (in quale punto) è stato diretto il puntatore del mouse?

 
Basicprof:

Salve, qualcuno può consigliarmi come fare in modo che un EA apra un ordine in un certo punto del grafico quando si clicca su un certo punto? Quando si installa uno script o un EA, la funzione NormalizeDouble(WindowPriceOnDropped(),Digits); definisce il punto quando si clicca il mouse. Ma la questione è che questo può essere fatto in qualsiasi momento da un EA in esecuzione. Esiste una tale possibilità.

Vedo una funzione ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE,0,1) Ma non ho ancora capito come usarlo: è possibile determinare dove (in quale punto) è stato diretto il puntatore del mouse?

Usa l'evento "CHARTEVENT_CLICK".

Potete ottenere parti del codice da qui

 
Vitaly Muzichenko:

Usare l'evento click "CHARTEVENT_CLICK".

Puoi ottenere i frammenti di codice da qui


Grazie mille!!!

 

Un'altra domanda: ho spostato le funzioni nella libreria dall'EA, quando eseguo l'EA, si blocca immediatamente e i messaggi mostrano che il terminale non può caricare la libreria Impossibile chiamare 'ATP_funkcii.mq4::DrawLABEL', 'ATP_funkcii.mq4' non è caricato

Come posso risolvere questo problema?

Ho notato una cosa! L'editor dell'EA e la libreria possono essere visti, ma sul computer, non li vedo nei file del programma per qualche motivo. Solo il file Expert Advisor.

 
Ciao, potresti dirmi come conoscere l'indice del prossimo elemento di un array?
 
vikzip:
Ciao, Potresti per favore dirmi come conoscere l'indice di un elemento dell'array per conoscere l'indice del prossimo elemento dell'array?

L'indice di qualsiasi array inizia sempre con zero. Cioè, se la dimensione della matrice è 1, l'indice di questa cella sarà 0.

Come si fa a conoscere il numero 5 per conoscere il numero 6?

Conoscendo la cifra 6, come faccio a conoscere la cifra 7, sapendo che ci sono solo 8 cifre?

Conoscendo l'indice 7, come si fa a sapere l'indice successivo, sapendo che la dimensione dell'array = 8?

 

Ciao, ho bisogno di aiuto. L'indicatore non si aggiorna, voglio che si aggiorni ad ogni tick.


//+------------------------------------------------------------------+
//|                                             alx_RSI_BANDS_MA.mq4 |
//|                                                       alx_Babon |
//+------------------------------------------------------------------+
#property copyright "alx_Babon"
#property link      "babon82@gmail.com"

#property indicator_separate_window
#property indicator_buffers 6
#property  indicator_color1 Yellow
#property  indicator_color2 DarkBlue
#property  indicator_color3 White
#property  indicator_color4 White
#property  indicator_color5 White
//---- input parameters
extern int       RSI_Per=8;
extern int       MA_Per=8;
extern int       Bands_Per=20;
extern int       SmoothType=0;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double Sostoyanie;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   string type;
   switch(SmoothType)
   {
   case MODE_EMA: type="EMA";break;
   case MODE_SMMA: type="SMMA";break;
   case MODE_LWMA: type="LWMA";break;
   default: type="LWMA";SmoothType=0;break; // если ни один вариант не подошел
   }

   SetIndexStyle(0,DRAW_LINE,0,1);
   SetIndexBuffer(0,ExtMapBuffer1);//Свойства RSI
   SetIndexLabel(0,"RSI("+RSI_Per+")");
   SetIndexStyle(1,DRAW_LINE,0,2);
   SetIndexBuffer(1,ExtMapBuffer2);//Свойства MA
   SetIndexLabel(1,"MA ("+MA_Per+"), "+type);
   SetIndexStyle(2,DRAW_LINE,2,1);
   SetIndexBuffer(2,ExtMapBuffer3);//Свойства Bands
   SetIndexLabel(2,"Bands ("+Bands_Per+")");
   SetIndexStyle(3,DRAW_LINE,2,1);
   SetIndexBuffer(3,ExtMapBuffer4);//Свойства Bands
   SetIndexLabel(3,"Bands ("+Bands_Per+")");
   SetIndexStyle(4,DRAW_LINE,2,1);
   SetIndexBuffer(4,ExtMapBuffer5);//Свойства Bands
   SetIndexLabel(4,"Bands ("+Bands_Per+")");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit,cnt;
   int cnt_rsi,cnt_bb,cnt_ma;
   if (counted_bars==0) 
      {
      limit=Bars-RSI_Per-1;
      for(cnt=limit;cnt>=0;cnt--)
         {
          ExtMapBuffer1[cnt]=iRSI(NULL,0,RSI_Per,PRICE_CLOSE,cnt);
         }
      for(cnt=1;cnt<=Bars;cnt++)
         {
          ExtMapBuffer6[cnt]= iMA(NULL,0,MA_Per,0,SmoothType,PRICE_CLOSE,cnt);
                
         }
      for(cnt=limit-MA_Per;cnt>=0;cnt--)
         {
          ExtMapBuffer2[cnt]=iMAOnArray(ExtMapBuffer1,0,MA_Per,0,SmoothType,cnt);
         }          
      for(cnt=limit-Bands_Per;cnt>=0;cnt--)
         {
          ExtMapBuffer3[cnt]=iBandsOnArray(ExtMapBuffer1,0,Bands_Per,2,0,MODE_LOWER,cnt);
         }
      for(cnt=limit-Bands_Per;cnt>=0;cnt--)
         {
          ExtMapBuffer4[cnt]=iBandsOnArray(ExtMapBuffer1,0,Bands_Per,2,0,MODE_UPPER,cnt);
         }  
      for(cnt=limit-Bands_Per;cnt>=0;cnt--)
         {
          ExtMapBuffer5[cnt]=iBandsOnArray(ExtMapBuffer1,0,Bands_Per,2,0,MODE_MAIN,cnt);
         } 
         
      }
      cnt_rsi=limit;
      cnt_bb=limit-Bands_Per;
      cnt_ma=limit-MA_Per;
      Comment(
               "RSI (",RSI_Per,")=",ExtMapBuffer1[1],"\n",
          "Bolinger (",Bands_Per,")=",ExtMapBuffer5[1],"\n",
                "MA (",MA_Per,")=",ExtMapBuffer2[1],"\n"
                //,"MA CNT (",MA_Per,")=",ExtMapBuffer6[8],"\n"
                //,"CNT_MA (",cnt_ma,")"
             );
//----
      //ObjectCreate("Arrow", OBJ_ARROW, 0, 0, 5);
      //ObjectSet("Arrow",OBJPROP_ARROWCODE,OBJ_PERIOD_M15 | OBJ_PERIOD_H1);
      //ObjectSetText("PivotText", "Pivot Point (DJ)", fontsize, "Arial", 
                 //colorPivot);
//----
   return(0);
  }
//+---------------------------------------

 
Artyom Trishkin:

L'indice di qualsiasi array inizia sempre con zero. Cioè, se la dimensione dell'array è 1, allora l'indice di quella cella sarà 0.

Come si fa a conoscere il numero 5 per conoscere il numero 6?

Come si fa a conoscere la cifra 6 per conoscere la cifra 7, sapendo che ci sono solo 8 cifre?

Come, conoscendo l'indice 7, come possiamo trovare l'indice successivo, sapendo che la dimensione dell'array = 8?


Grazie per la spiegazione dettagliata )))) Quindi sarebbe corretto scrivere


double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas,WHOLE_ARRAY,0,MODE_DESCEND);                           // Теперь цены открытия упорядочены по убыванию
     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

       int Blizko1; 

Mas[Blizko1]= Blizko2+1;     Это верно??

                                                      //Определен индекс ближайшего меньшего по значению елемента к текущей цене         PriceBlizko1=Mas[Blizko1];
Puoi dirmelo per favore?

 
vikzip:

Grazie per la spiegazione dettagliata)))) Quindi sarebbe corretto scrivere


Puoi dirmelo per favore?

Non c'è bisogno di ordinare l'array dopo ogni aggiunta di un elemento dell'array. Sarebbe meglio spostare l'ordinamento

double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);                                                 //задан размер массива
       Mas [i] = Price; 
     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
       ArraySort (Mas,WHOLE_ARRAY,0,MODE_DESCEND);                           // Теперь цены открытия упорядочены по убыванию
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
             PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера

       int Blizko1; 
        Mas[Blizko1]= Blizko2+1;     Это верно??
                                                      //Определен индекс ближайшего меньшего по значению елемента к текущей цене
        PriceBlizko1=Mas[Blizko1];

Dalla guida.

Valore di ritorno

Restituisce l'indice del primo elemento trovato. Se il valore cercato non viene trovato, restituisce l'indice del più vicino minore degli elementi tra i quali si trova il valore cercato.

Mas[Blizko2] è il valore più piccolo più vicino nell'array.

Motivazione: