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

 
Urain:

Предложение заслуживающее внимания,

хотя конечно с точки зрения обычной логики это как левое ухо правой рукой чесать (но это уже не к вам а к разработчикам),

зачем тогда возможность вызвать данные неродного инструмента ?

если всё равно нужно создавать пользовательские индикаторы и вызывать уже их с нужного инструмента, в общем вывод думай башка шапку куплю.

Возможность такого вызова нужна и просто необходима, просто разработчики наверняка не могли предположить такого подхода при написании индюков.

Я про указание инструмента в параметрах пользовательского индюка (а не как положено по ИХ мнению, в параметрах iCustom()).


PS

Приоритет при работе с iCustom() по видимому первоначально был отдан механической торговле, что по факту предполагает, что в эксперте будут учтены некоторые моменты и выполнены определенные действия, а только после этого вызовется iCustom() для пользовательского индюка.

В противном случае все работа и ответственность ложиться на программист реализующего код индюка (что может привести к фатальным ошибкам и последствиям, поскольку излишняя навороченность индюка может привести к тормозам в работе или вылету системы в целом).

 
Urain:

Предложение заслуживающее внимания,

Хотя опять же ну вызову я готовый индикатор на EURе с данными по JPY (истории по йене например не хватает)

а нет там на эту длинну данных и что он мне скажет ??? таже сакмая песня.

Обработать ошибки и узкие места по "родному" инструменту гораздо проще, а предварительный контроль и финальную проверку делаем перед и после вызова в эксперте или индюке запрашивающих данные.

Как я предполагаю есть второй путь, с моей точки зрения в корне не верный. Согласно его логике необходимо создать в индюке одну или несколько функций (вызываемых из калькулятора), рассчитать все необходимое в них и вернуть результат калькулятору.

PS

Но тут вот какое дело - Посчитать количество баров на произвольном инструменте можно. А как быть скажем с другими вещами?

 
Prival:

Баг. Описание. АТС всегда в рынке (переворот удвоенным лотом 0.2)

Режим тестирования все тики. Все нормально.

 

режим тестирования, по ценам открытия. этот же кусок. 

 

почему то разбивается на 2 сделки. может это просто так отображается, но это не правильно. не должно так быть. 

 

Переставьте команды по открытию позиций с командами по закрытию. Должен быть такой порядок

- закрываем позиции

- модифициурем позиции

- открываем позиции

Тогда у вас закрытие и открытие будут на одном и том же баре. 

 
gpwr:

Переставьте команды по открытию позиций с командами по закрытию. Должен быть такой порядок

- закрываем позиции

- модифициурем позиции

- открываем позиции

Тогда у вас закрытие и открытие будут на одном и том же баре. 

У меня нет команды закрытий. только открытие. если в рынке бай 0.1, то я открываю селл 0.2. результат этой операции, в терминале должен быть селл 0.1.причем за одну операцию,  а не две.

Я думаю разработчики поняли про что я говорил. 

 

Я вот написал такой код

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1;
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
     
   int li=rates_total-1;  
   for(int i=0;i<end;i++)
     {      
      I1Buffer[li]=Arr1[i]+0.26;
      I2Buffer[li]=Arr2[i];
      li--;
     }
   return(rates_total);
  }

Вроде работает нормально, но учитывает ли он все что нужно я не знаю.
Если правильно, то вот вам вариант.
Если не правильно, поправьте пожалуйста.

 

А вот у меня и вопрос появился.

Почему вызывая индикатор из советника, значение не совпадает с индикатором.

Тоесть на индюке 1.5123 а советник получает 1.5117

Вот код советника, кроме того во вложении продублированно.

static int Handle;
int bars;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   double buf1[],buf2[];    
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0)Alert("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   Print("Время "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),"   буф1-",buf1[0],"   буф2-",buf2[0]);
  }

и картинка

 

Причем первый буфер, инструмента на котором запущен, совпадает. 

Файлы:
prover.mq5  1 kb
proverka.mq5  2 kb
 
ddd06:

А вот у меня и вопрос появился.

Почему вызывая индикатор из советника, значение не совпадает с индикатором.

Тоесть на индюке 1.5123 а советник получает 1.5117

Вот код советника, кроме того во вложении продублированно.

 

А Вы посомотрите предыдущее значение индикатора. Я подозреваю, что это как раз 1.5117. Текущее (последнее) значение берите по индексу 1. Либо назначьте массивам SetAsSeries(bufX,true)
 
stringo:
А Вы посомотрите предыдущее значение индикатора.
1.512380 - текущее     1.512310 - предыдущее
 
ddd06:

Я вот написал такой код

Вроде работает нормально, но учитывает ли он все что нужно я не знаю.
Если правильно, то вот вам вариант.
Если не правильно, поправьте пожалуйста.

Да всё верно, в моём переработаном варианте тоже есть проверка на длинну массива но я как обычно заблудился в направлениях серий,

и получилось что отрисовка шла но так как длинна массива меньше чем длинна чарта то отрисовка шла от конца и до середины (ну или около того),

вот и создавалось впечатление что отрисовки нет.

ЗЫ Вообще я подозреваю что ещё долго будут в этом месте путаницы возникать,

так как таже проблема была у посетителей mql4.com и теперь перекачёвывает сюда.

 
Urain:

Да всё верно

Замечательно. Помоему получился простой и локаничный код, так что можно его использовать за основу.

На счет советника вопрос - надо писать в Сервисдеск

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.