Ваши вопросы по языку MQL4

hoz

Активный участник
Хм. Нашёл ещё одну весьма интересную вещь. Я сам так не делал, потом стало интересно..
Вот функция обработки ошибок:

PHP:
Expand Collapse Copy
bool fErrorHandling (int fi_Error, bool& fb_InvalidSTOP)
{   
//----
   if (fi_Error == 0)
      return (true);
   switch (fi_Error)
   {
      case 4:   /*ERR_SERVER_BUSY*/
      case 137: /*ERR_BROKER_BUSY*/
      case 139: /*ERR_ORDER_LOCKED*/
      case 146: /*ERR_TRADE_CONTEXT_BUSY*/ Sleep (500); return (false);
      case 6:   /*ERR_NO_CONNECTION*/ fReConnect(); Sleep (1000); return (false);
      case 135: /*ERR_PRICE_CHANGED*/ 
      case 136: /*ERR_OFF_QUOTES*/
      case 138: /*ERR_REQUOTE*/ Sleep (1); return (false);
      case 129: /*ERR_INVALID_PRICE*/
      case 130: /*ERR_INVALID_STOPS*/ fb_InvalidSTOP = true; return (false);
      case 4109: /*ERR_TRADE_NOT_ALLOWED*/
         Print ("TRADE NOT ALLOWED ! SWITCH ON option \' Allow live trading\' (Необходимо включить опцию \'Разрешить советнику торговать\')");
         return (true);
      default: fWrite_Log (StringConcatenate (OrderTicket(), ": Критическая ошибка № ", ErrorDescription (fi_Error)), bi_indERR); return (true);
   }
//----
   return (true);
}


В общем-то суть такая, что по дефолту довольно-странный лог получается..
Ведь если условие:

PHP:
Expand Collapse Copy
 if (fi_Error == 0)
      return (true);


Не выполнено, значит есть какая-то ошибка. Если есть ошибка, значит возможно, тикета может не быть вообще, если данная функция находится в функция посыла ордера, например. Тогда если нет тикета, то получится, что в данном месте:

PHP:
Expand Collapse Copy
 fWrite_Log (StringConcatenate (OrderTicket(), ": Критическая ошибка № ", ErrorDescription (fi_Error)), bi_indERR); return (true);


OrderTicket() не будет при выводе? Но если его нет, это будет ошибка так?
 
Последнее редактирование модератором:

ansol

Местный знаток
OrderTicket() не будет при выводе? Но если его нет, это будет ошибка так?
Если ордер не выполнен, то OrderSend() возвращает -1 вместо номера тикета.
А вообще, если переменная неопределена, то возвращается пустое значение/ноль, т.е. в любом случае, это не ошибка.
 

hoz

Активный участник
Если ордер не выполнен, то OrderSend() возвращает -1 вместо номера тикета.
А вообще, если переменная неопределена, то возвращается пустое значение/ноль, т.е. в любом случае, это не ошибка.

Да, я это и имел ввиду. Но тикета тут не будет. Получится вывод кривой какой-то и не логичный.
 

eevviill

Заблокирован
iCustom

extern string name_ind = "Un34";
double ter=iCustom(Symbol(),0,name_ind,0,0);

Пишу так. Компилятор пишет Что название индикатора в Кастоме должно быть стринг. Почему так?
 

eevviill

Заблокирован
void start()

Пишу везде
void start()
{
}

В уроках по С++ говорят что так нельзя.
Почему?
 

ansol

Местный знаток
Это баг или фича! :)
Из хелпа:
Пример:
double val=iCustom(NULL, 0, "SampleInd",13,1,0);
Я всегда так писал, в кавычках, так что ХЗ.
2.
void не возвращает значений, как ошибки отлавливать?
 

ansol

Местный знаток
1. Дык еще бы так не работало! :)
2. Второй вопрос был по С++ или я не понял, пардон. Причем тут getlasterror() из MQL4?

