Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 913

 

Sobre la escritura en un array, por favor, indíquelo.

La dificultad. Es necesario escribir los tiempos de ticks frescos en cantidad, por ejemplo, 5 pcs. de recepción de ticks en el array estático para el cálculo del valor medio de ticks/seg, por ejemplo, para 5 ticks.

Es decir, escribir los tiempos de llegada de cinco ticks en el array. A continuación, calcula la tasa media de tic/segundo.

¿Cómo desplazar los datos en el array en cada tick para registrar la hora del tick más reciente que llega al terminal? ¿Cómo llenar una matriz estática unidimensional con tiempos de llegada de ticks? La indexación en la matriz está dispuesta como en la matriz de series temporales. ¿Puede sugerir en el texto o el código. Lo entiendo. Gracias.

No funciona así. La matriz no se llena como es necesario con los tiempos de tic.

int limit; //pBars;  
   int counted_bars=IndicatorCounted(); 
    //ArraySetAsSeries
 //---- последний посчитанный бар будет пересчитан
   if(counted_bars>0) counted_bars--;  
   limit=counted_bars;  
   for(int i=limit; i>=0; i--) { xBuffer[i+1] = xBuffer[i]; xBuffer_Time[i+1] = xBuffer_Time[i];}

   xBuffer[0] = iClose(symbol,1,0);
   xBuffer_Time[tickCounter_Current] = NormalizeDouble((iTime (_Symbol,1,0)-_start), 2); 
   tickCounter_Current ++;  
   tickCounter=tickCounter+1;
   
   if (tickCounter_Current == Num_Aver_of_Ticks)    
       tickCounter_Current = 0;   
       
   for ( i = 0; i < Num_Aver_of_Ticks; i ++) Summ_Time = Summ_Time + xBuffer_Time[i];
       
   if (Num_Aver_of_Ticks != 0)
   avgSpd = NormalizeDouble(Summ_Time / Num_Aver_of_Ticks, 2); 
Archivos adjuntos:
 

La parte está resuelta.

¿Por qué se imprimen ceros cuando se escriben bits en un array que es dinámico?

//---------------------
extern int MaxDrawTicks=100;
extern int Num_Aver_of_Ticks=5;  
double     xBuffer_Time []; // Массив значений  
                         // В котором индекс - номер тика, значение - это бид 
int SIZE=0;               // Вспомогательная переменная для массива                                  
int tickCounter, tickCounter_Current; 
//+------------------------------------------------------------------+
int init()
  {   
//--- устанавливаем размер динамического массива
   if(ArrayResize(xBuffer_Time,SIZE)<0) {Print(" Ошибка в изменении размера массива времени поступления тиков "); return(false);}
//--- установим индексацию для буфера как в таймсерии для динамического массива
  // ArraySetAsSeries(xBuffer_Time,true);    
//---   Возвращает количество элементов указанного массива. 
   SIZE=ArraySize(xBuffer_Time);
   if (SIZE>=0) Print("Размер массива: ",SIZE);
   else Print("Ошибка. Массив не создан ",SIZE);        
   ArrayInitialize(xBuffer_Time, 0);
   return(0);
  }  
//+------------------------------------------------------------------+
int start()
  {  
   //ArrayResize(ValueArr,size);
   //ValueArr[size-1] = GetValue();
   //size++; 
 //----------------------------------------  
   ArrayResize(xBuffer_Time,SIZE);
   xBuffer_Time[SIZE-1] = Bid; //NormalizeDouble((iTime (_Symbol,1,0)-_start), 2); 
   SIZE ++;
   Print (" Значение xBuffer_Time[SIZE-1] = ", DoubleToStr(xBuffer_Time[SIZE-1],Digits) );
   Print (" Значение SIZE = ", DoubleToStr(SIZE,2) );  
 //---------------------------------------      
//------------
   return(0);
  }

 

El problema se ha resuelto. Quien necesite usarlo.

Cómo escribir datos en un array dinámico.

//---------------------
extern int MaxDrawTicks=100;
extern int Num_Aver_of_Ticks=5;  
double     xBuffer_Time []; // Массив значений   динамический
                            // В котором индекс - номер тика, значение - это бид 
int SIZE=0;                 // Вспомогательная переменная для массива                                  
int tickCounter, tickCounter_Current; 
//+------------------------------------------------------------------+
int init()
  {   
//--- устанавливаем размер динамического массива
   if(ArrayResize(xBuffer_Time,2000000)<0) {Alert(" Ошибка в изменении размера массива времени поступления тиков "); return(false);}
//--- установим индексацию для буфера как в таймсерии для динамического массива
  // ArraySetAsSeries(xBuffer_Time,true);    
//---   Возвращает количество элементов указанного массива. 
   int S=ArraySize(xBuffer_Time);
   if (S>=0) Alert("Размер массива: ",S);
   else Print("Ошибка. Массив не создан ",S);        
   ArrayInitialize(xBuffer_Time, 0);
   return(0);
  }  
