Обсуждение статьи "Создание эксперта, торгующего на разных инструментах" - страница 3

 

6.Похоже, не хватает:

TradePerformer( 4, Symb4,  Trade4,  StLoss4,  TkProfit4,  Lots4,  Slippage4,  UpSignal, DnSignal, UpStop, DnStop);

 в Exp_TEMA.mq5 ? 

 
ias:

6.Похоже, пропущено

 в Exp_TEMA.mq5 ? 

Да! Видать совсем заработался и перегрелся на такой аномальной жаре!
 
Renat:

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

Без этого мало кто поймет о чем речь.

Думал сократить чтобы зря не отрывать людей от дела.

Вот полный вариант:

#property indicator_separate_window    // Индик. рисуется в отдельном окне
#property indicator_buffers 1



#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Aqua

input string InstrumentName = "EURJPY";

//-- Индикаторный массив
double ScreenBuffer[]; 

//-- Динамический буфер --
double ArrayBuffer[];

int OnInit()                          // Специальная функция init()
{
//--------------------------------------------------------------------

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   return 0;                          // Выход
}
//--------------------------------------------------------------------
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[])
{
int Counted_bars;   // Количество баров для работы 
int copied;

//--------------------------------------------------------------------
   //1 вход   rates_total = 9667 / prev_calculated = 0 / Bars = 9667
   //-- потом rates_total = 9667 / prev_calculated = 9667 / Bars = 9667
   //-- в процессе работы потом rates_total = 9668 / prev_calculated = 9667 / Bars = 9668
   //Print("rates_total: " + (string)rates_total);
   if (rates_total == prev_calculated) return (rates_total);//-- Это все тот же бар, поэтому выходим --

   //-- Получить кол-во необработанных баров (при первом входе это все, потом 1)
   //-- Кол-во выводимых баров относятся к самому графику но выводить то мы будем другой инструмент
   //-- там кол-во баров может быть другое и по этому сначала скидываем все данные в буфер --
   Counted_bars = rates_total-prev_calculated;
   
   //   Print("Counted_bars: " + Counted_bars);
   Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));
   //-- Выделяем память по кол-ву баров основного инструмента --
   if (ArrayResize(ArrayBuffer, Counted_bars,0) == -1) return (rates_total);//-- Ошибка выделения памяти --
   //--- инициализируем элементы массива значением EMPTY_VALUE ---
   ArrayInitialize(ArrayBuffer,EMPTY_VALUE);
         
   //-- Получить сколько реально баров есть у этого инструмента --
   copied = (int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   
   if (copied > 0){
      copied=CopyClose(InstrumentName,0,0,copied,ArrayBuffer);//-- Записать данные в буффер памяти --
      if (copied <= 0) return (rates_total);//-- ошибка
   } 
   else{

      return (rates_total);//-- ошибка  
   }
    
   if (Counted_bars > copied) Counted_bars = copied;//-- Берем меньшее значение --

   Counted_bars--;//-- Так как отсчет от 0 --
   //-- Данные загружены в буфер памяти, теперь записать их в буфер экранный справа налево --
   for (int i = Counted_bars; i > 0; i--){
      ScreenBuffer[i] = ArrayBuffer[i];
   }   
   
//--------------------------------------------------------------------
   return(rates_total);
}


void OnDeinit(const int reason)
{
   ObjectsDeleteAll(0,0,-1);             // удаляются все объекты с графика.
}
 

Что я делаю не так, почему не получается вывести нормально график другого инструмента ?

на MQL4 все работало, тут только если на тот же инструмент выводишь то тогда без ошибок.


 
gisip:

Что я делаю не так, почему не получается вывести нормально график другого инструмента ?

на MQL4 все работало, тут только если на тот же инструмент выводишь то тогда без ошибок.


Не уверен в правильности реализации и алгоритма в целом, но исходя из кода и того что я с ним смог сделать предположу что:

Строка

//   Print("Counted_bars: " + Counted_bars);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(Symbol(),0));

должна выглядеть так

//   Print("Counted_bars: " + Counted_bars);
Print("rates_total: " + rates_total + "   /   prev_calculated: " + prev_calculated + "   /   Bars: " + Bars(InstrumentName,Period()));


Возможно везде период в виде "0" будет правильней сменить на PERIOD_CURRENT.

По крайней мере у меня все заработало после таких изменений....

PS

Возможно, это к делу не относиться, но так компилятор МАТЕРИТЬСЯ гораздо меньше

Print("rates_total: ",rates_total," / prev_calculated: ",prev_calculated," / Bars: ",Bars(InstrumentName,PERIOD_CURRENT));
 
Interesting:

Не уверен в правильности реализации и алгоритма в целом, но исходя из кода и того что я с ним смог сделать предположу что:

Строка

должна выглядеть так

PS

Возможно везде период в виде "0" будет правильней сменить на PERIOD_CURRENT.

По крайней мере у меня все заработало после таких изменений....

Поменял, все равно не работает, график  не соответствует действительности.
 

У меня на экране вот так выглядит:


Явно что не правильно.

 

У меня вот так вышло

Но поскольку в логику индюка и реализацию его я не вдавался о правильности результатов судить не мне.


PS

Я бы всеж избавился от символа в параметре и сделал его по текущему символу и TФ, после чего юзал в эксперте или другом индюке при помощи обычного iCustom().

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


Файлы:
proba.mq5  4 kb
 
Interesting:

У меня вот так вышло

Но поскольку в логику индюка и реализацию его я не вдавался о правильности результатов судить не мне.


PS

Я бы всеж избавился от символа в параметре и сделал его по текущему символу и TФ, после чего юзал в эксперте или другом индюке при помощи обычного iCustom().


Спасибо за совет, буду пробовать.
 

Interesting:

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


Я бы всеж обратил внимание на алгоритм работы с буферами. если я все правильно понял там одного буфера вполне хватит (просто его правильно нужно рассчитать и отрисовывать на графике).

PS

А при текущем варианте у меня складывается впечатление о том, что индюк отображает "левые" данные (самое начало истории) вместо "правых" (текущих)...

Ну или я тоды вообще не чего не пойму в логике этого индюка...


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