Не вьехал по МТ-5

 

ГУРУ!

не могу получить значение МА, пишет ""copied=-1""

Ткните меня носом где не так

Если ВСЕ не так напишите кодик, будьте так любезны

Заранее благодарен

double Ups[];
ArraySetAsSeries(Ups,true);
int MAhandle= iMA(Symbol(), 0,24, 0, 1,PRICE_CLOSE );

int copied=CopyBuffer(MAhandle,0,0,10,Ups);
Print(Ups[1]," ",copied);

 

alex54 писал(а) >>

Если буфер Ups не индикаторный, то задайте ему нужный размер перед копированием. Если индикаторный -- копируйте целиком. А вообще GetLastError в помощь.

 
TheXpert писал(а) >>

Если буфер Ups не индикаторный, то задайте ему нужный размер перед копированием. Если индикаторный -- копируйте целиком. А вообще GetLastError в помощь.

Вообще, если буфвер динамический, то может иметь любой размер. CopyBuffer сделает ресайз.

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

 
stringo >>:

Вообще, если буфвер динамический, то может иметь любой размер. CopyBuffer сделает ресайз.

Когда писал статью, специально проверял -- ресайза не было. Билд был что-то около 199, точно не скажу.

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

Есть специфичная ошибка, отражающая этот момент?

 
stringo писал(а) >>

Вообще, если буфвер динамический, то может иметь любой размер. CopyBuffer сделает ресайз.

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

Все получилось! Все дело в SLEEP !!!

ДЕНЬ КОВЫРЯЛСЯ

 
TheXpert писал(а) >>

Когда писал статью, специально проверял -- ресайза не было. Билд был что-то около 199, точно не скажу.

Есть специфичная ошибка, отражающая этот момент?

Есть. ERR_INDICATOR_DATA_NOT_FOUND - 4806

 
alex54 писал(а) >>

Все получилось! Все дело в SLEEP !!!

ДЕНЬ КОВЫРЯЛСЯ

Посмотрите примеры наших кастомных индикаторов, которые используют другие индикаторы для своих расчётов. Например MACD. Мы используем функцию BarsCalculated, чтобы выяснить сколько насчиталось и насчиталось ли вообще.

 
stringo >>:

Есть. ERR_INDICATOR_DATA_NOT_FOUND - 4806

Кстати об ошибках...

Давеча "поймал" 4752 а что это неизвестно.

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

Да обновляемый периодически...

//+------------------------------------------------------------------+
//|                                                       Errors.mqh |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"

//---
string Err(int c)
{
switch(c)
{
// ...
case 4602: return((string)c+"=Ошибочный индекс своего индикаторного буфера");
case 4603: return((string)c+"=Ошибочный идентификатор свойства пользовательского индикатора");
case 4701: return((string)c+"=Ошибочный идентификатор свойства счета");
case 4752: return((string)c+"=4752 ?");
// ...
case 65536: return((string)c+"=gggooo");
//---
default: return((string)c+"=n/a");
}
}
 

ERR_TRADE_DISABLED - 4752 - Торговля для экспертов запрещена.

Сегодня внесли в язык и в справку

 
stringo >>:

Вообще, если буфвер динамический, то может иметь любой размер. CopyBuffer сделает ресайз.

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

...

Есть. ERR_INDICATOR_DATA_NOT_FOUND - 4806

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

Либо нужно возвращать управление из функции только после того, как хэндл указывает на валидные данные.

Либо возвращать иной код ошибки - указанный не соответствует по описанию: должно быть что-то вроде DATA_NOT_READY_YET. И еще тогда нужна функция типа WaitForSingleObject, т.к. Sleep - это кривизна: одни раз хватит 1 мс, в другой не хватит, а ставить с запасом - будут тормоза.

ИМХО.

 
marketeer писал(а) >>

... И еще тогда нужна функция типа WaitForSingleObject ...

Поддерживаю.

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