//+------------------------------------------------------------------+
int start()
  {  
   //ArrayResize(ValueArr,size);
   //ValueArr[size-1] = GetValue();
   //size++; 
 //----------------------------------------  
   ArrayResize(xBuffer_Time,SIZE);
   xBuffer_Time[SIZE-1] = Bid; //NormalizeDouble((iTime (_Symbol,1,0)-_start), 2); 
  
   if ( SIZE >= 0 && ArraySize(xBuffer_Time) < 2147483647)
      {
      Alert (" Значение xBuffer_Time[SIZE-1] = ", DoubleToStr(xBuffer_Time[SIZE-1],Digits) );
      Alert (" Значение SIZE = ", DoubleToStr(SIZE,2) );  
      } 
    SIZE ++;   
 //---------------------------------------      
//------------
   return(0);
  }
 

Hola, opero en el gráfico Renko "RenkoLiveChart_v4.13.mq4".

No se puede ejecutar o abrir una operación a través de EA en el gráfico fuera de línea.

 
Top2n:

Hola, opero en el gráfico Renko "RenkoLiveChart_v4.13.mq4".

No se puede ejecutar o abrir una operación a través de EA en el gráfico fuera de línea.

Tengo que emular los ticks en los gráficos offline, el terminal no envía señal de llegada de ticks en ellos.

Por ejemplo, como en este script:

#include <WinUser32.mqh>

#import "user32.dll"


//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
    int whdl=WindowHandle (Symbol(), Period());    
        while(!IsStopped())
         {
                PostMessageW (whdl, WM_COMMAND, 33324, 0);
                Sleep(100);
         }
        return(0);
}
 
Gracias a todos, lo he resuelto.
 
_Roman:

El problema se ha resuelto. Quien necesite usarlo.

Cómo escribir datos en un array dinámico.


Gracias. Para mí es un bosque oscuro, un conjunto de bosques, una tala de árboles, etc. ;)
 
evillive:

En los gráficos offline es necesario emular los ticks, el terminal no les envía una señal de un nuevo tick.

Por ejemplo, como en este script:

¿Alguna otra sugerencia?

Conecto el script a un gráfico sin conexión, el terminal se cuelga. Puede ser posible montar el código en el robot, entonces qué hacer con#import "user32.dll"

 

Hola. Por favor, ayuda. Quiero escribir un EA: Si no hay operaciones abiertas y el precio de apertura de la primera barra es menor que el precio de cierre de la primera barra y el precio de apertura de la segunda barra es menor que el precio de cierre de la segunda barra, entonces abre una operación... Pero el EA en el probador comienza a abrir las operaciones una tras otra, no puedo entender lo que está mal. NO PUEDO ENTENDER CUÁL ES EL PROBLEMA.


int init;

int start()
{

int bar1;
int bar2;
int   stoploss=100; 
int   takeprofit=100;
int       slipage=2;
int total;
//-------------------------------------------------------------------+
  
  if ( OrdersTotal()<1 &&  Open[bar1]>Close[bar1] && Open[bar2]>Close[bar2])
    
     {OrderSend("EURUSD",OP_BUY,0.1,Ask,slipage,Ask-stoploss*Point,Ask+takeprofit*Point,"",123,0,Red);}
     
    //-------------------------------------------------------------------+  
     
                   
 
 return;}
 
rylay:

Hola. Por favor, ayuda. Quiero escribir un EA: Si no hay operaciones abiertas y el precio de apertura de la primera barra es menor que el precio de cierre de la primera barra y el precio de apertura de la segunda barra es menor que el precio de cierre de la segunda barra, entonces abre una operación... Pero el EA en el probador comienza a abrir las operaciones una tras otra, no puedo entender lo que está mal. NO PUEDO ENTENDER CUÁL ES EL PROBLEMA.


int init;

int start()
{

int bar1;
int bar2;
int   stoploss=100; 
int   takeprofit=100;
int       slipage=2;
int total,ticket;

//-------------------------------------------------------------------+
  
  if ( OrdersTotal()<1 &&  Open[bar1]>Close[bar1] && Open[bar2]>Close[bar2])
      if(V1()==true) 
     {
       ticket = OrderSend("EURUSD",OP_BUY,0.1,Ask,slipage,Ask-stoploss*Point,Ask+takeprofit*Point,"",123,0,Red);
      }
     
    //-------------------------------------------------------------------+                    
 return;}
//+------------------------------------------------------------------+
bool V1(){
  int      i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if (OrderType()==OP_BUY) {
      return(false);
   }
  }    
 }
 return(true); 
}

bool V2(){
  int      i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
     if(OrderType()==OP_SELL) {
      return(false);
   }
  }
 }
 return(true); 
}