В любом случае, фунция start() как основная, должна что-то возвращать в вызывающую программу. В MQL4 можно писать void start() ?
Я уж не помню, вроде когда-то давно сталкивался с траблой такой, что надо именно int start()

P.S. я поправил свой ответ
 
Последнее редактирование:

ansol

Местный знаток
Кстати, да, смотри как я написал:
PHP:
Expand Collapse Copy
            string z1z = "1ZigZag";
            dPrevZ = iCustom(sSymbol, iTF, z1z, ExtDepth, ExtDeviation, ExtBackStep, 0, iZCountPrev);
И все работает, не ругается, а ведь одни сплошные переменные указаны, включая имя индикатора
 
Последнее редактирование модератором:

hoz

Активный участник
Это баг или фича! :)
Из хелпа:

Я всегда так писал, в кавычках, так что ХЗ.
2.
void не возвращает значений, как ошибки отлавливать?

Непосредственно из функции старт ошибки кто отлавливает? Ловятся ж они ниже на уровнях, но не в головной... Главное что б старт отработал, а дальше уже дело за пользовательскими функциями.
Не согласны?
Кстати, сегодня я про это читал, исква чутка другую тему смежную. Вот из истории:
_http://forum.mql4.com/ru/20867
 
Последнее редактирование модератором:

ansol

Местный знаток
Непосредственно из функции старт ошибки кто отлавливает? Ловятся ж они ниже на уровнях, но не в головной... Главное что б старт отработал, а дальше уже дело за пользовательскими функциями.
Не согласны?

Нет. Вызываемая функция должна вернуть в родительскую "0" или код ошибки, даже если она не выполнила ни одной пользовательской функции.
Представьте себе деление на ноль первой строчкой кода - какие еще функции, откуда?
А когда пишут горе-программисты, получается, что и прога не запускается и никаких ошибок в винде нет :angry:
Это я уже имею в виду С++ и егонный ехе-шник в винде, ну а в МТ4 имеем аналог - в качестве "ОС Виндовз" выступает терминал, в качестве ехе-шника исполняемый файл ех4
 

ansol

Местный знаток
По ссылке посмотрел - там ни до чего не доспорили и бросили это грязное дело :)
Вполне вероятно, что в MQL4 тип не важен, хотя был у меня глюк один, но счас вспоминать и экпериментировать не хочется. Глюк был точно связан с тем, что я с какого-то бодуна придумал обозвать их всех void'ами :) Вернул обратно в int и больше никогда так не делал, ибо времени жалко
 

hoz

Активный участник
Предлагаю помозговать над одной довольно интересной функцией. Я вот так и не понял, бывает ли в такой функции необходимость. Автор говорит, что бывает.. Автора скрывать не буду, т.к. функция его. Мне просто попались его библиотеки, и, я решил их прошерстить, для общего сведения и прокачки своих знаний. Вот она:

PHP:
Expand Collapse Copy
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, [email protected]                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция, гарантированного получения Point                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_Point (string fs_Symbol = "")
{
    double ld_Point = 0.0;
//----
    if (fs_Symbol == "")
    {
       fs_Symbol = Symbol();
    }
    ld_Point = MarketInfo (fs_Symbol, MODE_POINT);
    //---- Если результата нет
    if (ld_Point == 0.0)
    {
       int li_Digits = MarketInfo (fs_Symbol, MODE_DIGITS);
       if (li_Digits > 0)
       {
          ld_Point = 1.0 / MathPow (10, li_Digits);
       }
    }
    else
    {
       return (ld_Point);
    }
//----
    return (ld_Point);
}


