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

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

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

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

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

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

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

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

    return (orders);
    }

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

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

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

    Kofa (22.10.2017)

     
  3. ТОП сообщений
    2014-07-09   14:02
    Лучший ответ #1
    Накопленные выплаты 163207 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);
    }

    2011-03-13   13:21
    Лучший ответ #3
    Накопленные выплаты 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
    Лучший ответ #4
    Накопленные выплаты 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

    Вложение
    Превью
    2018-02-13   04:29
    Лучший ответ #5
    Накопленные выплаты 21465 RUB

    Цитата Сообщение от Viktor1987 Посмотреть сообщение
    Человек хочет определить точное время образования экстремума, но точнее чем на минутном графике не получится! Особенно на истории!
    Привет! МТ5 человеку нужно было, там возможно получить тиковую историю и соответственно есть возможность найти экстремумы точно по времени.Вложение 1797441

    Вложение
    Превью
    2018-08-13   17:17
    Лучший ответ #6
    Накопленные выплаты 4581 RUB

    Всем привет!
    Подскажите, есть такая функция: при срабатывании отложки, или SL или TP, на графике рисуются стрелки открытия, частичного закрытия и закрытия сделки, и между ними линия. Уже второй день рою вместе с Яндексом, но ничего похожего не нашел. А вообще проблема в том, если возникнут вопросы типа: "зачем тебе, перенеси из истории", что я поставил советник, который делает скрины при установке отложки и при её срабатывании, при закрытии ордера, но скриншот получается с голым графиком, так как нужные стрелочки не рисуются.
    За ранее спасибо за помощь!
    PS: На этом графике было около десятка сделок, но как видите скриншот пустой.
    Вложение 2092884

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

    udhit (12.05.2016)

  6. линк#3
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Накопленные выплаты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  428
    в 221 сообщениях
    18%
    Польза от функции 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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Получить дату следующего дня:
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Получить тикет последнего закрытого ордера из истории.
    Если тип ордера не указан, берется самый последний ордер любого типа.
    Если ордеров, отвечающих указанным критерию не найдено, возвращает -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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Функция для расчета рабочего лота по следующим условиям.
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Трейлинг-стоп.
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Открыть позицию в заданное время.
    Код удобнее всего поместить в скрипт, который работает в бесконечном цикле. Это даст возможность открыться в нужное время, не дожидаясь прихода первого тика.

    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Эксперт, закрывающий ордера по рынку с указанным тейкпрофитом.
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Можно так:
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Функция возвращает длину цепочки ордеров с положительным профитом. Считаем с конца 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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Подскажите,а как можно определить тип последнего ордера?
    Можно еще так:
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Способ программного закрытия терминала.
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Полезная функция 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
    Получено лайков:  428
    в 221 сообщениях
    18%
    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
    Получено лайков:  428
    в 221 сообщениях
    18%
    Закрытие всех лонгов или всех шортов по достижению профита в 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%
    Подскажите, как реализовать следующие торговые критерии:выставление отложенного ордера по закрытию очередного? Например, закрылся Buy по ТР, а необходимо выставить SellStop на удалении в 15 пунктах от предыдущего Sell Stop (т.е. подвигать отложенники вслед за ценой)?


  26. <a href="https://www.instaforex.com/ru/company_news">Форекс портал</a>
  27. линк#20
    Кандидат форумных наук
    twin хорошая репутация twin хорошая репутация twin хорошая репутация twin хорошая репутация Аватар для twin
    Регистрация:
    04.03.2010
    Сообщений:
    1,399
    Накопленные выплаты (Подробнее):
    105010 RUB
    Поставил(а) лайков:
    870
    Получено лайков:  565
    в 382 сообщениях
    40%
    Цитата Сообщение от tsn Посмотреть сообщение
    Подскажите, как реализовать следующие торговые критерии:выставление отложенного ордера по закрытию очередного? Например, закрылся Buy по ТР, а необходимо выставить SellStop на удалении в 15 пунктах от предыдущего Sell Stop (т.е. подвигать отложенники вслед за ценой)?
    Это вам надо обратиться за скриптами.....я так понимаю вас интересует трейлинг?Поищите в нете ,там есть нужные вам ,бесплатные скриптики для мт4 с инструкцией поустановке.
    Правда я себе пытался поставтьодин такой,но он не встал,а на полощаке в проге возник сбой.Видно скрипт был сыроват.

    иду уже...


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

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

Похожие темы

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

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