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

 

Per scrivere su una matrice, per favore consigliate.

L'intoppo. È necessario scrivere i tempi di tick freschi in quantità, per esempio, 5 pz. di ricezione di tick in array statico per il calcolo del valore medio di tick/sec, per esempio, per 5 tick.

Cioè, scrivere i tempi di arrivo di cinque tick nell'array. Poi calcola il tasso medio di tick/secondo.

Come spostare i dati nell'array ad ogni tick per registrare il tempo del tick più recente che entra nel terminale? Come riempire un array statico unidimensionale con i tempi di arrivo dei tick? L'indicizzazione nell'array è disposta come nell'array delle serie temporali. Potete suggerire in testo o in codice. Ho capito. Grazie.

Non funziona così. L'array non viene riempito come necessario con i tempi di tick.

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); 
File:
 

La parte è risolta.

Perché stampa degli zeri quando si scrivono bit in una matrice che è dinamica?

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

 

Il problema è stato risolto. Chiunque abbia bisogno di usarlo.

Come scrivere dati in un array dinamico.

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

Ciao, faccio trading sul grafico Renko "RenkoLiveChart_v4.13.mq4".

Non è possibile eseguire o aprire un trade tramite EA su un grafico offline.

 
Top2n:

Ciao, faccio trading sul grafico Renko "RenkoLiveChart_v4.13.mq4".

Non è possibile eseguire o aprire un trade tramite EA su un grafico offline.

Devo emulare i tick sui grafici offline, il terminale non invia il segnale di arrivo dei tick su di essi.

Per esempio come in questo 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);
}
 
Grazie a tutti - l'ho capito.
 
_Roman:

Il problema è stato risolto. Chiunque abbia bisogno di usarlo.

Come scrivere dati in un array dinamico.


Grazie! Per me è una foresta scura, la matrice della foresta, il disboscamento, ecc. ;)
 
evillive:

Nei grafici offline è necessario emulare i tick, il terminale non invia un segnale di arrivo dei tick.

Per esempio come in questo script:

Altri suggerimenti?

Se collego lo script a un grafico offline, il terminale si blocca. Può essere possibile montare il codice nel robot, poi cosa fare con#import "user32.dll"

 

Salve. Per favore, aiutatemi. Voglio scrivere un EA: se non ci sono operazioni aperte e il prezzo aperto della prima barra è inferiore al prezzo di chiusura della prima barra e il prezzo aperto della seconda barra è inferiore al prezzo di chiusura della seconda barra, allora aprite un accordo... Ma l'EA nel tester inizia ad aprire accordi uno dopo l'altro, non riesco a capire cosa c'è di sbagliato. NON RIESCO A CAPIRE QUAL È IL 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:

Salve. Per favore, aiutatemi. Voglio scrivere un EA: se non ci sono operazioni aperte e il prezzo aperto della prima barra è inferiore al prezzo di chiusura della prima barra e il prezzo aperto della seconda barra è inferiore al prezzo di chiusura della seconda barra, allora aprite un'operazione... Ma l'EA nel tester inizia ad aprire operazioni una dopo l'altra, non riesco a capire cosa c'è di sbagliato. NON RIESCO A CAPIRE QUAL È IL 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); 
}