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

 
Interesting:

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

PS

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

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


Если вывести например EURUSD на EURUSD или EURJPY на EURJPY то все отлично работает.

Стало быть направление вывода вроде как верно.

Я тут множество вариантов перепробовал и даже так:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,Counted_bars,Buf_0);

Все равно ни чего не выходит.

Может у кого нибудь есть пример вывода двух разных инструментов на один экран, хоть как нибудь?

 
gisip:

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

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


В обрезанном виде работает. Добавьте проверки и экономику.

#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);
   ArraySetAsSeries(ArrayBuffer,true);
   ArraySetAsSeries(ScreenBuffer,true);
   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;

//--------------------------------------------------------------------
   copied=(int)SeriesInfoInteger(InstrumentName,0,SERIES_BARS_COUNT);
   copied=CopyClose(InstrumentName,PERIOD_M1,0,copied,ArrayBuffer);//-- Записать данные в буффер памяти --

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }

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



 
gisip:

Если вывести например EURUSD на EURUSD или EURJPY на EURJPY то все отлично работает.

Стало быть направление вывода вроде как верно.

Я тут множество вариантов перепробовал и даже так:

handle1=iMA(InstrumentName,PERIOD_CURRENT,ex_Period_MA_1,0,MODE_SMA, PRICE_CLOSE);

...

copied=CopyBuffer(handle1,0,0,Counted_bars,Buf_0);

Все равно ни чего не выходит.

Может у кого нибудь есть пример вывода двух разных инструментов на один экран, хоть как нибудь?

Исходник для MQL4 есть?


Я уже предложил альтернативу, которая заключается в том чтобы сделать индюк по текущему инструменту и отладить его на все 100%. После чего спокойно вызывать с нужными параметрами в эксперте или другом индюке.

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

Да и по большому счету такая концепция насколько я понимаю не очень "правильная" (мягко говоря).


PS

Короче тут есть два варианта:

1. Реализовать все для текущего ТФ и инструмента и проверить работоспособность. после чего юзать индюк при помощи iCustom();

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

Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Доступ к таймсериям и индикаторам / Bars - Документация по MQL5
 
gisip:
Поменял, все равно не работает, график  не соответствует действительности.

Сделайте так в своем индикатора

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

   IndicatorSetString(INDICATOR_SHORTNAME,InstrumentName);
   SetIndexBuffer(0,ScreenBuffer,INDICATOR_DATA);
   ArraySetAsSeries(ScreenBuffer,true);
   
   return 0;                          // Выход
  }

и почитайте раздел Направление индексации в массивах и таймсериях

 
DC2008:

В обрезанном виде работает. Добавьте проверки и экономику.

Вот эти две вещи тоды там и нафиг не нужны

//1

//-- Динамический буфер --
double ArrayBuffer[];
...............
ArraySetAsSeries(ArrayBuffer,true);

//2

   for(int i=0; i<copied; i++)
     {
      ScreenBuffer[i]=ArrayBuffer[i];
     }

 
Interesting:

Вот эти две вещи тоды там и нафиг не нужны

Вобще-то да.
 

Да, вроде получилось!

ВСЕМ огромное спасибо!!!

Буду тестировать дальше.


 

Нужна визуализация сделок. Советник мультивалютный. Допустим висит на EURUSD и открывает сделки на других валютных парах. У меня есть разница в результатах, понимаю что это мой косяк, но никак не могу проверить (не могу открыть график со сделками по AUDUSD когда эксперт висит на EURUSD).

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

Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
Операции с графиками / ChartOpen - Документация по MQL5
 

7.При тестировании Exp_TEMA.mq5, выражения Told[]  Tnew[1]получают следующие значения:
    Told[]      Expression could not be evaluated
    Tnew[1]   Invalid array range.
Что обозначают данные значения, и как они влияют на результат работы эксперта?

 8.Почему Exp_TEMA.mq5, при тестировании, открывает сделки внутри бара?

9.Приведет ли к сокращению кода,  сокращению времени исполнения сделки, уменьшению проскальзывания, сокращению издержек(комиссии и пр.), если вместо закрытия позиции и открытия позиции в противоположном направлении, делать переворот, т.е открытие позиции в противоположном направлении с двойным объемом ?

Сделки внутри бара. 

 

 
ias:

7.При тестировании Exp_TEMA.mq5, выражения Told[]  Tnew[1]получают следующие значения:
Told[]      Expression could not be evaluated
Tnew[1]   Invalid array range.
Что обозначают данные значения, и как они влияют на работу эксперта?

 

По Tnew[1]   Invalid array range - похоже это выход за приделы диапазона. Не забывайте что нумерация элементов массива начинается с 0!