Ошибки, баги, вопросы - страница 379

 
Graff:

 А имеет ли смысл в 

заменить  rates_total на BarsCalculated(ich)?

не думаю. Она больше как сервисная заглушка подходит, чтоб удостоверится что буфер готов...

к томуже Copy вернет столько данных, сколько рассчитано, а не запрошенный размер.


А Вы из какого города, если не секрет?

не в Днепре.
 
sergeev:

кстати, а вы уверены, что не надо вызывать никаких дополнительных функций?

в библиотеке есть и Refresh и BufferResize. Мне кажется что они необходимы для нормального функционирования.


А где написано, что надо?

Попробовал в разных вариантах

ichi.Refresh(true);
ichi.Refresh(false);
ichi.RefreshCurrent(true);
ichi.RefreshCurrent(false);

Никакого эффекта. 

 

Продолжаем....

Наблюдается глюк индикатора iIchimoku. Мой индикатор просто рисует стрелки в зависимости от if(tenkan[i]>kijun[i]). Как видно на скрине стрелки нарисованы неправильно

 

Полный код в файле Ich_1_f.mq5

Однако, если производить расчет вручную, то все отображается верно

 

Полный код в файле Ich_1_ок.mq5 

Файлы:
Ich_1_f.mq5  6 kb
Ich_1_ok.mq5  6 kb
 

Пишим dll :

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

подключаем :

#import "Projeckt1.dll"
int      GetPtrVar(double a);
double   GetValuePtr(int pointer);
#import

вызываем :

void OnStart()
  {   
   double var=153.25; 
   Print("вложенный вызов = ",GetValuePtr(GetPtrVar(var)));
   int pointer=GetPtrVar(var);   
   Print("вызов с сохранением адреса = ",GetValuePtr(pointer));
  }

получаем вот это:

2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вызов с сохранением адреса = 5.560304580319136e-287
2011.05.01 18:09:12     Черновик 31 (EURUSD,H1) вложенный вызов = 153.25

хотя по идее обе строки должны вернуть одно и тоже значение 153.25.

Почему?

 
Urain:

Почему?
Это в 32 или 64 битной версии происходит?
 
Renat:
Это в 32 или 64 битной версии происходит?

32
 

Все очень просто - в функции GetPtrVar(double a) берете адрес копии переменной в стеке, а потом пытаетесь прочесть замусоренный кусок памяти стека.

В первый раз из за близкого вызова GetValuePtr получалось прочесть из неиспорченного стека, а уже последующие вызовы функций безвозвратно портили стек.

Ошибки нет.

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 
Renat:

Все очень просто - в функции GetPtrVar(double a) берете адрес копии переменной в стеке, а потом пытаетесь прочесть замусоренный кусок памяти стека.

Да именно, вот чувствовал что где то там копать нужно.

в dll нужно писать

GetPtrVar(double &a){return((int)(&a));}
 
Renat:

Все очень просто - в функции GetPtrVar(double a) берете адрес копии переменной в стеке, а потом пытаетесь прочесть замусоренный кусок памяти стека.

В первый раз из за близкого вызова GetValuePtr получалось прочесть из неиспорченного стека, а уже последующие вызовы функций безвозвратно портили стек.

Ошибки нет.

Я тоже обратил внимание. Правильно думаю так:

#define _DLLAPI extern "C" __declspec(dllexport)
//+------------------------------------------------------------------+
//| адрес переменной double                                          |
//+------------------------------------------------------------------+
_DLLAPI int __stdcall
GetPtrVar(double & a){return((int)(&a));}
//+------------------------------------------------------------------+
//| значение переменной double по адресу                             |
//+------------------------------------------------------------------+
_DLLAPI double __stdcall
GetValuePtr(int pointer){return(*(double*)pointer);}

подключаем :

#import "Projeckt1.dll"
int      GetPtrVar(double & a);
double   GetValuePtr(int pointer);
#import
 
В 439 билде метатрейдера5, добавился индикатор качества истории. У меня при тестировании по M1 и H4 по ценам открытиия и по всем тикам, качество - 51%... почему и как повысить это значение? Источник котировок - альпари демо.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5