Ошибки, баги, вопросы - страница 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

Выше код индикатора Spread_of_symbols...я его решил переделать чтобы он работал быстрее....и получился код см ниже...данные не копируются...если в коде копировать данные начиная не с 0 , а с 1 то индикатор рисует очень быстро но выходит ошибка аут оф рэндж...что не так в коде см ниже...?

 

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) 
      to_copy++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }
 
FinEngineer:
 Посмотрите Справочник MQL5 / Доступ к таймсериям и индикаторам / Организация доступа к данным
 
FinEngineer: но выходит ошибка аут оф рэндж...что не так в коде см ниже...? 
 Посмотрите, насколько соответствуют друг другу значения переменных to_copy и limit.
 
В режиме визуализации при торговле на двух символах после закрытия сделок в одно время в историю попадают данные только с символа на котором запущен эксперт. С другого символа данные попадают на вкладку историю только после открытия следующих сделок. В результате есть период времени когда данные на вкладке торговля и история различны.
 
JF 0 Trades 19:31:10 '***': cancel order #3694236 buy stop 1.10 AUDJPY.m at 95.679
DS 0 Trades 19:31:10 '***': cancel order #3694238 buy limit 1.10 AUDJPY.m at 93.876
DH 0 Trades 19:31:10 '***': cancel order #3694237 buy stop 0.36 AUDJPY.m at 95.679
FI 0 Trades 19:31:10 '***': cancel order #3694239 buy limit 0.36 AUDJPY.m at 93.876
FP 0 Trades 19:31:10 '***': cancel order #3694236 buy stop 1.10 AUDJPY.m at 95.679 done
QE 0 Trades 19:31:11 '***': cancel order #3694238 buy limit 1.10 AUDJPY.m at 93.876 done
CG 0 Trades 19:31:11 '***': cancel order #3694237 buy stop 0.36 AUDJPY.m at 95.679 done
OL 0 Trades 19:31:11 '***': cancel order #3694239 buy limit 0.36 AUDJPY.m at 93.876 done

 Четыре отложенных ордера, по журналу, вроде как удалились быстро. Но в OnTradeTransaction ответы пришли, где-то через 15 сек, тики в этот период исправно приходили.

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 Удаление sl _ OnTrade PENDING id=84 m=3 b/s=SELL Err=Заявка выполнена
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Удаление tp _ OnTrade PENDING id=85 m=3 b/s=SELL Err=Заявка выполнена
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Удаление sl _ OnTrade PENDING id=86 m=3 b/s=SELL Err=Заявка выполнена
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Удаление tp _ OnTrade PENDING id=87 m=3 b/s=SELL Err=Заявка выполнена 

Хотя, тут тоже что-то странно

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= Deal закрытие/разворот price=95.648 m=3 b/s=SELL ...   ==>Время перед OrderSendAsync
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 case 8(real) m=3 b/s=SELL Err=Ордер размещён                    ==>после выполнения  OrderSendAsync, 3 сек как-то многовато кажись.

P.S. Походу были тормоза с выполнением эксперта, хотя интересно, сколько времени пакеты для  OnTradeTransaction могут держаться в очереди. 

 
fyords:

Из справки:

Справочник MQL5 / Стандартная библиотека / Классы для создания панелей и диалогов / CWnd / StateFlagsSet

Каких свойств?

StateFlagsSet не свойств, а состояния. Метод группового изменения состояния. Чуть выше методы изменения отдельных флагов состояния.

Пользуйте отдельно.

 

Посмотрел "организацию доступа к данным", посмотрел скрипт-пример который подкачивает данные и все понял, возникли следующие вопросы:

1. Почему я не могу в индикаторе в функции OnInit прописать этот код, чтобы при запуске индикатор сам себе подкачал историю и подготовил таймсерии? Могу ли я прописывать в советнике подобную проверку?   

2. Как часто надо делать подобную проверку для: 1 советников, 2 индикаторов? Если я всего один раз подготовлю историю и таймсерии для копирования то в дальнейшем не будут возникать ошибки при копировании? Или мне придется каждый раз или периодически проверять готовность истории и таймсерий?

3. Эта проверка необходима только для индикаторов и советников, в которых используются несколько таймфреймов и символов, или желательна во всех подряд? 

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Процессы подкачки асинхронны, а индикатор не имеет права ждать данных. Поэтому в ините можно запросить, ни в коем случае не ждать и не тормозить и только в онкалкулейте проверять наличие и считать.

Обратите внимание - индикатор не имеет права ждать или циклиться, иначе он убьет расчет последующих индикаторов.
 
Renat:
Процессы подкачки асинхронны, а индикатор не имеет права ждать данных. Поэтому в ините можно запросить, ни в коем случае не ждать и не тормозить и только в онкалкулейте проверять наличие и считать.

Обратите внимание - индикатор не имеет права ждать или циклиться, иначе он убьет расчет последующих индикаторов.

 1 Так где же мне тогда подкачку осуществить данных? Если я хочу индикатор сделать в котором будет корзина из вал пар, много символов...по каждому из них надо будет сделать проверку и подкачать данные...мне что из индикатора запускать скрипт что-ли?  Почему один индикатор убьет расчеты последующих? Достаточно использовать в последующих индикаторах проверку на рассчет предыдущего индикатора через BarsCalculated(indicator1_Handle), пускай себе считается и данные подкачивает, или я не прав?  

2 И еще такой вопрос, другого характера, когда я объявляю хэндл индикатора в функции он инит, тогда он начинает считаться? Или он начинает считаться перед тем как я дал команду на его копирование?

Причина обращения: