Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 913

 

По записи в массив подскажите, плз.

Затык. Надо записывать свежие времена в количестве, например, 5 шт. прихода тиков в статический массив для расчёта среднего значения тик/сек, например, за 5 тиков.

Т.е. записали времена прихода пяти тиков в массив. Далее считать среднюю скорость тика/секунду. 

Как данные в массиве смещать на каждом тике для записи времени  крайнего пришедшего тика в терминал? Как заполнять одномерный статический массив временами прихода тиков? Индексация в массиве организована как в массиве  таймсерии. Можно подсказать текстом или кодом. Пойму. Благодарю.

Так не работает. Массив не заполняется как надо временами прихода тиков.

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); 
Файлы:
 

С частью - разобрался.

Почему принтует нули при записи бида в массив динамический?

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

 

Вопрос решил. Кому надо пользуйтесь.

Как записывать данные в динамический массив.

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

Здравствуйте, торгую на Ренко графике "RenkoLiveChart_v4.13.mq4"

Не могу запустить или открыть сделку через советник на оффлайн графике. 

 
Top2n:

Здравствуйте, торгую на Ренко графике "RenkoLiveChart_v4.13.mq4"

Не могу запустить или открыть сделку через советник на оффлайн графике. 

 

На оффлайн графиках надо эмулировать тики, терминал на них сигнал прихода нового тика не отсылает.

Например вот как в этом скрипте:

#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);
}
 
Всем спасибо - разобрался в чём дело.
 
_Roman:

Вопрос решил. Кому надо пользуйтесь.

Как записывать данные в динамический массив.


Спасибо! Для меня это тёмный лес, лесомассив, лесоповал и т.п. ;)
 
evillive:

На оффлайн графиках надо эмулировать тики, терминал на них сигнал прихода нового тика не отсылает.

Например вот как в этом скрипте:

Есть еще предложения?

Подключаю к оффлайн графику скрипт, терминал виснет. Может можно монтировать код в робота, тогда что делать с #import "user32.dll"

 

Здравствуйте. Помогите пожалуйста. Хотел написать советник: Если открытых сделок нет и цена открытия первого бара меньше цены закрытия первого бара и цена открытия второго бара меньше цены закрытия второго бара, то открываем сделку...     Но советник в тестере начинает открывать сделки одна за другой друг за другом, не могу понять в чем дело. СПС.


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:

Здравствуйте. Помогите пожалуйста. Хотел написать советник: Если открытых сделок нет и цена открытия первого бара меньше цены закрытия первого бара и цена открытия второго бара меньше цены закрытия второго бара, то открываем сделку...     Но советник в тестере начинает открывать сделки одна за другой друг за другом, не могу понять в чем дело. СПС.


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); 
}
Причина обращения: