Moving Average с периодом 1 - страница 2

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

Не понял.
В ArrayCopySeries можно копировать только
MODE_OPEN   0   Open price. 
MODE_LOW    1     Low price. 
MODE_HIGH    2    High price. 
MODE_CLOSE   3   Close price. 
MODE_VOLUME   4   Volume, used in Lowest() and Highest() functions. 
MODE_TIME    5   Bar open time, used in ArrayCopySeries() function. 


так в хелпе написано.
Как копировать из индикаторного массива непонятно.

Собственно я хотел узнать можно ли вот так написать индикатор:

//+------------------------------------------------------------------+
//|                                                       MIndex.mq4 |
//|                                  Copyright © 2005, Yuri Makarov. |
//|                                       http://mak.tradersmind.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Yuri Makarov."
#property link      "http://mak.tradersmind.com"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 OrangeRed

extern string Curency = "USD";

double EurUsd[],UsdChf[],GbpUsd[],UsdJpy[],AudUsd[],UsdCad[];
double Idx[];

int init()
{
   IndicatorShortName(Curency);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,Idx);
   
   ArrayCopySeries(EurUsd,MODE_CLOSE,"EURUSD");
   ArrayCopySeries(GbpUsd,MODE_CLOSE,"GBPUSD");
   ArrayCopySeries(AudUsd,MODE_CLOSE,"AUDUSD");
   ArrayCopySeries(UsdChf,MODE_CLOSE,"USDCHF");
   ArrayCopySeries(UsdJpy,MODE_CLOSE,"USDJPY");
   ArrayCopySeries(UsdCad,MODE_CLOSE,"USDCAD");

   return(0);
}

void start()
{
   int counted_bars=IndicatorCounted();
   double USD;

   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   
   for(int i=0; i<limit; i++)
   if (UsdChf[i]*UsdJpy[i]*UsdCad[i]*EurUsd[i]*GbpUsd[i]*AudUsd[i] > 0)
   {
      USD = MathPow(UsdChf[i]*UsdJpy[i]*UsdCad[i]/EurUsd[i]/GbpUsd[i]/AudUsd[i],1./7.);
      if (Curency == "USD") Idx[i] = USD; 
      if (Curency == "EUR") Idx[i] = USD*EurUsd[i];
      if (Curency == "GBP") Idx[i] = USD*GbpUsd[i];
      if (Curency == "AUD") Idx[i] = USD*AudUsd[i];
      if (Curency == "CHF") Idx[i] = USD/UsdChf[i];
      if (Curency == "JPY") Idx[i] = USD/UsdJpy[i];
      if (Curency == "CAD") Idx[i] = USD/UsdCad[i];
   }
}


У меня с этим индикатором и другие проблемы есть.
Причем эти проблемы были когда ArrayCopySeries вызывались на каждом тике.
В этой версии пока еще не видел.

Например такое ощущение, что не все данные по другим парам подкачиваются, если листать в начало чарта. Индикатор при этом показывает неправильные значения.
Поэтому я и спрашивал раньше, нельзя ли задавать в скрипте явно требуемую глубину истории. (мне ответили что этого не будет)

 
говоря о применении ArrayCopySeries к индикаторному массиву, я имел в виду примерно следующее
double CloseBuffer[];
...
int init()
{
   SetIndexBuffer(0,CloseBuffer);
   ...
}
int start()
{
   ...
   ArrayCopySeries(CloseBuffer,MODE_CLOSE,another_symbol,Period());
   ...
}


то есть я провёл прямое копирование таймсерии чужого инструмента в свой самый первый индикаторный массив

в Вашем индикаторе практически всё правильно, за исключением того, что ArrayCopySeries необходимо перенести в функцию init. во-вторых, в Вашем вызове ArrayCopySeries не хватает четвёртого параметра - периода.

 
С индикаторным массивом понял,
спасибо.
в Вашем индикаторе практически всё правильно, за исключением того, что ArrayCopySeries необходимо перенести в функцию init. во-вторых, в Вашем вызове ArrayCopySeries не хватает четвёртого параметра - периода.

Да, я это сейчас сделал (и в скрипте выше ArrayCopySeries стоит в init).
Третий и четвертый параметры судя по хелпу необязательные, и скрипт и без четвертого работает.
Попробую его добавить, может глюки исчезнут.

Спасибо за инфо.
 
С индикаторным массивом понял,
спасибо.
в Вашем индикаторе практически всё правильно, за исключением того, что ArrayCopySeries необходимо перенести в функцию init. во-вторых, в Вашем вызове ArrayCopySeries не хватает четвёртого параметра - периода.

Да, я это сейчас сделал (и в скрипте выше ArrayCopySeries стоит в init).
Третий и четвертый параметры судя по хелпу необязательные, и скрипт и без четвертого работает.
Попробую его добавить, может глюки исчезнут.

Спасибо за инфо.

ОЧЕНЬ СИЛЬНО ИЗВИНЯЮСЬ!!!
вызовы ArrayCopySeries необходимо перенести из функции init в функцию start!
прошу прощения за описку
 
Пока вроде работает ..
Я еще понаблюдаю.
вызовы ArrayCopySeries необходимо перенести из функции init в функцию start!
прошу прощения за описку

А почему?
Хотелось бы понимать, чтобы было меньше глупых вопросов.
 
перед тем, как ArrayCopySeries начнёт работу, она проверяет наличие соответствующих данных в локальной исторической базе. если их нет, создаётся локальная копия. если есть, то проверяется состояние копии. при необходимости данные обновляются. то есть вызов ArrayCopySeries гарантирует Вам наипоследнюю свежесть данных, повторяю, что речь идёт о копиях.
 
Я вопрос не исследовал подробно.
Поэтому извиняюсь если гдето есть прямое описание ответа на вопрос который я сейчас задам.
А можно ли передавать в dll массив вычисленного индикатора ?
И какую структуру нужно обьявлять как элемент этого массива в исходнике dll ?
 

А можно ли передавать в dll массив вычисленного индикатора ?
И какую структуру нужно обьявлять как элемент этого массива в исходнике dll ?

в dll можно передавать любые массивы.
массив вычисленного индикатора должен быть заполнен самостоятельно в цикле от 0 до Bars. перед этим массиву необходимо обеспечить соответствующий размер. самое интересное, что в своей dll Вы можете изменить значения в массиве.
посмотрите наш пример ExpertSample.dll, функции GetArrayItemValue и SetArrayItemValue
из пользовательского индикатора Вы можете сразу передать в dll индикаторный массив.
 
А на кой ляд мне передавать массив вычисленного индикатора, если все внутренности (используемые буфера) этого индикатора недоступны? С таким же успехом можно вместо книги дарить в подарок только эпилог.
Причина обращения: