Заработай до
50000$
на приглашении друзей
получить StartUp Bonus
от ИнстаФорекс
Вложений не требуется!
Начни торговлю
без вложений и риска
С новым STARTUP бонусом 1000$
Получи бонус
55%
от ИнстаФорекс
на каждое пополнение
Ответить в теме
Страница 4 из 11
Первая ... 3 4 5 ... Последняя ◄╝

Показаны сообщения: с 61 по 80 из 207

Тема: MQL4: Некоторые полезные функции

 Перейти в классический вид темы
  1. Линк#61
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  423
    в 216 сообщениях
    18%
    Получить количество ордеров (рыночных либо отложенных) данного типа.
    MQL код:
    int OrdersCount(int type)
    {
    int orders = 0;

    int cnt = OrdersTotal();
    for (int i=0; i if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

    //Опционально
    //if (OrderSymbol() != Symbol()) continue;

    //Опционально
    //if (OrderMagicNumber() != Magic) continue;

    if (OrderType() == type) orders++;
    }

    return (orders);
    }

    В эксперте эту функцию можно использовать следующим образом:
    MQL код:
    int start() 
    {
    int BuyCnt = OrdersCount(OP_BUY);
    if (BuyCnt > 0) return (0);
    ...

    Последний раз редактировалось Gold; 27.11.2015 в 19:33.

  2. post_thanks Получено лайков: 1

    Kofa (22.10.2017)

    Bitcoin
     
  3. ТОП сообщений
    2014-07-09   14:02
    Лучший ответ #1
    Накопленные выплаты 160034 RUB

    Отправка маркет-ордера на сервер. int SendMarketOrder(int Type, double Lots, int TP, int SL, int Magic, string Cmnt, int& Error) { double Price, Take, Stop; int Ticket, Slippage, Color, Err; bool Delay = False; if(Debug) Print("Функция SendMarketOrder"); while(!IsStopped()) { if(!IsExpertEnabled()) { Error = ERR_TRADE_DISABLED; Print("Работа эксперта запрещена! Кнопка "Эксперты" отжата."); return(-1); } if(Debug) Print("Работа эксперта разрешена, кнопка "Эксперты" нажата."); if(!IsConnected()) { Error = ERR_NO_CONNECTION; Print("Связь с сервером отсутствует!"); return(-1); } if(Debug) Print("Связь с сервером установлена"); if(IsTradeContextBusy()) { if(Debug) Print("Торговый поток занят!"); if(Debug) Print("Ожидаем 3 сек..."); Sleep(3000); Delay = True; continue; } if(Debug) Print("Торговый поток свободен"); if(Delay || (LastTickTime != MarketInfo(Symbol(),MODE_TIME))) { if(Debug) Print("Обновляем котировки"); RefreshRates(); LastTickTime = MarketInfo(Symbol(),MODE_TIME); Delay = False; } else { if(Debug) Print("Котировки актуальны"); } switch(Type) { case OP_BUY: if(Debug) Print("Инициализируем параметры для BUY-ордера"); Price = NormalizeDouble( Ask, Digits); Take = IIFd(TP == 0, 0, NormalizeDouble( Price + TP * Point, Digits)); Stop = IIFd(SL == 0, 0, NormalizeDouble( Price - SL * Point, Digits)); Color = Blue; break; case OP_SELL: if(Debug) Print("Инициализируем параметры для SELL-ордера"); Price = NormalizeDouble( Bid, Digits); Take = IIFd(TP == 0, 0, NormalizeDouble( Price - TP * Point, Digits)); Stop = IIFd(SL == 0, 0, NormalizeDouble( Price + SL * Point, Digits)); Color = Red; break; default: if(Debug) Print("Тип ордера не соответствует требованиям."); return(-1); } Slippage = MarketInfo(Symbol(), MODE_SPREAD); if(Debug) Print("Slippage = ",Slippage); if(IsTradeAllowed()) { if(Debug) Print("Торговля разрешена, отправляем ордер..."); Ticket = OrderSend(Symbol(), Type, Lots, Price, Slippage, Stop, Take, Cmnt, Magic, 0, Color); if(Ticket < 0) { Err = GetLastError(); if (Err == 4 || /* SERVER_BUSY */ Err == 129 || /* INVALID_PRICE */ Err == 135 || /* PRICE_CHANGED */ Err == 137 || /* BROKER_BUSY */ Err == 138 || /* REQUOTE */ Err == 146 || /* TRADE_CONTEXT_BUSY */ Err == 136 ) /* OFF_QUOTES */ { if(Debug) Print("Ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err)); if(Debug) Print("Ожидаем 3 сек..."); Sleep(3000); Delay = True; continue; } else { if(Debug) Print("Критическая ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err)); Error = Err; break; } } break; } else { if(Debug) Print("Эксперту запрещено торговать! Снята галка в свойствах эксперта."); //Print("Ожидаем 3 сек..."); //Sleep(3000); //Delay = True; //continue; break; } } if(Ticket > 0) if(Debug) Print("Ордер отправлен успешно. Тикет = ",Ticket); else if(Debug) Print("Ошибка! Ордер не отправлен. (ErrorCode = ", Error, ": ", ErrorDescription(Error), ")"); return(Ticket); } //+------------------------------------------------------------------+ double IIFd(bool condition, double ifTrue, double ifFalse) { if (condition) return(ifTrue); else return(ifFalse); }

    2013-11-11   18:36
    Лучший ответ #2
    Накопленные выплаты 1854 RUB

    Приветствую. Вот еще полезная функция, коды ошибок исполнения. Функцию можно просто вставить в свой код и вызывать где надо. Или просто вставить в свой код, оформить в виде комментария и в случае если возникает какая-то ошибка, просто смотреть, что означает эта ошибка. string ErrorDescript(int error_code) { string error_string; switch(error_code) { //---- Коды ошибок, возвращаемые торговым сервером: case 0: error_string="Нет ошибок"; break; case 1: error_string="Нет ошибки, но результат неизвестен"; break; case 2: error_string="Общая ошибка"; break; case 3: error_string="Неправильные параметры"; break; case 4: error_string="Торговый сервер занят"; break; case 5: error_string="Старая версия клиентского терминала"; break; case 6: error_string="Нет связи с торговым сервером"; break; case 7: error_string="Недостаточно прав"; break; case 8: error_string="Слишком частые запросы"; break; case 9: error_string="Недопустимая операция нарушающая функционирование сервера"; break; case 64: error_string="Счет заблокирован"; break; case 65: error_string="Неправильный номер счета"; break; case 128: error_string="Истек срок ожидания совершения сделки"; break; case 129: error_string="Неправильная цена"; break; case 130: error_string="Неправильные стопы"; break; case 131: error_string="Неправильный объем"; break; case 132: error_string="Рынок закрыт"; break; case 133: error_string="Торговля запрещена"; break; case 134: error_string="Недостаточно денег для совершения операции"; break; case 135: error_string="Цена изменилась"; break; case 136: error_string="Нет цен"; break; case 137: error_string="Брокер занят"; break; case 138: error_string="Новые цены"; break; case 139: error_string="Ордер заблокирован и уже обрабатывается"; break; case 140: error_string="Разрешена только покупка"; break; case 141: error_string="Слишком много запросов"; break; case 145: error_string="Модификация запрещена, так как ордер слишком близок к рынку"; break; case 146: error_string="Подсистема торговли занята"; break; case 147: error_string="Использование даты истечения ордера запрещено брокером"; break; case 148: error_string="Количество открытых и отложенных ордеров достигло предела, установленного брокером."; break; //---- Коды ошибок выполнения MQL4-программы: case 4000: error_string="Нет ошибки"; break; case 4001: error_string="Неправильный указатель функции"; break; case 4002: error_string="Индекс массива - вне диапазона"; break; case 4003: error_string="Нет памяти для стека функций"; break; case 4004: error_string="Переполнение стека после рекурсивного вызова"; break; case 4005: error_string="На стеке нет памяти для передачи параметров"; break; case 4006: error_string="Нет памяти для строкового параметра"; break; case 4007: error_string="Нет памяти для временной строки"; break; case 4008: error_string="Неинициализированная строка"; break; case 4009: error_string="Неинициализированная строка в массиве"; break; case 4010: error_string="Нет памяти для строкового массива"; break; case 4011: error_string="Слишком длинная строка"; break; case 4012: error_string="Остаток от деления на ноль"; break; case 4013: error_string="Деление на ноль"; break; case 4014: error_string="Неизвестная команда"; break; case 4015: error_string="Неправильный переход"; break; case 4016: error_string="Неинициализированный массив"; break; case 4017: error_string="Вызовы DLL не разрешены"; break; case 4018: error_string="Невозможно загрузить библиотеку"; break; case 4019: error_string="Невозможно вызвать функцию"; break; case 4020: error_string="Вызовы внешних библиотечных функций не разрешены"; break; case 4021: error_string="Недостаточно памяти для строки, возвращаемой из функции"; break; case 4022: error_string="Система занята"; break; case 4050: error_string="Неправильное количество параметров функции"; break; case 4051: error_string="Недопустимое значение параметра функции"; break; case 4052: error_string="Внутренняя ошибка строковой функции"; break; case 4053: error_string="Ошибка массива"; break; case 4054: error_string="Неправильное использование массива-таймсерии"; break; case 4055: error_string="Ошибка пользовательского индикатора"; break; case 4056: error_string="Массивы несовместимы"; break; case 4057: error_string="Ошибка обработки глобальныех переменных"; break; case 4058: error_string="Глобальная переменная не обнаружена"; break; case 4059: error_string="Функция не разрешена в тестовом режиме"; break; case 4060: error_string="Функция не разрешена"; break; case 4061: error_string="Ошибка отправки почты"; break; case 4062: error_string="Ожидается параметр типа string"; break; case 4063: error_string="Ожидается параметр типа integer"; break; case 4064: error_string="Ожидается параметр типа double"; break; case 4065: error_string="В качестве параметра ожидается массив"; break; case 4066: error_string="Запрошенные исторические данные в состоянии обновления"; break; case 4067: error_string="Ошибка при выполнении торговой операции"; break; case 4099: error_string="Конец файла"; break; case 4100: error_string="Ошибка при работе с файлом"; break; case 4101: error_string="Неправильное имя файла"; break; case 4102: error_string="Слишком много открытых файлов"; break; case 4103: error_string="Невозможно открыть файл"; break; case 4104: error_string="Несовместимый режим доступа к файлу"; break; case 4105: error_string="Ни один ордер не выбран"; break; case 4106: error_string="Неизвестный символ"; break; case 4107: error_string="Неправильный параметр цены для торговой функции"; break; case 4108: error_string="Неверный номер тикета"; break; case 4109: error_string="Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта."; break; case 4110: error_string="Длинные позиции не разрешены. Необходимо проверить свойства эксперта."; break; case 4111: error_string="Короткие позиции не разрешены. Необходимо проверить свойства эксперта."; break; case 4200: error_string="Объект уже существует"; break; case 4201: error_string="Запрошено неизвестное свойство объекта"; break; case 4202: error_string="Объект не существует"; break; case 4203: error_string="Неизвестный тип объекта"; break; case 4204: error_string="Нет имени объекта"; break; case 4205: error_string="Ошибка координат объекта"; break; case 4206: error_string="Не найдено указанное подокно"; break; default: error_string=error_code;} return(error_string); }

    2011-03-13   13:21
    Лучший ответ #3
    Накопленные выплаты 14514 RUB

    Добрый день. Вот и я решил поделиться кодом написал функцию кодов ошибок на русском языке. string error(int eer) { string er; switch(eer) { //---- case 0: case 1: er="Нет ошибки, но результат неизвестен"; break; case 2: er="Общая ошибка"; break; case 3: er="Неправильные параметры"; break; case 4: er="Торговый сервер занят"; break; case 5: er="Старая версия клиентского терминала"; break; case 6: er="Нет связи с торговым сервером"; break; case 7: er="Недостаточно прав"; break; case 8: er="Слишком частые запросы"; break; case 9: er="Недопустимая операция нарушающая функционирование сервера"; break; case 64: er="Счет заблокирован"; break; case 65: er="Неправильный номер счета"; break; case 128: er="Истек срок ожидания совершения сделки"; break; case 129: er="Неправильная цена"; break; case 130: er="Неправильные стопы"; break; case 131: er="Неправильный объем"; break; case 132: er="Рынок закрыт"; break; case 133: er="Торговля запрещена"; break; case 134: er="Недостаточно денег для совершения операции"; break; case 135: er="Цена изменилась"; break; case 136: er="Нет цен"; break; case 137: er="Брокер занят"; break; case 138: er="Новые цены - Реквот"; break; case 139: er="Ордер заблокирован и уже обрабатывается"; break; case 140: er="Разрешена только покупка"; break; case 141: er="Слишком много запросов"; break; case 145: er="Модификация запрещена, так как ордер слишком близок к рынку"; break; case 146: er="Подсистема торговли занята"; break; case 147: er="Использование даты истечения ордера запрещено брокером"; break; case 148: er="Количество открытых и отложенных ордеров достигло предела "; break; //---- case 4000: er="Нет ошибки"; break; case 4001: er="Неправильный указатель функции"; break; case 4002: er="Индекс массива - вне диапазона"; break; case 4003: er="Нет памяти для стека функций"; break; case 4004: er="Переполнение стека после рекурсивного вызова"; break; case 4005: er="На стеке нет памяти для передачи параметров"; break; case 4006: er="Нет памяти для строкового параметра"; break; case 4007: er="Нет памяти для временной строки"; break; case 4008: er="Неинициализированная строка"; break; case 4009: er="Неинициализированная строка в массиве"; break; case 4010: er="Нет памяти для строкового массива"; break; case 4011: er="Слишком длинная строка"; break; case 4012: er="Остаток от деления на ноль"; break; case 4013: er="Деление на ноль"; break; case 4014: er="Неизвестная команда"; break; case 4015: er="Неправильный переход"; break; case 4016: er="Неинициализированный массив"; break; case 4017: er="Вызовы DLL не разрешены"; break; case 4018: er="Невозможно загрузить библиотеку"; break; case 4019: er="Невозможно вызвать функцию"; break; case 4020: er="eВызовы внешних библиотечных функций не разрешены"; break; case 4021: er="Недостаточно памяти для строки, возвращаемой из функции"; break; case 4022: er="Система занята"; break; case 4050: er="Неправильное количество параметров функции"; break; case 4051: er="Недопустимое значение параметра функции"; break; case 4052: er="Внутренняя ошибка строковой функции"; break; case 4053: er="Ошибка массива"; break; case 4054: er="Неправильное использование массива-таймсерии"; break; case 4055: er="Ошибка пользовательского индикатора"; break; case 4056: er="Массивы несовместимы"; break; case 4057: er="Ошибка обработки глобальныех переменных"; break; case 4058: er="Глобальная переменная не обнаружена"; break; case 4059: er="Функция не разрешена в тестовом режиме"; break; case 4060: er="Функция не подтверждена"; break; case 4061: er="Ошибка отправки почты"; break; case 4062: er="Ожидается параметр типа string"; break; case 4063: er="Ожидается параметр типа integer"; break; case 4064: er="Ожидается параметр типа double"; break; case 4065: er="В качестве параметра ожидается массив"; break; case 4066: er="Запрошенные исторические данные в состоянии обновления"; break; case 4067: er="Ошибка при выполнении торговой операции"; break; case 4099: er="Конец файла"; break; case 4100: er="Ошибка при работе с файлом"; break; case 4101: er="Неправильное имя файла"; break; case 4102: er="Слишком много открытых файлов"; break; case 4103: er="Невозможно открыть файл"; break; case 4104: er="Несовместимый режим доступа к файлу"; break; case 4105: er="Ни один ордер не выбран"; break; case 4106: er="Неизвестный символ"; break; case 4107: er="Неправильный параметр цены для торговой функции"; break; case 4108: er="Неверный номер тикета"; break; case 4109: er="Торговля не разрешена"; break; case 4110: er="Длинные позиции не разрешены"; break; case 4111: er="Короткие позиции не разрешены"; break; case 4200: er="Объект уже существует"; break; case 4201: er="Запрошено неизвестное свойство объекта"; break; case 4202: er="Объект не существует"; break; case 4203: er="Неизвестный тип объекта"; break; case 4204: er="Нет имени объекта"; break; case 4205: er="Ошибка координат объекта"; break; case 4206: er="Не найдено указанное подокно"; break; case 4207: er="Ошибка при работе с объектом"; break; default: er="unknown error"; } return(er); } //-------------------------------------------------------------------------------------+ Использовать в советнике так int er=GetLastError(); error(er);

    2014-11-23   12:07
    Лучший ответ #4
    Накопленные выплаты 160034 RUB

    Для отложек у меня отдельная функция была. В принципе тут все то же самое. Так что совместить две функции в одну совсем не трудно. //+------------------------------------------------------------------+ int SendPendingOrder(int Type, double Lots, int TP, int SL, int Magic, string Cmnt, int& Error) { double Price, Take, Stop; int Ticket, Slippage, Color, Err; bool Delay = False; if(Debug) Print("Функция SendPendingOrder"); while(!IsStopped()) { if(!IsExpertEnabled()) { Error = ERR_TRADE_DISABLED; Print("Эксперту запрещено торговать!"); return(-1); } if(Debug)Print("Эксперту разрешено торговать"); if(!IsConnected()) { Error = ERR_NO_CONNECTION; Print("Связь отсутствует!"); return(-1); } if(Debug)Print("Связь с сервером установлена"); if(IsTradeContextBusy()) { Print("Торговый поток занят!"); Print("Ожидаем 3 сек..."); Sleep(3000); Delay = True; continue; } if(Debug)Print("Торговый поток свободен"); if(Delay) { if(Debug)Print("Обновляем котировки"); RefreshRates(); Delay = False; } else { if(Debug)Print("Задержек не было"); } switch(Type) { case OP_BUYSTOP: if(Debug)Print("Инициализируем параметры для BUYSTOP -ордера"); Price = NormalizeDouble(Ask + PO_EntryDistance * Point, Digits); Take = IIFd(TP == 0, 0, NormalizeDouble(Price + TP * Point, Digits)); Stop = IIFd(SL == 0, 0, NormalizeDouble(Price - SL * Point, Digits)); Color = Blue; break; case OP_SELLSTOP: if(Debug)Print("Инициализируем параметры для SELLSTOP-ордера"); Price = NormalizeDouble( Bid - PO_EntryDistance * Point, Digits); Take = IIFd(TP == 0, 0, NormalizeDouble(Price - TP * Point, Digits)); Stop = IIFd(SL == 0, 0, NormalizeDouble(Price + SL * Point, Digits)); Color = Red; break; default: if(Debug)Print("Тип ордера не соответствует требованиям."); return(-1); } Slippage = MarketInfo(Symbol(), MODE_SPREAD); if(Debug)Print("Slippage = ",Slippage); if(IsTradeAllowed()) { if(Debug)Print("Торговля разрешена, отправляем ордер..."); Ticket = OrderSend(Symbol(), Type, Lots, Price, Slippage, Stop, Take, Cmnt, Magic, 0, Color); if(Ticket < 0) { Err = GetLastError(); if (Err == 4 || /* SERVER_BUSY */ Err == 130 || /* INVALID_STOPS */ Err == 135 || /* PRICE_CHANGED */ Err == 137 || /* BROKER_BUSY */ Err == 138 || /* REQUOTE */ Err == 146 || /* TRADE_CONTEXT_BUSY */ Err == 136 ) /* OFF_QUOTES */ { Print("Ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err)); Print("Ожидаем 3 сек..."); Sleep(3000); Delay = True; continue; } else { Print("Критическая ошибка(OrderSend - ", Err, "): ", ErrorDescription(Err)); Error = Err; break; } } break; } else { Print("Эксперту запрещено торговать или торговый поток занят!"); Print("Ожидаем 3 сек..."); Sleep(3000); Delay = True; continue; } } if(Debug)Print("Ордер отправлен успешно. Тикет = ",Ticket); return(Ticket); }

    2011-12-08   02:05
    Лучший ответ #5
    Накопленные выплаты 18175 RUB

    А я вот такую написал, использовать ее намного удобнее, функция возвращает код ошибки: //+------------------------------------------------------------------+ int Error(string event) //Error(""); { string descr; int err = GetLastError(); switch(err) { // Коды ошибок, возвращаемые торговым сервером или клиентским терминалом: case 0: /*descr= "Нет ошибки";*/ return(0); case 1: descr= "Нет ошибки, но результат не известен"; break; case 2: descr= "Общая ошибка"; break; case 3: descr= "Неправильные параметры"; break; case 4: descr= "Торговый сервер занят"; break; case 5: descr = "Старая версия клиентского терминала"; break; case 6: descr= "Нет связи с торговым сервером"; break; case 7: descr= "Недостаточно прав"; break; case 8: descr= "Слишком частые запросы"; break; case 9: descr= "Недопустимая операция нарушающая функционирование сервера"; break; case 64: descr= "Счет заблокирован"; break; case 65: descr= "Неправильный номер счета"; break; case 128: descr= "Истек срок ожидания совершения сделки"; break; case 129: descr= "Неправильная цена"; break; case 130: descr= "Неправильные стопы"; break; case 131: descr= "Неправильный объем"; break; case 132: descr= "Рынок закрыт"; break; case 133: descr= "Торговля запрещена"; break; case 134: descr= "Недостаточно денег для совершения операции"; break; case 135: descr = "Цена изменилась"; break; case 136: descr = "Нет цен"; break; case 137: descr = "Брокер занят"; break; case 138: descr = "Новые цены"; break; case 139: descr = "Ордер заблокирован и уже обрабатывается"; break; case 140: descr = "Разрешена только покупка"; break; case 141: descr = "Слишком много запросов"; break; case 145: descr = "Модификация запрещена, так как ордер слишком близок к рынку"; break; case 146: descr = "Подсистема торговли занята"; break; case 147: descr= "Использование даты истечения ордера запрещено брокером"; break; case 148: descr= "Количество открытых и отложенных ордеров достигло предела, установленного брокером"; break; case 149: descr= "Попытка открыть противоположную позицию к уже существующей, если хеджирование запрещено"; break; case 150: descr= "Попытка закрыть позицию по инструменту в противоречии с правилом FIFO"; break; // Коды ошибок выполнения MQL4 программы: case 4000: /*descr= "Нет ошибки";*/ return(0); case 4001: descr= "Неправильный указатель функции"; break; case 4002: descr= "Индекс массива - вне диапазона"; break; case 4003: descr= "Нет памяти для стека функций"; break; case 4004: descr= "Переполнение стека после рекурсивного вызова"; break; case 4005: descr= "На стеке нет памяти для передачи параметров"; break; case 4006: descr= "Нет памяти для строкового параметра"; break; case 4007: descr= "Нет памяти для временной строки"; break; case 4008: descr= "Неинициализированная строка"; break; case 4009: descr= "Неинициализированная строка в массиве"; break; case 4010: descr= "Нет памяти для строкового массива"; break; case 4011: descr= "Слишком длинная строка"; break; case 4012: descr = "Остаток от деления на ноль"; break; case 4013: descr = "Деление на ноль"; break; case 4014: descr= "Неизвестная команда"; break; case 4015: descr= "Неправильный переход"; break; case 4016: descr= "Неинициализированный массив"; break; case 4017: descr= "Вызовы DLL не разрешены"; break; case 4018: descr= "Невозможно загрузить библиотеку"; break; case 4019: descr = "Невозможно вызвать функцию"; break; case 4020: descr= "Вызовы внешних библиотечных функций не разрешены"; break; case 4021: descr= "Недостаточно памяти для строки, возвращаемой из функции"; break; case 4022: descr= "Система занята"; break; case 4050: descr= "Неправильное количество параметров функции"; break; case 4051: descr= "Недопустимое значение параметра функции"; break; case 4052: descr = "Внутренняя ошибка строковой функции"; break; case 4053: descr= "Ошибка массива"; break; case 4054: descr = "Неправильное использование массива-таймсерии"; break; case 4055: descr= "Ошибка пользовательского индикатора"; break; case 4056: descr = "Массивы несовместимы"; break; case 4057: descr= "Ошибка обработки глобальныех переменных"; break; case 4058: descr= "Глобальная переменная не обнаружена"; break; case 4059: descr = "Функция не разрешена в тестовом режиме"; break; case 4060: descr= "Функция не подтверждена"; break; case 4061: descr= "Ошибка отправки почты"; break; case 4062: descr= "Ожидается параметр типа string"; break; case 4063: descr = "Ожидается параметр типа integer"; break; case 4064: descr= "Ожидается параметр типа double"; break; case 4065: descr= "В качестве параметра ожидается массив"; break; case 4066: descr = "Запрошенные исторические данные в состоянии обновления"; break; case 4099: descr= "Конец файла"; break; case 4100: descr= "Ошибка при работе с файлом"; break; case 4101: descr= "Неправильное имя файла"; break; case 4102: descr= "Слишком много открытых файлов"; break; case 4103: descr= "Невозможно открыть файл"; break; case 4104: descr= "Несовместимый режим доступа к файлу"; break; case 4105: descr = "Ни один ордер не выбран"; break; case 4106: descr= "Неизвестный символ"; break; case 4107: descr= "Неправильный параметр цены для торговой функции"; break; case 4108: descr= "Неверный номер тикета"; break; case 4109: descr= "Торговля не разрешена"; break; case 4110: descr= "Длинные позиции не разрешены"; break; case 4111: descr= "Короткие позиции не разрешены"; break; case 4200: descr = "Объект уже существует"; break; case 4201: descr= "Запрошено неизвестное свойство объекта"; break; case 4202: descr= "Объект не существует"; break; case 4203: descr= "Неизвестный тип объекта"; break; case 4204: descr = "Нет имени объекта"; break; case 4205: descr= "Ошибка координат объекта"; break; case 4206: descr = "Не найдено указанное подокно"; break; case 4207: descr= "Ошибка при работе с объектом"; break; } Print(event,": ",descr,", № ошибки - ",err); return(err); } //+------------------------------------------------------------------+Пользоваться так - Error("описание контролируемого события"); и все . Пример: int start() { Error("В этом месте"); int x = 1/x; return(0); }



    Изображение
    Превью
    2018-02-13   04:29
    Лучший ответ #6
    Накопленные выплаты 21138 RUB

    Привет! МТ5 человеку нужно было, там возможно получить тиковую историю и соответственно есть возможность найти экстремумы точно по времени.



    Изображение
    Превью
  4. Линк#64
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    MQL код:

    //====================================
    // show MessageBox
    //====================================
    //---------------------------
    string info[3];

    void upInfo(){
    for(int i = 1; i <= 2; i++){
    info[i-1] = info[i];
    }
    }

    void ShowInfo(){

    int y_startdistance = 50;

    int ks = ArraySize(info);
    string infoName = "info";
    for(int i = 0; i < ks ; i++){
    string oName = StringConcatenate(infoName,i);
    //---
    if(ObjectFind(oName) == -1){
    ObjectCreate(oName,OBJ_LABEL,0,0,0);
    }
    //---
    ObjectSet(oName,OBJPROP_XDISTANCE,30);
    ObjectSet(oName,OBJPROP_YDISTANCE,y_startdistance-i*20);
    ObjectSet(oName,OBJPROP_CORNER,2);
    //--- color
    if(i == 0){
    color clr = Silver;
    }
    //---
    if(i == 1){
    clr = Coral;
    }
    //---
    if(i == 2){
    clr = Red;
    }

    ObjectSetText(oName, info[ks-1-i], 10, "Arial", clr);
    }
    }

    void addInfo(string mess){
    upInfo();

    string sTime = TimeToStr(TimeLocal(),TIME_DATE|TIME_MINUTES);
    mess = StringConcatenate(mess," | ",sTime);
    info[2] = mess;
    ShowInfo();
    }


    Использование в коде: addInfo("Hello World!");

    Последний раз редактировалось Gold; 24.07.2014 в 18:33.

  5. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  6. Линк#65
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    MQL код:

    int getTFByNum(int num){
    switch(num){
    case 0: return(1) ;
    case 1: return(5) ;
    case 2: return(15) ;
    case 3: return(30) ;
    case 4: return(60) ;
    case 5: return(240) ;
    case 6: return(1440) ;
    case 7: return(10800) ;
    case 8: return(43200) ;
    default: return(1) ;
    }
    }

    и еще одна
    MQL код:

    int getNumByTF(int min){
    switch(min){
    case 1 : return(0);
    case 5 : return(1);
    case 15 : return(2);
    case 30 : return(3);
    case 60 : return(4);
    case 240 : return(5);
    case 1440 : return(6);
    case 10800 : return(7);
    case 43200 : return(8);
    default: return(0);
    }
    }


    где можно применять?
    Например, если требуется узнать следующий стандартный (встроенный в МТ4) таймфрейм в минутах, начиная с текущего.
    MQL код:

    getTFByNum(getNumByTF(Period())+1)

    Последний раз редактировалось Gold; 24.07.2014 в 18:34.

  7. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  8. Линк#66
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    GetZZExtrByNum
    Возвращает значение экстремума зигзага по его порядковому номеру

    MQL код:

    double GetZZExtrByNum(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    Ver: 0.0.1
    Date: 2012.06.07
    Autor: artamir
    Description: Возвращает значение экстремума зигзага по его порядковому номеру
    VARS:
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    Return: Цену экстремума зигзага
    */
    if(sy == ""){
    sy = Symbol();
    }
    //---
    string iname = "ZigZag"; // Имя индикатора, по которому будем расчитывать экстремумы
    //======================
    int thisBar = 0; // бар, на котором получаем значение зигзага
    if(shift > 0){
    thisBar = shift;
    }

    int thisNum = 0; // Текущий экстремум зигзага
    //---
    while(thisBar < iBars(sy, tf) && thisNum <= num){
    double thisExtr = iCustom(sy, tf, iname, dp, dv, bc, 0, thisBar);
    if(thisExtr > 0){
    thisNum++;
    }
    //---
    thisBar++;
    }
    //---
    return(thisExtr);
    }


    В прицепе скрипт для проверки работы функции.
    paperclip Вложения

    Последний раз редактировалось Gold; 24.07.2014 в 18:34.

  9. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  10. Линк#67
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    GetZZExtrBarByNum
    Возвращает номер бара экстремума зигзага по его (экстремуму) порядковому номеру
    MQL код:

    int GetZZExtrBarByNum(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    Ver: 0.0.1
    Date: 2012.06.07
    Autor: artamir
    Description: Возвращает номер бара экстремума зигзага по его (экстремуму) порядковому номеру
    VARS:
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    Return: Номер бара экстремума зигзага
    */
    if(sy == ""){
    sy = Symbol();
    }
    //---
    string iname = "ZigZag"; // Имя индикатора, по которому будем расчитывать экстремумы
    //======================
    int thisBar = 0; // бар, на котором получаем значение зигзага
    if(shift > 0){
    thisBar = shift;
    }

    int thisNum = 0; // Текущий экстремум зигзага
    //---
    while(thisBar < iBars(sy, tf) && thisNum <= num){
    double thisExtr = iCustom(sy, tf, iname, dp, dv, bc, 0, thisBar);
    if(thisExtr > 0){
    thisNum++;
    }
    //---
    thisBar++;
    }
    //---
    return(thisBar-1);
    }

    В прицепе скрипт для тестирования функции
    paperclip Вложения

    Последний раз редактировалось Gold; 24.07.2014 в 18:34.

  11. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  12. Линк#68
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    IsZZExtrUP
    Возвращает true, если заданый экстремум является вершиной
    MQL код:

    //================================================== =========
    bool IsZZExtrUP(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    Ver: 0.0.1
    Date: 2012.06.07
    Autor: artamir
    Description: Возвращает true, если заданый экстремум является вершиной
    VARS:
    num = номер экстремума
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    Return: true, если заданый экстремум является вершиной
    */
    if(sy == ""){
    sy = Symbol();
    }

    double h = iHigh(sy, tf, GetZZExtrBarByNum(num, sy, tf, dp, dv, bc, shift));
    double ZZ = GetZZExtrByNum(num, sy, tf, dp, dv, bc, shift);

    h = NormalizeDouble(h ,Digits);
    ZZ = NormalizeDouble(ZZ ,Digits);

    if(h == ZZ){
    return(true);
    }else{
    return(false);
    }
    }


    В прицепе скрипт для проверки функции.
    paperclip Вложения

    Последний раз редактировалось Gold; 24.07.2014 в 18:35.

  13. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  14. Линк#69
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    IsZZExtrDW

    Возвращает true, если заданый экстремум является впадиной

    MQL код:

    bool IsZZExtrDW(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    Ver: 0.0.1
    Date: 2012.06.07
    Autor: artamir
    Description: Возвращает true, если заданый экстремум является впадиной
    VARS:
    num = номер экстремума
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    Return: true, если заданый экстремум является впадиной
    */
    if(sy == ""){
    sy = Symbol();
    }

    double l = iLow(sy, tf, GetZZExtrBarByNum(num, sy, tf, dp, dv, bc, shift));
    double ZZ = GetZZExtrByNum(num, sy, tf, dp, dv, bc, shift);

    l = NormalizeDouble(l ,Digits);
    ZZ = NormalizeDouble(ZZ ,Digits);

    if(l == ZZ){
    return(true);
    }else{
    return(false);
    }
    }


    В прицепе скрипт для проверки функции
    paperclip Вложения

    Последний раз редактировалось Gold; 24.07.2014 в 18:35.

  15. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  16. Линк#70
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    GetZZExtrUPByNum

    Возвращает цену заданного номера вершины

    MQL код:

    double GetZZExtrUPByNum(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    Ver: 0.0.1
    Date: 2012.06.07
    Autor: artamir
    Description: Возвращает цену заданного номера вершины
    VARS:
    num = номер вершины
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    Return: Возвращает цену заданного номера вершины
    */

    if(sy == ""){
    sy = Symbol();
    }
    //---
    double thisExtr = 0;
    int thisExtrNum = 0;
    int thisUPNum = 0;

    while(thisUPNum <= num){
    if(IsZZExtrUP(thisExtrNum, sy, tf, dp, dv, bc, shift)){
    thisUPNum++;
    thisExtr = GetZZExtrByNum(thisExtrNum, sy, tf, dp, dv, bc, shift);
    }
    thisExtrNum++;
    }
    return(thisExtr);
    }


    В прицепе скрипт для проверки функции
    paperclip Вложения

    Последний раз редактировалось Gold; 24.07.2014 в 18:35.

  17. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  18. Линк#71
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    GetZZExtrDWByNum

    Возвращает цену заданного номера впадины

    MQL код:

    double GetZZExtrDWByNum(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    Ver: 0.0.1
    Date: 2012.06.07
    Autor: artamir
    Description: Возвращает цену заданного номера впадины
    VARS:
    num = номер впадины
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    Return: Возвращает цену заданного номера впадины
    */

    if(sy == ""){
    sy = Symbol();
    }
    //---
    double thisExtr = 0;
    int thisExtrNum = 0;
    int thisDWNum = 0;

    while(thisDWNum <= num){
    if(IsZZExtrDW(thisExtrNum, sy, tf, dp, dv, bc, shift)){
    thisDWNum++;
    thisExtr = GetZZExtrByNum(thisExtrNum, sy, tf, dp, dv, bc, shift);
    }
    thisExtrNum++;
    }
    return(thisExtr);
    }


    В прицепе скрипт для проверки функции
    paperclip Вложения

    Последний раз редактировалось Gold; 24.07.2014 в 18:35.

  19. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  20. Линк#72
    Кандидат форумных наук
    no
     
    fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация Аватар для fore-x
    Регистрация:
    18.03.2011
    Пол:
    Мужчина
    Сообщений:
    1,716
    Деньги за посты (Подробнее):
    18175 RUB
    Поставил лайков:
    440
    Получено лайков:  584
    в 399 сообщениях
    34%
    Индикаторная функция, пиликает при появлении нового бара (имеется слабенькая защита от частых срабатываний при обновлении графика):

    MQL код:
    bool NewBar(string sound)
    {
    int cbars = IndicatorCounted(); static int temp;
    if(cbars == temp || cbars == 0) return(false);
    if(temp == 0) {temp = cbars; return(false);}
    temp = cbars; PlaySound(sound); return(true);
    }

    Последний раз редактировалось Gold; 13.06.2012 в 21:07.

  21. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  22. Линк#73
    Кандидат форумных наук
    Посетила Муза
     
    sss2019 хорошая репутация sss2019 хорошая репутация sss2019 хорошая репутация sss2019 хорошая репутация Аватар для sss2019
    Регистрация:
    03.08.2010
    Пол:
    Мужчина
    Сообщений:
    1,914
    Деньги за посты (Подробнее):
    64785 RUB
    Поставил лайков:
    201
    Получено лайков:  447
    в 301 сообщениях
    23%
    Цитата Сообщение от fore-x Посмотреть сообщение
    Индикаторная функция, пиликает при появлении нового бара (имеется слабенькая защита от частых срабатываний при обновлении графика):

    MQL код:
    bool NewBar(string sound)
    {
    int cbars = IndicatorCounted(); static int temp;
    if(cbars == temp || cbars == 0) return(false);
    if(temp == 0) {temp = cbars; return(false);}
    temp = cbars; PlaySound(sound); return(true);
    }
    А не проще будет сделать

    MQL код:

    static int time;
    if(time != Time[0])
    {
    PlaySound();
    time = Time[0];
    }


    И никакая защита ненужна

    Последний раз редактировалось Gold; 24.07.2014 в 18:35.

  23. Линк#74
    Кандидат форумных наук
    no
     
    fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация Аватар для fore-x
    Регистрация:
    18.03.2011
    Пол:
    Мужчина
    Сообщений:
    1,716
    Деньги за посты (Подробнее):
    18175 RUB
    Поставил лайков:
    440
    Получено лайков:  584
    в 399 сообщениях
    34%
    Цитата Сообщение от sss2019 Посмотреть сообщение

    При такой постановке, Ваш индикатор будет пиликать на каждое изменение периода, от чего я и ставил защиту. Суть такая: открыли график - тишина, появился новый бар - пиликнули, а с Вашим кодом так не получится. Защита нужна, а то это пиликание потом так надоест !


  24. Линк#75
    Кандидат форумных наук
    dima-mestnyi приемлемый уровень репутации Аватар для dima-mestnyi
    Регистрация:
    31.05.2012
    Пол:
    Мужчина
    Сообщений:
    1,076
    Деньги за посты (Подробнее):
    12601 RUB
    Поставил лайков:
    95
    Получено лайков:  100
    в 92 сообщениях
    9%
    Цитата Сообщение от fore-x Посмотреть сообщение
    При такой постановке, Ваш индикатор будет пиликать на каждое изменение периода, от чего я и ставил защиту. Суть такая: открыли график - тишина, появился новый бар - пиликнули, а с Вашим кодом так не получится. Защита нужна, а то это пиликание потом так надоест !
    Попробуйте так.
    MQL код:
    NewTime=Time[0];//Получаем новое время
    if( NewTime>OldTimer ) { PlaySound(); OldTimer=Time[0]; }//если новое больше старого - тилили и старому присваивается текущее и пока бар не смениться - будет молчать.

    Последний раз редактировалось Gold; 13.06.2012 в 21:06.

  25. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  26. Линк#76
    Кандидат форумных наук
    no
     
    fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация Аватар для fore-x
    Регистрация:
    18.03.2011
    Пол:
    Мужчина
    Сообщений:
    1,716
    Деньги за посты (Подробнее):
    18175 RUB
    Поставил лайков:
    440
    Получено лайков:  584
    в 399 сообщениях
    34%
    Цитата Сообщение от dima-mestnyi Посмотреть сообщение
    Попробуйте так.
    MQL код:
    NewTime=Time[0];//Получаем новое время
    if( NewTime>OldTimer ) { PlaySound(); OldTimer=Time[0]; }//если новое больше старого - тилили и старому присваивается текущее и пока бар не смениться - будет молчать.
    Представьте такую ситуацию, Вы меняете таймфрейм, но график еще не обновлен!
    Переменная NewTime=Time[0]; получает время - но оно не будет новым после того, как график обновится (получаем - лишнее звуковое срабатывание).

    Я же предлагаю, контролировать это при помощи функции - IndicatorCounted(), которая на не обновленном графике возвращает - ноль.

    Получается следующее:
    MQL код:
    if(IndicatorCounted() == 0) return; // выходим из функции без звукового сигнала
    if(IndicatorCounted() == 0) temp = delit;// ну или обнуляем все временные переменные в функции старт

    Последний раз редактировалось Gold; 13.06.2012 в 21:06.

  27. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  28. Линк#77
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    В пред. посте есть ошибки.
    Исправленный вариант
    MQL код:

    double getEMA(int per = 21, int shift = 0, int d = -1){
    /*
    Ver: 0.0.2
    Date: 2012.06.22
    Author: artamir
    Description: Возвращает значение ЕМА для заданного
    периода и смещения по текущему таймфрейму
    VARS:
    per = период МА
    shift = номер бара для расчета МА
    d = точность расчетного значения (-1 = Точность текущего инструмента)
    */
    if(d == -1){
    d = Digits;
    }
    //===============================================
    double ma = iMA(Symbol(), 0, per, 0, 1, 0, shift);
    ma = NormalizeDouble(ma, d);
    //===============================================
    return(ma);
    }



    где может понадобиться?
    в определении номера бара последнего пересечения двух МА

    Последний раз редактировалось Gold; 24.07.2014 в 18:36.

  29. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  30. Линк#78
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    GetEMALastCrossBar

    MQL код:

    int GetEMALastCrossBar(int f_per = 5, int s_per = 21, int start = 1){
    /*
    Ver: 0.0.1
    Date: 2012.06.22
    Author: artamir
    Description: Возвращает номер бара последнего пересечения быстрой
    и медленной ЕМА на текущем инструменте, по текущему
    таймфрейму
    VARS:
    f_per = период быстрой ЕМА
    s_per = период медленной ЕМА
    start = номер бара, с которого начинается расчет в сторону увеличения номеров баров.
    */

    int limit = Bars - 1;
    //================================================== ===
    bool isCross = false;
    int thisBar = start;
    int crossBar = limit;
    //--------------------
    while(thisBar < limit && !isCross){
    //--------------------------------------------------
    double ma1_1 = getEMA(f_per, thisBar, Digits+2);
    double ma1_2 = getEMA(f_per, thisBar+1, Digits+2);
    //--------------------------------------------------
    double ma2_1 = getEMA(s_per, thisBar, Digits+2);
    double ma2_2 = getEMA(s_per, thisBar+1, Digits+2);
    //==================================================
    if(ma1_1 > ma2_1 && ma1_2 < ma2_2){
    isCross = true;
    crossBar = thisBar;
    }
    //==================================================
    if(ma1_1 < ma2_1 && ma1_2 > ma2_2){
    isCross = true;
    crossBar = thisBar;
    }
    thisBar++;
    }
    //================================================== ===
    return(crossBar);
    }


    Пример использования в коде:
    MQL код:

    int crossBar_5_21_1 = GetEMALastCrossBar(); //Вернет последнее пересечение 5-й и 21-й ЕМА начиная с первого бара.


    или если нужно не с первого бара, а с десятого
    MQL код:

    int crossBar = GetEMALastCross(,,10);

    Последний раз редактировалось Gold; 24.07.2014 в 18:37.

  31. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  32. Линк#79
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    Break Point

    Точка останова.

    MQL код:

    void BP(string txt="", string p11="", string p12="", string p21="", string p22="", string p31="", string p32="", string p41="", string p42=""){
    /*
    Ver: 0.0.1
    */
    static int flag = 1; //если = 1 то при следующем попадании в эту функцию будет выскакивать
    //окно MessageBoxA с текстом переданным в парамерах.
    //отладка прерывается при нажатии кнопки Cancel окна MessageBoxA

    string Comm="";
    Comm=Comm+"Bid="+Bid+"\n";
    Comm=Comm+"Ask="+Ask+"\n";
    //-----------------------
    Comm=Comm+p11+p12+"\n"
    +p21+p22+"\n"
    +p31+p32+"\n"
    +p41+p42;

    Comment(Comm);
    Print(Comm);
    //Press/release Pause button
    //19 is a Virtual Key code of "Pause" button
    //Sleep() is needed, because of the probability
    //to misprocess too quick pressing/releasing
    //of the button
    //-----------------------------------------
    //keybd_event(123,0,0,0);//F12
    keybd_event(19,0,0,0);//Выполнение ставится на паузу
    if(flag == 1){
    if(MessageBoxA(WindowHandle(Symbol(), 0),Comm,txt,MB_OKCANCEL) == 1){
    return;
    }else{
    flag = 2;
    return;
    }
    }

    }


    Данную функцию можно применять при отладке программы в визуальном режиме тестера стратегий.
    Для корректной работы этой функции необходимо наличие файла WinUser32.mqh из стандартной поставки Metatrader4 в папке "include".

    Последний раз редактировалось Gold; 24.07.2014 в 18:37.

  33. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  34. Линк#80
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    libNormalize_Digits

    Нормализует значение типа double количеством знаков после запятой для заданного инструмента.

    MQL код:

    double libNormalize_Digits(double d, string sy = ""){
    /*
    >Ver : 0.0.1
    >Date : 2012.06.25
    >Hist:
    @0.0.1@2012.06.25@artamir [+]
    >Desc:
    Нормализует значение типа double количеством знаков после запятой для заданного инструмента.
    */
    //==================================
    if(sy == ""){
    sy = Symbol();
    }
    //----------------------------------
    if(d == 0){
    return(0);
    }
    //----------------------------------
    double di = MarketInfo(sy, MODE_DIGITS);
    return(NormalizeDouble(d, di));
    }

    Последний раз редактировалось Gold; 24.07.2014 в 18:37.

  35. post_thanks Получено лайков: 1

    Gold (02.07.2012)

  36. Линк#81
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    GetZZExtrTimeByNum

    Возвращает время образования экстремума зигзага по номеру экстремума, начиная с 0

    MQL код:

    datetime GetZZExtrTimeByNum(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    >Ver : 0.0.1
    >Date : 2012.07.02
    >History:
    @0.0.1@2012.07.02@artamir [*] Добавлен базовый функционал.
    >Description:
    Возвращает время образования экстремума зигзага по номеру экстремума, начиная с 0
    >VARS:
    num = номер вершины/впадины
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    */
    //------------------------------------
    datetime dt = 0;
    //--------------
    if(sy == ""){
    sy = Symbol();
    }
    //------------------------------------
    int bar_Extr = GetZZExtrBarByNum(num, sy, tf, dp, dv, bc, shift);
    dt = iTime(sy, tf, bar_Extr);
    //------------------------------------
    return(dt);
    }


    Использование в коде:
    MQL код:

    datetime dt = GetZZExtrTimeByNum(); // возвращает время образования 0-го экстремума зигзага на текущем инструменте и на текущем таймфрейме
    paperclip Вложения

    Последний раз редактировалось Gold; 24.07.2014 в 18:37. Причина: заменил тег mql на тег php, из-за некорректного отображения кода под тегом mql.

  37. post_thanks Получено лайков: 2

    Gold (02.07.2012), Kofa (10.11.2017)

  38. Линк#82
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Деньги за посты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:  56
    в 44 сообщениях
    49%
    IsNewExtrZZ

    Определяет, является ли заданный номер екстремума новым.
    Т.е. изменилось ли время для заданного номера экстремума.

    MQL код:

    bool IsNewExtrZZ(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0){
    /*
    >Ver : 0.0.1
    >Date : 2012.07.02
    >History:
    @0.0.1@2012.07.02@artamir []
    >Description:
    Определяет, является ли заданный номер екстремума новым.
    >VARS:
    num = номер вершины/впадины
    sy = Наименование инструмента
    tf = таймфейм в минутах
    dp = Depth
    dv = Deviation
    bc = Backstep
    shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
    */
    //-----------------------------------
    bool res = false;

    static datetime lt; // последнее время образования заданного номера экстремума
    //-----------------------------------
    datetime dt = GetZZExtrTimeByNum(num, sy, tf, dp, dv, bc, shift);
    //---------
    if(lt < dt){
    // у нас изменилось время образования заданного номера экстремума
    lt = dt;
    return(true); // выйдем из функции с возвратом true
    }
    //-----------------------------------
    return(res);
    }


    Можно использовать в советниках например так:
    MQL код:

    int start()
    {
    //----
    if(IsNewExtrZZ()){ // если образовался новый нулевой экстремум на текущем инструменте/таймфрейме, тогда Алерт :)
    Alert(GetZZExtrTimeByNum());
    }
    //----
    return(0);
    }

    Последний раз редактировалось Gold; 24.07.2014 в 18:37. Причина: MQL

  39. post_thanks Получено лайков: 1

    Gold (02.07.2012)

    <a href="https://www.instaforex.com/ru/forexcopy_system">Форекс портал</a>
  40. Линк#83
    Кандидат форумных наук
    no
     
    fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация fore-x хорошая репутация Аватар для fore-x
    Регистрация:
    18.03.2011
    Пол:
    Мужчина
    Сообщений:
    1,716
    Деньги за посты (Подробнее):
    18175 RUB
    Поставил лайков:
    440
    Получено лайков:  584
    в 399 сообщениях
    34%
    MQL код:
    #property indicator_chart_window

    void start()
    {

    Comment(PercentEquity());
    }

    double StartEquity(string name , double value)
    {
    if(OrdersTotal()==0 || GlobalVariableCheck(name)==false || GlobalVariableSet(name, value) == 0) return(value);
    if(OrdersTotal()> 0) return(GlobalVariableGet(name));
    }

    double PercentEquity()
    {
    return(AccountEquity()*100/StartEquity("AccountEquity", AccountEquity()));
    }
    функция запоминает текущий эквити и начинает считать проценты от него.
    Когда количество ордеров будет равно нулю, эквити снова запоминается и т.д

    Количество выведенных и введенных средств на торговый счет - не учитывается.

    Последний раз редактировалось Gold; 23.11.2012 в 22:59. Причина: MQL


Страница 4 из 11
Первая ... 3 4 5 ... Последняя ◄╝

Похожие темы

  1. Некоторые секреты МТ4
    от Андрей Сырбу в разделе Трейдерский софт, компьютерное оборудование
    Replies: 2378
    Последнее сообщение: Сегодня, 19:44
  2. FAQ: Полезные функции форума (подписка на темы, уведомления, черновики, и др.)
    от Странник_РУ в разделе Вопросы к администрации форума
    Replies: 7
    Последнее сообщение: 07.02.2020, 13:40
  3. Некоторые психотехники
    от сват в разделе Психология трейдера
    Replies: 2149
    Последнее сообщение: 18.01.2020, 18:10
  4. MQL5: Некоторые полезные функции
    от Gold в разделе MQL-программирование, АТС
    Replies: 25
    Последнее сообщение: 26.02.2019, 10:54
  5. Банкомат. Некоторые особенности
    от Volangott в разделе Свободное общение
    Replies: 0
    Последнее сообщение: 27.03.2014, 16:30

Метки этой темы