Вопрос простой Зачем получать Point, если он получается из MarketInfo() ? Я задал вопрос автору. Автор сказал, что мол частенько приходится использовать Point в качестве делителя, а на ноль делить нелья!. Мол это ещё с начальных классов дети знают..
Соглашусь, знают, знаем.. НО, опять же с чего бы то значение Point не получится из MarketInfo() ? И, самое интересное, если уже на то пошло, и значение Point не получили, какова гарантия, что значение Digits будет получено?
Ведь если Digits не будет получено тоже (теоритически, что маловероятно по-моему), то из функции вообще не выйдем толком, так как нет else после:
э
PHP:
Expand Collapse Copy
 if (li_Digits > 0)
       {
          ld_Point = 1.0 / MathPow (10, li_Digits);
       }
 
Последнее редактирование модератором:

hoz

Активный участник
По ссылке посмотрел - там ни до чего не доспорили и бросили это грязное дело :)
Вполне вероятно, что в MQL4 тип не важен, хотя был у меня глюк один, но счас вспоминать и экпериментировать не хочется. Глюк был точно связан с тем, что я с какого-то бодуна придумал обозвать их всех void'ами :) Вернул обратно в int и больше никогда так не делал, ибо времени жалко

У меня тоже инты, и нет резона что-то там менять.
 

ansol

Местный знаток
MQL - он такой эмкуэль... Вообщем, в некоторых случаях при делении на пойнт MQL приводит типы и считает пойнт нулем. Правда, из этого выходят тупым умножением на 1.0
Правда, мне такой случай не попался, а пример пользователя я проверять не стал, так поверил. Там большое целое делилось на Point, причем в операции "if" без получения результата деления
 

eevviill

Заблокирован
Предлагаю помозговать над одной довольно интересной функцией. Я вот так и не понял, бывает ли в такой функции необходимость. Автор говорит, что бывает.. Автора скрывать не буду, т.к. функция его. Мне просто попались его библиотеки, и, я решил их прошерстить, для общего сведения и прокачки своих знаний. Вот она:

PHP:
Expand Collapse Copy
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, [email protected]                                              |
//+-----------------------------------------------------------------------------------+
//|        Функция, гарантированного получения Point                                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fGet_Point (string fs_Symbol = "")
{
    double ld_Point = 0.0;
//----
    if (fs_Symbol == "")
    {
       fs_Symbol = Symbol();
    }
    ld_Point = MarketInfo (fs_Symbol, MODE_POINT);
    //---- Если результата нет
    if (ld_Point == 0.0)
    {
       int li_Digits = MarketInfo (fs_Symbol, MODE_DIGITS);
       if (li_Digits > 0)
       {
          ld_Point = 1.0 / MathPow (10, li_Digits);
       }
    }
    else
    {
       return (ld_Point);
    }
//----
    return (ld_Point);
}


Вопрос простой Зачем получать Point, если он получается из MarketInfo() ? Я задал вопрос автору. Автор сказал, что мол частенько приходится использовать Point в качестве делителя, а на ноль делить нелья!. Мол это ещё с начальных классов дети знают..
Соглашусь, знают, знаем.. НО, опять же с чего бы то значение Point не получится из MarketInfo() ? И, самое интересное, если уже на то пошло, и значение Point не получили, какова гарантия, что значение Digits будет получено?
Ведь если Digits не будет получено тоже (теоритически, что маловероятно по-моему), то из функции вообще не выйдем толком, так как нет else после:
э
PHP:
Expand Collapse Copy
 if (li_Digits > 0)
       {
          ld_Point = 1.0 / MathPow (10, li_Digits);
       }
С Point проблем никогда небыло.
Но они могут быть в мультивалютниках и если в обзоре рынка нету нужной пары, то 0 будет. Но его функция в этом не поможет. Так что его функция безполезна.
 

hoz

Активный участник
С Point проблем никогда небыло.
Но они могут быть в мультивалютниках и если в обзоре рынка нету нужной пары, то 0 будет. Но его функция в этом не поможет. Так что его функция безполезна.


Если получать данные из ИНИТА, то всё будет чётко. Ведь если из ИНИТ данные не получаться, то эксперт не запустится, как я понимаю.
 
Последнее редактирование:
Верх