Обновленный MQL4 и старый код (обмен опытом решения проблем)

 

Думаю возможно будет полезной тема в свете обновления.

На днях с дуру решил обновить терминал и потестить на нем свои эксперты работающие на реале, хорошо сразу на реале не обновил.

Полезли ошибки. Не хочу говорить что разработчики виноваты, тут и моя вина есть. Тем не менее хочу пару моментов указать где я поимел геморрой:

1. Недопустимые символы в названии переменных - тут все просто, компилятор указала на символ $ как недопустимый. Поправил быстро и легко. Больше на этапе компиляции ошибок не было.

Далее уже пришлось отлавливать косяки в работе эксперта на которые компилятор не ругался.

2. При запуске тестирования получал ругательства что библиотека stdlib.ex4 не найдена. Решилось так - нашел stdlib исходник в указанной папке и перекомпилировал его.

3. Далее устранял косяки, связанные с тем, что теперь как я понял NULL и 0 (ноль) разные вещи. Раньше функции типа iOpen(NULL,PERIOD_W1,1) прекрасно работали и в виде iOpen(0,PERIOD_W1,1), т.е. можно было указать и 0 и NULL. Теперь нет, но компилятор на это не ругается - просто получаешь ошибку уже при работе эксперта.

4. Не знаю от чего, но раньше при назначении цены открытия, уровня стопа или профита использовал NormalizeDouble(pr1,Digits), теперь заметил например при тестировании на паре USDJPY где 3 знака после запятой что это функция упорно мне возвращала число с 4 знаками после запятой и соответственно получал ошибки при открытии ордера. Заменил Digits на Digits() и все заработало.

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

Кстати если если не перекомпилировать старые коды, то ex4 работаю без ошибок.

Билд у меня сейчас 579, на реале еще 509 крутится, полет нормальный, но обновляться страшно.

Если кто столкнулся с проблемами при переходе - пишите сюда, будет полезно остальным.

 
Проверьтесь на 583, пожалуйста.
 

Аналогичная проблема с переменной Point. Меняю на Point()

до 583 билда руки не дошли пока. Да и у моего брокера его пока нет.

 

Еще раз по поводу Digits и Point.

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

Т.ч. может это только проблема тестера и в реале такого не будет. Но я на всякий случай везде меняю Digits на Digits() и Point на Point()

UPDATE замена все таки не помогает. Помогает только перезапуск терминала.

 
Спасибо, проверим и исправим в понедельник.
 

О, а я думал это у меня код совсем кривой...

Тоже в тестере не работает советник, если первый тест был на 4-знаке, то потом йеновые пары уже не тестируются, не открывает позиций. Чтобы тест прошел и на них, нужно перезапустить терминал или повторно скомпилировать советника.

Билд 584.

Нет, я не претендую на то что мой код - верх совершенства, то тот же самый код в билде 509 работал в тестере при смене тестируемого символа без перезапуска терминала и без перекомпиляции.


P.S.: Проблема пока решена через вызов конструкций типа:

   digits = MarketInfo( Symbol(), MODE_DIGITS);
   point = MarketInfo( Symbol(), MODE_POINT);

вместо простого присвоения данным переменным значений, которые вроде означают то же самое:

digits = Digits;
point = Point;
 

Когда перевожу в string для Коммента на графике, заменяю Digits (даёт 4) на цифру 5. Если включаю "отладку", правлю что-нибудь, потом на "паузе" график исчезает, и на завершении отладки появляется новый график (весь зелёный) с экспертом, но без индикаторов! Это так будет или временно?

Хорошо ещё, что обновился только тот, что на Демо. Тот, что на Реале пока не обновился. Не знаю как быть, есть позиции открытые в небольшом минусе!

 

Зелёная стрелка указывает на первую строчку в старте:

int digits = MarketInfo( Symbol(), MODE_DIGITS); А внизу: MQL4\Experts\"название советника" start и № строки Ошибки не указываются, но не компилируется Что это означает? Сказали же, что ничего не будет! Объясните, пожалуйста!

 

Перестала работать функция InternetOpenUrlA() из wininet.dll

Выдает 0 (ноль) вместо текста интернет страницы.

Привожу полный код.

#import "wininet.dll"

int InternetOpenA( string sAgent, int lAccessType, string sProxyName, string sProxyBypass, int lFlags );

int InternetOpenUrlA( int hInternetSession, string sUrl, string sHeaders, int lHeadersLength, int lFlags, int lContext );

int InternetReadFile( int hFile, int& lpvBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[] );

int InternetCloseHandle( int hInet );

int InternetQueryDataAvailable( int hFile, int& lpdwNumberOfBytesAvailable[], int dwFlags, int dwContext );

int HttpQueryInfoA(int hRequest, int dwInfoLevel, int& lpvBuffer[], int& lpdwBufferLength[], int& lpdwReserved[] );

#import


#define INTERNET_OPEN_TYPE_PRECONFIG 0x00000000 // use registry configuration

#define INTERNET_FLAG_RELOAD 0x80000000

#define INTERNET_FLAG_NO_CACHE_WRITE 0x04000000

#define INTERNET_FLAG_PRAGMA_NOCACHE 0x00000100



//+------------------------------------------------------------------+

//| script program start function |

//+------------------------------------------------------------------+

int start()

{

if(!IsDllsAllowed())

{

Alert("Необходимо в настройках разрешить использование DLL");

return(0);

}

int hInternetSession = InternetOpenA("Microsoft Internet Explorer",

0, "", "", 0);

if(hInternetSession <= 0)

{

Alert("Ошибка при вызове InternetOpenA()");

return(0);

}

int hURL = InternetOpenUrlA(hInternetSession,"https://www.mql4.com", "", 0, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0);

if(hURL <= 0)

{

Alert("Ошибка при вызове InternetOpenUrlA()");

InternetCloseHandle(hInternetSession);

return(0);

}

int cBuffer[256];

int dwBytesRead[1];

string TXT = "";

while(!IsStopped())

{

bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

if(dwBytesRead[0] == 0)

break;

string text = "";

for(int i = 0; i < 256; i++)

{

text = text + CharToStr(cBuffer[i] & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 8 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 16 & 0x000000FF);

if(StringLen(text) == dwBytesRead[0])

break;

text = text + CharToStr(cBuffer[i] >> 24 & 0x000000FF);

}

TXT = TXT + text;

Sleep(1);

}

if(TXT != "")

{

int h = FileOpen("SavedFromInternet.htm", FILE_CSV|FILE_WRITE);

if(h > 0)

{

FileWrite(h,TXT);

FileClose(h);

Alert("Готово! См. файл .../experts/files/SavedFromInternet.htm");

}

else

{

Alert("Ошибка при вызове FileOpen()");

}

}

else

{

Alert("Нет считанных данных");

}

InternetCloseHandle(hInternetSession);

return(0);

}

 
Из-за перехода на unicdoe строки теперь надо использовать InternetOpenUrlW
 
Renat:
Из-за перехода на unicdoe строки теперь надо использовать InternetOpenUrlW

Действительно все заработало! Спасибо!
Причина обращения: