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

Показаны сообщения: с 1 по 20 из 208

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

 Перейти в классический вид темы
  1. линк#1
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Получить количество ордеров (рыночных либо отложенных) данного типа.
    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)

    <a href="https://www.instaforex.com/ru/forexcopy_system">Форекс портал</a>
     
  3. ТОП сообщений
    2014-07-09   14:02
    Лучший ответ #1
    Накопленные выплаты 164763 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);
    }

    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);
    }

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

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

    2019-10-17   17:42
    Лучший ответ #4
    Накопленные выплаты 46509 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 {
    // Здесь какие нить действия, если лот ордера бай меньше лота ордера селл или равен
    }

    Цитата Сообщение от 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 код:
    int er=GetLastError();
    error(er);

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

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

    Вложение 181860

    Вложение
    Превью
  4. линк#2
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Получить время открытия последнего ордера данного типа.
    Смотрим в открытых ордерах и в истории.
    Если не найдено ордеров, удовлетворяющих условиям поиска, возвращаем -1.

    MQL код:
    datetime GetLastOpenTime(int type) {

    datetime tm = -1;

    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) continue;

    tm = MathMax(tm, OrderOpenTime());
    }

    cnt = HistoryTotal();
    for (i=0; i if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

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

    if (OrderType() != type) continue;

    tm = MathMax(tm, OrderOpenTime());
    }

    return (tm);
    }

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

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

    udhit (12.05.2016), Незарегистрированный (1 пользователь)

  6. линк#3
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Польза от функции GetLastOpenTime такая.
    Например мы не хотим открывать лонг-ордера чаще чем раз в 2 часа.
    Тогда условие на открытие будет выглядеть так:
    MQL код:
    if (CurTime() - GetLastOpenTime(OP_BUY) >= 2*60*60) {
    OrderSend(Symbol(), OP_BUY, ...
    }

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

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

    Unregistered (1 пользователь)

  8. линк#4
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Получить дату следующего дня:
    MQL код:
      datetime Time0 = CurTime();
    datetime Tomorrow = Time0 + 24*60*60;
    int day = TimeDayOfYear(Tomorrow);
    int month = TimeMonth(Tomorrow);
    int year = TimeYear(Tomorrow);

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

  9. линк#5
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Получить тикет последнего закрытого ордера из истории.
    Если тип ордера не указан, берется самый последний ордер любого типа.
    Если ордеров, отвечающих указанным критерию не найдено, возвращает -1.
    MQL код:
    int GetLastOrderHist(int type = -1) 
    {
    int ticket = -1;
    datetime dt = 0;
    int cnt = HistoryTotal();

    for (int i=0; i < cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

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

    if (type != -1 && OrderType() != type) continue;

    if (OrderCloseTime() > dt) {
    dt = OrderCloseTime();
    ticket = OrderTicket();
    }
    }

    return (ticket);
    }

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

  10. линк#6
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Функция для расчета рабочего лота по следующим условиям.
    lotmin - стартовый размер лота.
    lotmax - верхнее ограничение на размер лота.
    Если последняя сделка закрылась в +, то увеличиваем лот на величину lotstep.
    Как только последняя сделка закрылась в -, возвращаемся к lotmin.
    Т.е. при наступлении серии положительных сделок мы увеличиваем нагрузку на лот.

    Будем использовать функцию GetLastOrderHist, описанную выше.
    MQL код:

    // --- Параметры управления капиталом ---
    extern bool uplot = true; - вкл/выкл изменение величины лота
    extern int lastprofit = 1; - принимает значения -1/1.
    -1 - увеличение лота после минусовой сделки до первой плюсовой.
    1 - увеличение лота после плюсовой сделки до первой минусовой.
    extern double lotmin = 0.1; - начальное значение
    extern double lotmax = 0.5; - потолок
    extern double lotstep = 0.1; - приращение лота

    double GetLots() {

    double lot = lotmin;
    if (!uplot) return (lot);

    int ticket = GetLastOrderHist();
    if (ticket == -1) return (lot);

    if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lot);
    if (OrderProfit()*lastprofit < 0) return (lot);

    lot = MathMin(OrderLots() + lotstep, lotmax);
    return (lot);
    }

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

  11. линк#7
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Трейлинг-стоп.
    MinProfit - когда профит достигает указанное количество пунктов, трейлинг начинает работу
    TrailingStop - величина трала
    TrailingStep - шаг
    l - префикс для лонгов
    s - префикс для шортов
    MQL код:

    extern bool UseTrailing = true;
    extern int lMinProfit = 30;
    extern int sMinProfit = 30;
    extern int lTrailingStop = 15;
    extern int sTrailingStop = 15;
    extern int lTrailingStep = 5;
    extern int sTrailingStep = 5;

    if (UseTrailing) TrailingPositions();

    void TrailingPositions()
    {
    int cnt = OrdersTotal();

    for (int i=0; i if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;

    if (OrderType() == OP_BUY) {
    if (Bid-OrderOpenPrice() > lMinProfit*Point) {
    if (OrderStopLoss() < Bid-(lTrailingStop+lTrailingStep-1)*Point) {
    OrderModify(OrderTicket(), OrderOpenPrice(), Bid-lTrailingStop*Point, OrderTakeProfit(), 0, Blue);
    }
    }
    }

    if (OrderType() == OP_SELL) {
    if (OrderOpenPrice()-Ask > sMinProfit*Point) {
    if (OrderStopLoss() > Ask+(sTrailingStop+sTrailingStep-1)*Point || OrderStopLoss() == 0) {
    OrderModify(OrderTicket(), OrderOpenPrice(), Ask+sTrailingStop*Point, OrderTakeProfit(), 0, Blue);
    }
    }
    }
    }

    }

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

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

    gastyc (10.12.2016)

  13. линк#8
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    2 метода - Buy и Sell. Помимо открытия позиции нормализуют цены и выводят в лог входные параметры. Возвращают номер тикета, либо -1 в случае ошибки. После открытия ордера выдерживается установленный таймаут.
    MQL код:

    #include
    #include

    int SleepOk = 2000;
    int SleepErr = 6000;
    int Slippage = 3;

    //~~~~~

    int Buy(string symbol, double lot, double price, double sl, double tp, int magic, string comment="") {
    int dig = MarketInfo(symbol, MODE_DIGITS);

    price = NormalizeDouble(price, dig);
    sl = NormalizeDouble(sl, dig);
    tp = NormalizeDouble(tp, dig);

    string _lot = DoubleToStr(lot, 1);
    string _price = DoubleToStr(price, dig);
    string _sl = DoubleToStr(sl, dig);
    string _tp = DoubleToStr(tp, dig);

    Print("Buy "", symbol, "", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", "", comment, """);

    int res = OrderSend(symbol, OP_BUY, lot, price, Slippage, sl, tp, comment, magic);
    if (res >= 0) {
    Sleep(SleepOk);
    return (res);
    }

    int code = GetLastError();
    Print("Error opening BUY order: ", ErrorDescription(code), " (", code, ")");
    Sleep(SleepErr);

    return (-1);
    }

    int Sell(string symbol, double lot, double price, double sl, double tp, int magic, string comment="") {
    int dig = MarketInfo(symbol, MODE_DIGITS);

    price = NormalizeDouble(price, dig);
    sl = NormalizeDouble(sl, dig);
    tp = NormalizeDouble(tp, dig);

    string _lot = DoubleToStr(lot, 1);
    string _price = DoubleToStr(price, dig);
    string _sl = DoubleToStr(sl, dig);
    string _tp = DoubleToStr(tp, dig);

    Print("Sell "", symbol, "", ", _lot, ", ", _price, ", ", Slippage, ", ", _sl, ", ", _tp, ", ", magic, ", "", comment, """);

    int res = OrderSend(symbol, OP_SELL, lot, price, Slippage, sl, tp, comment, magic);
    if (res >= 0) {
    Sleep(SleepOk);
    return (res);
    }

    int code = GetLastError();
    Print("Error opening SELL order: ", ErrorDescription(code), " (", code, ")");
    Sleep(SleepErr);

    return (-1);
    }

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

  14. линк#9
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Открыть позицию в заданное время.
    Код удобнее всего поместить в скрипт, который работает в бесконечном цикле. Это даст возможность открыться в нужное время, не дожидаясь прихода первого тика.

    OpenTime - время открытия.
    OpenPeriod - рабочий интервал, мин
    MQL код:
      extern string OpenTime = "00:00";
    extern int OpenPeriod = 10;

    datetime tm0 = StrToTime(TimeToStr(CurTime(), TIME_DATE) + " " + OpenTime);
    datetime tm1 = tm0 + OpenPeriod*60;

    if (CurTime() < tm0 || CurTime() > tm1) return;

    //Открываем позицию либо ставим ордер

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

  15. линк#10
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Эксперт, закрывающий ордера по рынку с указанным тейкпрофитом.
    TakeProfit можно ставить 1, 2, 3
    MQL код:
    extern int TakeProfit = 2;
    extern int Slippage = 3;

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    void init () {
    }

    void deinit() {
    }

    void start() {

    if (TakeProfit == 0) return;

    int cnt = OrdersTotal();
    for (int i=cnt-1; i >= 0; i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
    if (OrderSymbol() != Symbol()) continue;

    int type = OrderType();
    if (type == OP_BUY) {
    if (Bid > OrderOpenPrice() + TakeProfit*Point)
    OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
    }

    if (type == OP_SELL) {
    if (Ask < OrderOpenPrice() - TakeProfit*Point)
    OrderClose(OrderTicket(), OrderLots(), Ask, Slippage);
    }
    }
    }

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

  16. линк#11
    Частый гость
    Dom1no стараюсь положительно себя зарекомендовать Аватар для Dom1no
    Регистрация:
    04.01.2010
    Сообщений:
    198
    Накопленные выплаты (Подробнее):
    574 RUB
    Поставил(а) лайков:
    0
    Получено лайков:   29
    в 23 сообщениях
    15%
    Подскажите,а как можно определить тип последнего ордера?


  17. линк#12
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Можно так:
    MQL код:
    datetime LastBuyTm = GetLastOrderOpenTime(OP_BUY);
    datetime LastSellTm = GetLastOrderOpenTime(OP_SELL);
    // LastBuyTm > LastSellTm: последним был BUY ордер
    // LastSellTm > LastBuyTm: последним был SELL ордер

    datetime GetLastOrderOpenTime(int type)
    {
    datetime tm = -1;

    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) continue;

    tm = MathMax(tm, OrderOpenTime());
    }

    cnt = HistoryTotal();
    for (i=0; i if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

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

    if (OrderType() != type) continue;

    tm = MathMax(tm, OrderOpenTime());
    }

    return (tm);
    }

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

  18. линк#13
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Функция возвращает длину цепочки ордеров с положительным профитом. Считаем с конца history.
    MQL код:
    int GetLastPositiveOrdersCount() 
    {
    int PosCnt = 0;
    int cnt = HistoryTotal();
    for (int i = cnt-1; i >=0; i--) {

    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
    //if (OrderSymbol() != Symbol()) continue;
    //if (OrderMagicNumber() != Magic) continue;


    int type = OrderType();
    if (type != OP_BUY && type != OP_SELL) continue;

    if (OrderProfit() < 0) break;

    PosCnt++;
    }

    return (PosCnt);
    }

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

  19. линк#14
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Подскажите,а как можно определить тип последнего ордера?
    Можно еще так:
    MQL код:
    datetime LastBuyTm = GetLastOrderOpenTime(OP_BUY);
    datetime LastSellTm = GetLastOrderOpenTime(OP_SELL);
    // LastBuyTm > LastSellTm: последним был BUY ордер
    // LastSellTm > LastBuyTm: последним был SELL ордер

    datetime GetLastOrderOpenTime(int type)
    {
    datetime tm = -1;

    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) continue;

    tm = MathMax(tm, OrderOpenTime());
    }

    cnt = HistoryTotal();
    for (i=0; i if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

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

    if (OrderType() != type) continue;

    tm = MathMax(tm, OrderOpenTime());
    }

    return (tm);
    }

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

  20. линк#15
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Способ программного закрытия терминала.
    MQL код:
    #include 

    int start() {
    int hwnd = WindowHandle(Symbol(), Period());
    int hwnd_parent = 0;

    while(!IsStopped()) {
    hwnd = GetParent(hwnd);
    if (hwnd == 0) break;
    hwnd_parent = hwnd;
    }

    if (hwnd_parent != 0)
    PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);

    return (0);
    }

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

  21. линк#16
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Полезная функция split и примеры ее использования.

    split - разделяет элементы строки и возвращает их в виде массива.

    Параметры:
    [OUT] string& arr[] - возвращаемый массив строк.
    [IN] string str - входная строка.
    [IN] string sym - разделитель.[/code]

    Пример:
    MQL код:
      string text = "1; 2; 3; 4; 5";
    string dig[];
    split(dig, text, ";");

    //Теперь массив dig будет содержать 5 элементов: "1", "2", "3", "4", "5".



    MQL код:
    void split(string& arr[], string str, string sym) 
    {
    ArrayResize(arr, 0);

    string item;
    int pos, size;

    int len = StringLen(str);
    for (int i=0; i < len;) {
    pos = StringFind(str, sym, i);
    if (pos == -1) pos = len;

    item = StringSubstr(str, i, pos-i);
    item = StringTrimLeft(item);
    item = StringTrimRight(item);

    size = ArraySize(arr);
    ArrayResize(arr, size+1);
    arr[size] = item;

    i = pos+1;
    }
    }

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

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

    Tekora (07.11.2018)

  23. линк#17
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Oграничить колличество лоссов подряд в течнии дня
    Пример: 2 лосса в день подряд - отключение доступа к торговле
    MQL код:
     int orders = 0;

    int cnt = HistoryTotal();
    for (int i=0; i < cnt; i++) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

    //if (OrderSymbol() != Symbol()) continue;
    //if (OrderMagicNumber() != Magic) continue;

    if (CurTime() - OrderCloseTime() > 24*60*60) continue;

    int type = OrderType();
    if (type == OP_BUY || type == OP_SELL)
    {
    if (OrderProfit() < 0) orders++;
    }
    }

    if (orders > 2) return;

    Т.е. смотрим ордера за последние 24 часа с отрицательным профитом.

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

  24. линк#18
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:   433
    в 222 сообщениях
    19%
    ПодписатьсяПодписаться
    Подписано: 0
    Закрытие всех лонгов или всех шортов по достижению профита в 1$.
    MQL код:
    extern double Profit = 1;
    extern int Slippage = 3;

    if (AccountProfit() > Profit)
    {
    CloseOrders(OP_BUY);
    //or CloseOrders(OP_SELL);
    }

    void CloseOrders(int type)
    {
    int cnt = OrdersTotal();
    for (int i=cnt-1; i>=0; i--)
    {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;

    //if (OrderSymbol() != Symbol()) continue;
    //if (OrderMagicNumber() != Magic) continue;

    if (OrderType() != type) continue;

    if (type == OP_BUY)
    {
    RefreshRates();
    OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage);
    continue;
    }

    if (type == OP_SELL)
    {
    RefreshRates();
    OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage);
    continue;
    }
    }
    }

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

  25. линк#19
    В начале пути
    tsn стараюсь положительно себя зарекомендовать Аватар для tsn
    Регистрация:
    15.02.2010
    Сообщений:
    5
    Накопленные выплаты (Подробнее):
    56 RUB
    Поставил(а) лайков:
    1
    Получено лайков:   0
    в 0 сообщениях
    0%
    ПодписатьсяПодписаться
    Подписано: 0
    Подскажите, как реализовать следующие торговые критерии:выставление отложенного ордера по закрытию очередного? Например, закрылся Buy по ТР, а необходимо выставить SellStop на удалении в 15 пунктах от предыдущего Sell Stop (т.е. подвигать отложенники вслед за ценой)?


  26. Dragon
  27. линк#20
    Кандидат форумных наук
    twin хорошая репутация twin хорошая репутация twin хорошая репутация twin хорошая репутация Аватар для twin
    Регистрация:
    04.03.2010
    Сообщений:
    1,399
    Накопленные выплаты (Подробнее):
    105010 RUB
    Поставил(а) лайков:
    870
    Получено лайков:   566
    в 383 сообщениях
    40%
    ПодписатьсяПодписаться
    Подписано: 0
    Цитата Сообщение от tsn Посмотреть сообщение
    Подскажите, как реализовать следующие торговые критерии:выставление отложенного ордера по закрытию очередного? Например, закрылся Buy по ТР, а необходимо выставить SellStop на удалении в 15 пунктах от предыдущего Sell Stop (т.е. подвигать отложенники вслед за ценой)?
    Это вам надо обратиться за скриптами.....я так понимаю вас интересует трейлинг?Поищите в нете ,там есть нужные вам ,бесплатные скриптики для мт4 с инструкцией поустановке.
    Правда я себе пытался поставтьодин такой,но он не встал,а на полощаке в проге возник сбой.Видно скрипт был сыроват.

    иду уже...


Страница 1 из 11
1 2 ... Последняя ◄╝

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

Похожие темы

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

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