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

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

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

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

    Отправка маркет-ордера на сервер.
    [MQL]
    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);
    }
    [/MQL]

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

    Приветствую. Вот еще полезная функция, коды ошибок исполнения. Функцию можно просто вставить в свой код и вызывать где надо. Или просто вставить в свой код, оформить в виде комментария и в случае если возникает какая-то ошибка, просто смотреть, что означает эта ошибка.
    [MQL]
    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);
    }
    [/MQL]

    2019-10-14   19:52
    Лучший ответ #3
    Накопленные выплаты 72086 RUB

    Цитата Сообщение от Gulliwer Посмотреть сообщение
    Добрый день!Нужна функция сравнения двух рыночных ордеров с указанным типом и ID по размеру лота (>/<)..
    Цитата Сообщение от Gulliwer Посмотреть сообщение
    Если кто набросает здесь код этой функции,буду очень признателен..
    Хорошо, напишу вам... только уточните какие есть исходные данные и что нужно получить на выходе функции, цифры или там какие нить слова, чтобы согласовать с вашими дальнейшими действиями.
    Еще такой непонятный момент.. вы написали больше - меньше, но забыли про третье состояние... равенство лотов. Или, при определенных условиях достаточно true/false. Например, лот первого ордера больше второго- true, во всех остальных случаях- false. Уточните.
    Далее.. как минимум, нужны еще их тикеты. Но! если известны тикеты, то тип и ID уже не обязательны. По сему, скорее всего тикеты неизвестны, их нужно найти по каким то признакам, ибо ордеров может быть множество на счете, и с данным типам и с таким ID. Как то так, больше инфы.

    2019-10-17   17:42
    Лучший ответ #4
    Накопленные выплаты 72086 RUB

    Цитата Сообщение от Gulliwer Посмотреть сообщение
    Да,их может быть больше..Тикеты здесь не важны..Нужно простое сравнение лотности ордеров с определенным ID(магиком),определенным типом(BUY,SELL),на одном символе..Например:если лот бай1 больше лот сел2 и OrderSymbol() == Symbol(),то TRUE...дальнейшие мои какие-то действия..Из этой функции сделаю уже сам блок в генератор..Заранее извиняюсь за свою некомпетентность,не знаю,возможно ли так все сделать,выбрать,найти ордер,не учитывая тикер его...
    Все равно не добился от вас признаков, по каким выбирать ордера, если их множество. Можно и без тикетов. Вот привел пробный пример, по вашей просьбе. Однако, она не совсем корректная, если в рынке будет больше двух ордеров или один или 2 одного типа. Старайтесь писать код с перспективой на будущее и учитывать все нюансы. Что непонятно, спрашивайте, подредактируем.
    [MQL]//+-------------------------------------------------------------------+
    //| 17.10.2019 ; https://forexdengi.com |
    //+-------------------------------------------------------------------+
    //| Описание : Сравнение лотности двух ордеров разных типов |
    //+-------------------------------------------------------------------+
    bool CompareLot(int ot1=-1,int ot2=-1,int mn=-1) {
    int type,k=OrdersTotal();
    double lots_1=0.0,lots_2=0.0;
    bool result=false;
    for(i=0; i<k; i++) {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { // Выбор ордера из списка
    if(OrderSymbol() == Symbol() && OrderMagicNumber() == mn) { // Фильтр по символу и по ID
    type=OrderType();
    if(type>1) continue;
    if(type==OP_BUY && type==ot1) lots_1=OrderLots(); // Заносим баерский лот в переменную
    if(type==OP_SELL && type==ot2) lots_2=OrderLots(); // Заносим селерский лот в переменную
    }}}
    if(lots_1>lots_2) result=true; // Сравниваем лотность
    return (result); // Возвращаем результат
    }
    // Вызов функции сравнения лотности ордеров
    if(CompareLot(OP_BUY,OP_SELL,Magic)) {
    // Здесь какие нить действия, если лот ордера бай больше лота ордера селл
    }
    else {
    // Здесь какие нить действия, если лот ордера бай меньше лота ордера селл или равен
    }[/MQL]
    Цитата Сообщение от Gulliwer Посмотреть сообщение
    не знаю,возможно ли так все сделать,выбрать,найти ордер,не учитывая тикер его
    Какие то еще есть признаки... например, максимальная-минимальная цена, время открытия, привязка к барам... исходя из логики проектируемого советника. Нужен уникальный признак, чтобы гарантированно выбрать тот или иной ордер

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

    Добрый день.
    Вот и я решил поделиться кодом написал функцию кодов ошибок на русском языке.
    [MQL]
    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);
    }
    //-------------------------------------------------------------------------------------+
    [/MQL]Использовать в советнике так
    [MQL]int er=GetLastError();
    error(er);[/MQL]

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

    Цитата Сообщение от WsForex Посмотреть сообщение
    Полезная функция кто не понимает код ошибок
    Добрый день.
    Вот и я решил поделиться кодом написал функцию кодов ошибок на русском языке.
    Цитата Сообщение от WsForex Посмотреть сообщение
    Использовать в советнике так
    [MQL]int er=GetLastError();
    error(er)[/MQL];
    А я вот такую написал, использовать ее намного удобнее, функция возвращает код ошибки:
    [MQL]//+------------------------------------------------------------------+
    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);
    }
    //+------------------------------------------------------------------+[/MQL]Пользоваться так - Error("описание контролируемого события"); и все .
    Пример:
    [MQL]int start()
    {
    Error("В этом месте");
    int x = 1/x;
    return(0);
    }[/MQL]
    Вложение 181860

    Вложение
    Превью
  2. линк#61
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   439
    в 223 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано 0
    Получить количество ордеров (рыночных либо отложенных) данного типа.
    PHP код:
    int OrdersCount(int type){ int orders = 0; int cnt = OrdersTotal(); for (int i=0; i<cnt; i++) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; //Опционально //if (OrderSymbol() != Symbol()) continue; //Опционально //if (OrderMagicNumber() != Magic) continue; if (OrderType() == type) orders++; } return (orders);}
    В эксперте эту функцию можно использовать следующим образом:
    PHP код:
    int start() { int BuyCnt = OrdersCount(OP_BUY); if (BuyCnt > 0) return (0); ...

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

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

    Kofa (22.10.2017)

    <title>InstaForex</title><meta name="description" content="InstaForex"><a href="https://instaforex.org/ru/dragon_racing">InstaForex</a>
  4. линк#64
    Частый гость
    artamir приемлемый уровень репутации Аватар для artamir
    Регистрация:
    03.05.2012
    Пол:
    Мужчина
    Сообщений:
    114
    Накопленные выплаты (Подробнее):
    1226 RUB
    Поставил лайков:
    6
    Получено лайков:   56
    в 44 сообщениях
    49%
    ПодписатьсяПодписаться
    Подписано 0
    PHP код:
    //==================================== // 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%
    ПодписатьсяПодписаться
    Подписано 0
    PHP код:
    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) ; } }
    и еще одна
    PHP код:
    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) таймфрейм в минутах, начиная с текущего.
    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    GetZZExtrByNum
    Возвращает значение экстремума зигзага по его порядковому номеру

    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    GetZZExtrBarByNum
    Возвращает номер бара экстремума зигзага по его (экстремуму) порядковому номеру
    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    IsZZExtrUP
    Возвращает true, если заданый экстремум является вершиной
    PHP код:
    //===========================================================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%
    ПодписатьсяПодписаться
    Подписано 0
    IsZZExtrDW

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

    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    GetZZExtrUPByNum

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

    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    GetZZExtrDWByNum

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

    PHP код:
    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
    Получено лайков:   588
    в 401 сообщениях
    34%
    ПодписатьсяПодписаться
    Подписано 0
    Индикаторная функция, пиликает при появлении нового бара (имеется слабенькая защита от частых срабатываний при обновлении графика):

    PHP код:
    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
    Получено лайков:   457
    в 301 сообщениях
    24%
    ПодписатьсяПодписаться
    Подписано 0
    Цитата Сообщение от fore-x Посмотреть сообщение

    А не проще будет сделать

    PHP код:
    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
    Получено лайков:   588
    в 401 сообщениях
    34%
    ПодписатьсяПодписаться
    Подписано 0
    Цитата Сообщение от sss2019 Посмотреть сообщение

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


  24. линк#75
    Кандидат форумных наук
    dima-mestnyi приемлемый уровень репутации Аватар для dima-mestnyi
    Регистрация:
    31.05.2012
    Пол:
    Мужчина
    Сообщений:
    1,076
    Накопленные выплаты (Подробнее):
    12601 RUB
    Поставил лайков:
    95
    Получено лайков:   101
    в 93 сообщениях
    9%
    ПодписатьсяПодписаться
    Подписано 0
    Цитата Сообщение от fore-x Посмотреть сообщение
    При такой постановке, Ваш индикатор будет пиликать на каждое изменение периода, от чего я и ставил защиту. Суть такая: открыли график - тишина, появился новый бар - пиликнули, а с Вашим кодом так не получится. Защита нужна, а то это пиликание потом так надоест !
    Попробуйте так.
    PHP код:
    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
    Получено лайков:   588
    в 401 сообщениях
    34%
    ПодписатьсяПодписаться
    Подписано 0
    Цитата Сообщение от dima-mestnyi Посмотреть сообщение

    Представьте такую ситуацию, Вы меняете таймфрейм, но график еще не обновлен!
    Переменная NewTime=Time[0]; получает время - но оно не будет новым после того, как график обновится (получаем - лишнее звуковое срабатывание).

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

    Получается следующее:
    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    В пред. посте есть ошибки.
    Исправленный вариант
    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    GetEMALastCrossBar

    PHP код:
    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); }
    Пример использования в коде:
    PHP код:
    int crossBar_5_21_1 = GetEMALastCrossBar(); //Вернет последнее пересечение 5-й и 21-й ЕМА начиная с первого бара.
    или если нужно не с первого бара, а с десятого
    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    Break Point

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

    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    libNormalize_Digits

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

    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    GetZZExtrTimeByNum

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

    PHP код:
    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);}
    Использование в коде:
    PHP код:
    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%
    ПодписатьсяПодписаться
    Подписано 0
    IsNewExtrZZ

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

    PHP код:
    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);}
    Можно использовать в советниках например так:
    PHP код:
    int start() {//---- if(IsNewExtrZZ()){ // если образовался новый нулевой экстремум на текущем инструменте/таймфрейме, тогда Алерт :) Alert(GetZZExtrTimeByNum()); }//---- return(0); }

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

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

    Gold (02.07.2012)

    55pct
  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
    Получено лайков:   588
    в 401 сообщениях
    34%
    ПодписатьсяПодписаться
    Подписано 0
    PHP код:
    #property indicator_chart_windowvoid 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 ... Последняя ◄╝

Подписанные на тему (39)

Похожие темы

  1. Некоторые секреты МТ4
    от Андрей Сырбу в разделе Трейдерский софт, компьютерное оборудование
    Replies: 2384
    Последнее сообщение: 14.02.2021, 23:18
  2. Некоторые психотехники
    от сват в разделе Психология трейдера
    Replies: 2160
    Последнее сообщение: 29.12.2020, 18:21
  3. FAQ: Полезные функции форума (подписка, уведомления, черновики, и др.)
    от Странник_РУ в разделе Вопросы к администрации форума
    Replies: 9
    Последнее сообщение: 16.09.2020, 12:55
  4. MQL5: Некоторые полезные функции
    от Gold в разделе MQL-программирование, АТС
    Replies: 25
    Последнее сообщение: 26.02.2019, 10:54
  5. Банкомат. Некоторые особенности
    от Volangott в разделе Свободное общение
    Replies: 0
    Последнее сообщение: 27.03.2014, 16:30

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