Обработка на изключения в MQL4

В езика Java човек може да обработва изключения с механизъм try-catch.

Съществува ли подобно поведение в MQL4?

Този код извежда грешката „array out of range“ в израза Close[bar] и не мога да го обработя правилно.

Всяка помощ ще бъде оценена.

bool isBarClosed( int bar ) {
    bool   barClosed  = true;
    double closePrice = Close[bar];
    int    error      = GetLastError();

    if ( error == 4202 ) {
        barClosed = false;
    }   
    return barClosed;
}

person JLLMNCHR    schedule 24.08.2015    source източник
comment
Няма ли официална документация?   -  person m02ph3u5    schedule 24.08.2015


Отговори (1)


No.

MQL4 няма поддръжка на синтаксис за конструкция, подобна на try/except/finally или try/catch случай на използване в python/java и подобни езици.

Как да се справим с изключенията?

Да предположим, че няма грешки по време на компилиране.

Грешките по време на изпълнение са трудни за справяне, някои дори причиняват срив на софтуера.

Човек може и по-скоро трябва проактивно да дезинфекцира MQL4-кода с надлежна проверка на типа и предварителни валидации на случаите на използване, за да се предотвратят изключения.

Изключения от това са операциите dbPool, които може при някои условия "законно" да не успеят да дадат очакван резултат.

A GetLastError() (ако е изчистено a priori самото изключение) може да служи като идентификация почти след смъртта, а не като манипулатор на изключение.

4202? Не е твой проблем, брато

_LastError == 4202 ... does not explain the trouble                <<< stdlib.mqh

4202
    ERR_OBJECT_DOES_NOT_EXIST
    Object does not exist

Вашият проблем изглежда е свързан с bar "посочване" извън TimeSeries-reverse-stepping-index на Close[] стойности.

0 <= aBarPtrIDX < Bars

Следваща цел? Close[aBarPtrIDX] погрешно схващане

След известно време, прекарано в домейн MQL4, човек се запознава с няколко противоречиви факта. Една от потенциалните изненади е, че текуща лента, "горещата нула" [0], съдържа Close[0] == Bid по време на целия си жизнен цикъл.

След като лентата за изпълнение бъде прекратена от aNewBarEVENT ( сигнализирано от Volume[0] == 1 ( или Volume[0] < aPreviousVolume_0 -- по-безопасен режим за случай, MQL4-свободно свързаният цикъл на събития е пропуснал няколко quote-пристигания по време на епизода на заетост)), Close[1] представлява последната посетена цена през съответния Bar-период, а Close[0] продължава да сърфира по винаги променящата се цена Bid

person user3666197    schedule 24.08.2015