Может кто-нибудбь подробно объснить что просходит? - страница 2

 

Вот эта строчка

while(iRSIOnArray(ExtBuffer,0,3,0)>50)ExtBuffer[0]=ExtBuffer[0]-Point;

выглядит очень по-хакерски. Нужно прикинуть, сколько итераций будет сделано пока значение не упадёт ниже 50. Необходимо иметь в виду, что после каждого изменения ExtBuffer[0] индикатор RSI будет рассчитываться каждый раз заново на всём массиве данных, от начала до конца.

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

 
Rosh:
Как написано в српавке по ArrayCopySeries:

Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.
Поэтому попытки изменить значение любого элемента такого массива аналогично попыткам сдвинуть что-либо в голографическом изоюбражении. Вроде трехмерно, а зацепиться не за что. Я так понимаю :)


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

PS я понял мысль про голографию. Действительно, на каждом новом тике массив переписывается заново, а потом меняется только один его элемент.

 
sergeev:
только что сделал так, чтоб посмотреть а что вообще вычиляется и оказалось, что значение RSI вообще не меняется!!!!!


for (i = 1; i<=20; i++)
{
Print("iRSIOnArray(ExtBuffer,0,3,0) "+ DoubleToStr(iRSIOnArray(ExtBuffer, 0,3,0), 4) +" ExtBuffer[0] - " + DoubleToStr(ExtBuffer[0], 4)+" "+i);
ExtBuffer[0]=ExtBuffer[0]-10*Point;
}


КАК ЭТО??????

Может кто-то из разработчиков скажет в чем прикол?



ВОТ ВОТ Я ЭТОГО ТОЖЕ НЕ ПОНИМАЮ, ЗАМКНУТЫЙ КРУГ, ХОТЯ, ЕСЛИ БУФЕР МЕНЯЕТСЯ ТО И ИНДИКАТОР ТОЖЕ ДОЛЖЕН УМЕНЬШАТЬ СВОЁ ЗНАЧЕНИЕ
 
sergeev:
только что сделал так, чтоб посмотреть а что вообще вычиляется и оказалось, что значение RSI вообще не меняется!!!!!


for (i = 1; i<=20; i++)
{
Print("iRSIOnArray(ExtBuffer,0,3,0) "+ DoubleToStr(iRSIOnArray(ExtBuffer, 0,3,0), 4) +" ExtBuffer[0] - " + DoubleToStr(ExtBuffer[0], 4)+" "+i);
ExtBuffer[0]=ExtBuffer[0]-10*Point;
}


КАК ЭТО??????

Может кто-то из разработчиков скажет в чем прикол?



ВОТ ВОТ Я ЭТОГО ТОЖЕ НЕ ПОНИМАЮ, ЗАМКНУТЫЙ КРУГ, ХОТЯ, ЕСЛИ БУФЕР МЕНЯЕТСЯ ТО И ИНДИКАТОР ТОЖЕ ДОЛЖЕН УМЕНЬШАТЬ СВОЁ ЗНАЧЕНИЕ
 
sergeev:
Вопрос к stringo. Он то и получается бесконечным, так как значение iRSIOnArray не меняется, а так ведь в коде все правильно. . .

ВСЕ ПРАВИЛЬНО Я ТОЖЕ СЧИТАЮ ЧТО ВИСЯК ИЗ-ЗА ТОГО ЧТО IrsI НЕ МЕНЯЕТСЯ А КТО ЗНАЕТ КАК ЭТО СДЕЛАТЬ
 
Rosh:
Как написано в српавке по ArrayCopySeries:

Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.
Поэтому попытки изменить значение любого элемента такого массива аналогично попыткам сдвинуть что-либо в голографическом изоюбражении. Вроде трехмерно, а зацепиться не за что. Я так понимаю :)

Rosh ТЫ МОЖЕШЬ РЕАЛЬНО ПОДСКАЗАТЬ КАК ОСУЩЕСТВИТЬ ЭТУ ЗАДАЧУ Я УЖЕ МУЧАЮСЬ НЕ ЗНАМО СКОЛЬКО.

Если даже в iRSIOnArray(ExtBuffer,0,3,10) изменить 0 на 10( total - Количество элементов для вычислени. 0 означает все элементы массива) то ничего не происходит, то есть рисуется график Close.

 
stringo:

Вот эта строчка

while(iRSIOnArray(ExtBuffer,0,3,0)>50)ExtBuffer[0]=ExtBuffer[0]-Point;

выглядит очень по-хакерски. Нужно прикинуть, сколько итераций будет сделано пока значение не упадёт ниже 50. Необходимо иметь в виду, что после каждого изменения ExtBuffer[0] индикатор RSI будет рассчитываться каждый раз заново на всём массиве данных, от начала до конца.

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

