Заработай до
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
    Получено лайков:  420
    в 215 сообщениях
    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
    Накопленные выплаты 155746 RUB

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

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

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

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

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

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

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

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

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



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

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



    Изображение
    Превью
  4. Линк #2 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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
    Получено лайков:  420
    в 215 сообщениях
    18%
    Польза от функции GetLastOpenTime такая.
    Например мы не хотим открывать лонг-ордера чаще чем раз в 2 часа.
    Тогда условие на открытие будет выглядеть так:
    MQL код:
    if (CurTime() - GetLastOpenTime(OP_BUY) >= 2*60*60) {
    OrderSend(Symbol(), OP_BUY, ...
    }

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

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

  8. Линк #5 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

  9. Линк #6 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

  10. Линк #7 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

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

    gastyc (10.12.2016)

  12. Линк #8 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

  13. Линк #9 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

  14. Линк #10 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

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


  16. Линк #12 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

  17. Линк #13 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

  18. Линк #14 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

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

  20. Линк #16 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

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

    Tekora (07.11.2018)

  22. Линк #17 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.

  23. Линк #18 Свернуть пост
    Кандидат форумных наук
    Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Nick'Otin приемлемый уровень репутации Аватар для Nick'Otin
    Регистрация:
    16.12.2009
    Сообщений:
    2,320
    Деньги за посты (Подробнее):
    3750 RUB
    Поставил(а) лайков:
    74
    Получено лайков:  420
    в 215 сообщениях
    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.