![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот эта строчка
while(iRSIOnArray(ExtBuffer,0,3,0)>50)ExtBuffer[0]=ExtBuffer[0]-Point;
выглядит очень по-хакерски. Нужно прикинуть, сколько итераций будет сделано пока значение не упадёт ниже 50. Необходимо иметь в виду, что после каждого изменения ExtBuffer[0] индикатор RSI будет рассчитываться каждый раз заново на всём массиве данных, от начала до конца.
Вот и получается, что индикатор постоянно считает, причём каждый раз расчёт длится дольше, чем промежуток между тиками. А индикаторы рассчитываются в интерфейсном потоке, поэтому клиентский терминал и зависает, занимаясь обслуживанием этого индикатора.
Как написано в српавке по ArrayCopySeries:
Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.
Один раз скопировал данные в индексный массив (а они действительно реально копируются), а потом можно делать с этими данными всё что угодно. Что и происходит.
PS я понял мысль про голографию. Действительно, на каждом новом тике массив переписывается заново, а потом меняется только один его элемент.
только что сделал так, чтоб посмотреть а что вообще вычиляется и оказалось, что значение 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;
}
КАК ЭТО??????
Может кто-то из разработчиков скажет в чем прикол?
ВОТ ВОТ Я ЭТОГО ТОЖЕ НЕ ПОНИМАЮ, ЗАМКНУТЫЙ КРУГ, ХОТЯ, ЕСЛИ БУФЕР МЕНЯЕТСЯ ТО И ИНДИКАТОР ТОЖЕ ДОЛЖЕН УМЕНЬШАТЬ СВОЁ ЗНАЧЕНИЕ
только что сделал так, чтоб посмотреть а что вообще вычиляется и оказалось, что значение 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;
}
КАК ЭТО??????
Может кто-то из разработчиков скажет в чем прикол?
ВОТ ВОТ Я ЭТОГО ТОЖЕ НЕ ПОНИМАЮ, ЗАМКНУТЫЙ КРУГ, ХОТЯ, ЕСЛИ БУФЕР МЕНЯЕТСЯ ТО И ИНДИКАТОР ТОЖЕ ДОЛЖЕН УМЕНЬШАТЬ СВОЁ ЗНАЧЕНИЕ
Вопрос к stringo. Он то и получается бесконечным, так как значение iRSIOnArray не меняется, а так ведь в коде все правильно. . .
ВСЕ ПРАВИЛЬНО Я ТОЖЕ СЧИТАЮ ЧТО ВИСЯК ИЗ-ЗА ТОГО ЧТО IrsI НЕ МЕНЯЕТСЯ А КТО ЗНАЕТ КАК ЭТО СДЕЛАТЬ
Как написано в српавке по ArrayCopySeries:
Реального распределения памяти под массив данных и копирования не происходит. При обращении к такому массиву производится перенаправление доступа. Исключение составляют массивы, назначенные в качестве индексных в пользовательских индикаторах. В этом случае производится реальное копирование данных.
Rosh ТЫ МОЖЕШЬ РЕАЛЬНО ПОДСКАЗАТЬ КАК ОСУЩЕСТВИТЬ ЭТУ ЗАДАЧУ Я УЖЕ МУЧАЮСЬ НЕ ЗНАМО СКОЛЬКО.
Если даже в iRSIOnArray(ExtBuffer,0,3,10) изменить 0 на 10( total - Количество элементов для вычислени. 0 означает все элементы массива) то ничего не происходит, то есть рисуется график Close.
Вот эта строчка
while(iRSIOnArray(ExtBuffer,0,3,0)>50)ExtBuffer[0]=ExtBuffer[0]-Point;
выглядит очень по-хакерски. Нужно прикинуть, сколько итераций будет сделано пока значение не упадёт ниже 50. Необходимо иметь в виду, что после каждого изменения ExtBuffer[0] индикатор RSI будет рассчитываться каждый раз заново на всём массиве данных, от начала до конца.
Вот и получается, что индикатор постоянно считает, причём каждый раз расчёт длится дольше, чем промежуток между тиками. А индикаторы рассчитываются в интерфейсном потоке, поэтому клиентский терминал и зависает, занимаясь обслуживанием этого индикатора.
для меня например не подходят.
Артем уже поднимал эту тему несколько раз
'ПОИСКЗНАЧЕНИЯ RSI'
'КТО ПОДСКАЖЕТ'
'Кто знает как работать с iRSIOnArray() в цикле while'
Но тема остается постоянно или недопонятой или просто все молчат. Я же вижу, что проблема не в его коде а в логике внутри mql при вычислении iRSIonArray.
Еще раз хочу повторить, что со значениями ExtBuffer ВСЕ В ПОЛНОМ ПОРЯДКЕ. ОНИ МЕНЯЮТСЯ БЕЗ ПРОБЛЕМ.
Проблема с вычислением на их основе iRSIonArray.
я даже вставил принудительное обнуление и копирование снова. и шаг посавил не 1 а 10 Point
Просьба к 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) НЕТ!!!
Получается так, что по проиъоду нового тика он перевычисляется а если задавать в цикле то нет
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?????
!!!!!Разработчики пожалуйста, объясните в чем пролема с iRSIOnArray?????