stringo даже если считать каждые 10*Point не многое меняется
 
Как я вижу так ничего разработчики до сих пор внятное ответить не могут.  Аппеляции на то, что while(iRSIOnArray(ExtBuffer,0,3,0)>50)ExtBuffer[0]=ExtBuffer[0]-Point; выглядит очень по-хакерски.
для меня например не подходят.

Артем уже поднимал эту тему несколько раз
'ПОИСКЗНАЧЕНИЯ RSI'
'КТО ПОДСКАЖЕТ'
'Кто знает как работать с iRSIOnArray() в цикле while'

Но тема остается постоянно или недопонятой или просто все молчат. Я же вижу, что проблема не в его коде а в логике внутри mql при вычислении iRSIonArray.

Еще раз хочу повторить, что со значениями ExtBuffer ВСЕ В ПОЛНОМ ПОРЯДКЕ. ОНИ МЕНЯЮТСЯ БЕЗ ПРОБЛЕМ. 
Проблема с вычислением на их основе iRSIonArray.


я даже вставил принудительное обнуление и копирование снова.  и шаг посавил не 1 а 10 Point

#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_color1 Green 
double ExtBuffer[]; 
int init() 
{     SetIndexBuffer(0,ExtBuffer); SetIndexStyle(0,DRAW_LINE);     return(0); } 
int start() 
{     
int i;        
ArrayCopySeries(ExtBuffer,MODE_CLOSE,Symbol(),Period());     
for (i = 1; i<=20; i++)     
{         

ArrayInitialize(ExtBuffer, 0.0);             
ArrayCopySeries(ExtBuffer,MODE_CLOSE,Symbol(),Period());             
ExtBuffer[0]=ExtBuffer[0]-i*10*Point;                 
Print("iRSIOnArray(ExtBuffer,0,3,0)   "+ DoubleToStr(iRSIOnArray(ExtBuffer,20,3,0), 4) +"  ExtBuffer[0] -   " + DoubleToStr(ExtBuffer[0], 4)+"   "+i);         
}
     
} 
}
Просьба к Rosh или stringo: проверьте пожалуйста работу этого кода и может бы ть вы дадите другое решение.

вот какой результат в журнале:

2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4202 20
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4212 19
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4222 18
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4232 17
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4242 16
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4252 15
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4262 14
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4272 13
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4282 12
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4292 11
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4302 10
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4312 9
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4322 8
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4332 7
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4342 6
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4352 5
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4362 4
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4372 3
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4382 2
2007.10.30 09:51:50 qwqwqwwqwq EURUSD!,Daily: iRSIOnArray(ExtBuffer,0,3,0) 36.2259 ExtBuffer[0] - 1.4392 1

Как видно  ExtBuffer[0] меняется, а значения iRSIOnArray(ExtBuffer,0,3,0) НЕТ!!!


Получается так, что по проиъоду нового тика он перевычисляется а если задавать в цикле то нет
 
Провожу свои эксперименты. Сделал небольшие изменения. Сделал 3 буфера
double RSIBuf[]; - iCustom - "RSI"
double RSIArr[]; - он вычисляется iRSIOnArray
double RSI[]; - iRSI


И вот какой теперь отчет:

2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 58.7712 iRSI 62.6960 - 10
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 59.2004 iRSI 62.6960 - 9
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 59.6208 iRSI 62.6960 - 8
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 60.0327 iRSI 62.6960 - 7
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 60.4362 iRSI 62.6960 - 6
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 60.8317 iRSI 62.6960 - 5
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 61.2193 iRSI 62.6960 - 4
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 61.5993 iRSI 62.6960 - 3
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 61.9720 iRSI 62.6960 - 2
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 62.3375 iRSI 62.6960 - 1
2007.10.30 11:31:25 qwqwqwwqwq GBPUSD!,Daily: iRSIOnArray 62.6960 RSIBuf() 62.6960 iRSI 62.6960 - 0

В начальный момент мы имее 3 идентичных данных Затем по мере уменьшения значения последней цены имеем:
- С iRSI все понятно. на его данные мы никак не можем влиять и он остается постоянным.
- посмотрите на iRSIOnArray - его данные постоянны.
- Тогда как iCustom "RSI" ( RSIBuf() ) - перевычисляет значения как нам нужно.

!!!!!Разработчики пожалуйста, объясните в чем пролема с iRSIOnArray?????
Файлы:
 
sergeev:

!!!!!Разработчики пожалуйста, объясните в чем пролема с iRSIOnArray?????
Ну что вы домагиваетесь :-)) Когда разработчики молчат на подобные вопросы - значит разбираются (во всяком случае пока так было).
Причина обращения: