Эта функция возвращает флаг закрытия последней позиции по стопу. Флаг поднят - True - сработал StopLoss. Флаг опущен - False - позиция была закрыта по другой причине. Более точный отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.05.2008 |//| Описание : Возвращает флаг закрытия последней позиции по стопу. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+boolisCloseLastPosByStop(stringsy="", intop=-1, intmn=-1){datetimet;
doubleocp, osl;
intdg, i, j=-1, k=OrdersHistoryTotal();
if(sy=="0")sy=Symbol();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()==sy || sy==""){if(OrderType()==OP_BUY || OrderType()==OP_SELL){if(op<0 || OrderType()==op){if(mn<0 || OrderMagicNumber()==mn){if(t<OrderCloseTime()){t=OrderCloseTime();
j=i;
}}}}}}}if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)){dg=MarketInfo(sy, MODE_DIGITS);
if(dg==0)if(StringFind(OrderSymbol(), "JPY")<0)dg=4; elsedg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
osl=NormalizeDouble(OrderStopLoss(), dg);
if(ocp==osl)return(True);
}return(False);
}
P.S. Во вложении скрипт для тестирования функции isCloseLastPosByStop().
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 21.03.2008 |//| Описание : Открывает позицию и возвращает её тикет. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента (NULL или "" - текущий символ) |//| op - операция |//| ll - лот |//| sl - уровень стоп |//| tp - уровень тейк |//| mn - MagicNumber |//+----------------------------------------------------------------------------+intOpenPosition(stringsy, intop, doublell, doublesl=0, doubletp=0, intmn=0){//-- skip --
stringlsComm=WindowExpertName()+""+GetNameTF(Period());
//-- skip --
Подключил функцию OpenPosition() в советнике на реале, ошибка 4059, поменял NULL на Symbol(), исчезла, затем появилось сообщение
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: expert stopped 2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: expert function calls are not allowed; 'stdlib'-'ErrorDescription'
вернулся к исходной,все работает... (stdlib.mqh && stderror.mqh в папке include есть из базовой поставки МТ)
Эта функция возвращает флаг закрытия последней позиции по тейку. Флаг поднят - True - сработал TakeProfit. Флаг опущен - False - позиция была закрыта по другой причине. Более точный отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.05.2008 |//| Описание : Возвращает флаг закрытия последней позиции по тейку. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+boolisCloseLastPosByTake(stringsy="", intop=-1, intmn=-1){datetimet;
doubleocp, otp;
intdg, i, j=-1, k=OrdersHistoryTotal();
if(sy=="0")sy=Symbol();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()==sy || sy==""){if(OrderType()==OP_BUY || OrderType()==OP_SELL){if(op<0 || OrderType()==op){if(mn<0 || OrderMagicNumber()==mn){if(t<OrderCloseTime()){t=OrderCloseTime();
j=i;
}}}}}}}if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)){dg=MarketInfo(sy, MODE_DIGITS);
if(dg==0)if(StringFind(OrderSymbol(), "JPY")<0)dg=4; elsedg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
otp=NormalizeDouble(OrderTakeProfit(), dg);
if(ocp==otp)return(True);
}return(False);
}
ЗЫ. Во вложении скрипт для тестирования функции isCloseLastPosByTake().
Эта функция возвращает флаг убыточности последней закрытой позиции. Флаг поднят - True - последняя позиция была закрыта с убытком. Флаг опущен - False - последняя позиция была закрыта либо в ноль, либо с прибылью. Функция не учитывает свопы и комиссию. Отбор позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает флаг убыточности последней позиции. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+boolisLossLastPos(stringsy="", intop=-1, intmn=-1){datetimet;
inti, j=-1, k=OrdersHistoryTotal();
if(sy=="0")sy=Symbol();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()==sy || sy==""){if(OrderType()==OP_BUY || OrderType()==OP_SELL){if(op<0 || OrderType()==op){if(mn<0 || OrderMagicNumber()==mn){if(t<OrderCloseTime()){t=OrderCloseTime();
j=i;
}}}}}}}if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)){if(OrderProfit()<0)return(True);
}return(False);
}
P.S. Во вложении скрипт для тестирования функции isLossLastPos().
Эта функция возвращает флаг торгов сегодня. Флаг поднят - True - сегодня открывались позиции. Флаг опущен - False - сегодня не открывалось ни одной позиции. Отбор учитываемых позиций задаётся внешними параметрами:
sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает флаг торгов сегодня. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+boolisTradeToDay(stringsy="", intop=-1, intmn=-1){inti, k=OrdersHistoryTotal();
if(sy=="0")sy=Symbol();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){if(OrderSymbol()==sy || sy==""){if(OrderType()==OP_BUY || OrderType()==OP_SELL){if(op<0 || OrderType()==op){if(mn<0 || OrderMagicNumber()==mn){if(TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year())return(True);
}}}}}}k=OrdersTotal();
for(i=0; i<k; i++){if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){if(OrderSymbol()==sy || sy==""){if(OrderType()==OP_BUY || OrderType()==OP_SELL){if(op<0 || OrderType()==op){if(mn<0 || OrderMagicNumber()==mn){if(TimeDay(OrderOpenTime())==Day()
&& TimeMonth(OrderOpenTime())==Month()
&& TimeYear(OrderOpenTime())==Year())return(True);
}}}}}}return(False);
}
ЗЫ. Во вложении скрипт для тестирования функции isTradeToDay().
Эта функция возвращает флаг закрытия последней позиции по стопу. Флаг поднят - True - сработал StopLoss. Флаг опущен - False - позиция была закрыта по другой причине. Более точный отбор учитываемых позиций задаётся внешними параметрами:
().
Добрый день . При реализации кода с этой функцией появилась непонятность. Применил я эту функцию вот так:
if(isCloseLastPosByStop(NULL,OP_BUY, MagicLong1)){//если одна из открытых позиций BUY вдруг закрылась по стоплосу for(intrb_ = OrdersTotal() - 1; rb_ >= 0; rb_ -- ){if(OrderSelect(rb_, SELECT_BY_POS, MODE_TRADES)){//выбираем среди открытых и отложенных ордеров if((OrderSymbol()==Symbol()) && (OrderMagicNumber()==MagicLong1)){//закрываем все остальные позиции BUYOrderClose(OrderTicket(),OrderLots(),Bid,ОтклонениеЦены,Black);
OrderDelete(OrderTicket());// и удаляем BUY-отложки // return(0); // выходим }}}}
До этого момента всё работает нормально! При появлении флага, - закрываются все BUY-позиции и удаляются BUY-отложки, как я и задавал! Но потом эксперт, согласно своим сигналам на вход вновь выставляет ордера-отложки. Как и положено.
Но эти ордера тут же удаляются! Видимо, флаг всё ещё висит. А почему он висит? Ведь последние позиции уже не по стоплоссу, а принудительно были закрыты!
Как быть мне в такой ситуации? Чтобы после выполнения команды на закрытие данного алгоритма, эксперт мог нормально выставлять свои дальнейшие ордера?
rid писал (а): Как быть мне в такой ситуации? Чтобы после выполнения команды на закрытие, эксперт мог нормально выставлять свои дальнейшие ордера?
Этот вопрос нужно решать в контексте всей задачи, потому что подразумевается не просто отдельное действие, а взаимодействие, причём в определённом порядке. Поэтому опишите задачу полностью. Код не нужен. Просто опишите задачу словами.
Вопрос на разминку. Зачем нужно удалять ордера и снова их ставить? Я считаю, что предпочтительнее модифицировать.
У меня ордера и позиции группируются в массивы по профитам, убыткам, отложкам стоп. и лим. и проч. резонам .
В данном конкретном случае, я закрываю массив позиций BUY, которые открылись стоповыми отложками и суммарно набрали заданный профит. И удаляю оставшиеся, несработавшие стоповые отложки.
Вот сейчас вывел в комментарий функцию - Comment (isCloseLastPosByStop());
Смотрю. Изначально функция =0. После первого же закрытия по стоплоссу Comment (isCloseLastPosByStop()); меняется на единицу, а потом - после принудительного закрытия других позиций, не возвращается к нулевому значению, а так и продолжает оставться единицей!
Функция isCloseLastPosByStop().
Эта функция возвращает флаг закрытия последней позиции по стопу. Флаг поднят - True - сработал StopLoss. Флаг опущен - False - позиция была закрыта по другой причине. Более точный отбор учитываемых позиций задаётся внешними параметрами:
- sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
- op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
- mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
P.S. Во вложении скрипт для тестирования функции isCloseLastPosByStop().Функция OpenPosition() для online.
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: expert function calls are not allowed; 'stdlib'-'ErrorDescription'
Подключил функцию OpenPosition() в советнике на реале, ошибка 4059
Ошибка 4059 означает, что функция недоступна в тестовом режиме. Идентификатор ошибки ERR_FUNCTION_NOT_ALLOWED_IN_TESTING_MODE. Генерируют ошибку следующие функции: MarketInfo, MessageBox, SendFTP, SendMail, WindowIsVisible, WindowFind, WindowHandle.
поменял NULL на Symbol(), исчезла, затем появилось сообщение
2008.05.20 04:47:41 !OBLD_EUR_S EURUSD,M30: expert function calls are not allowed; 'stdlib'-'ErrorDescription'
Функция isCloseLastPosByTake().
Эта функция возвращает флаг закрытия последней позиции по тейку. Флаг поднят - True - сработал TakeProfit. Флаг опущен - False - позиция была закрыта по другой причине. Более точный отбор учитываемых позиций задаётся внешними параметрами:
- sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
- op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
- mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции isCloseLastPosByTake().Функция isLossLastPos().
Эта функция возвращает флаг убыточности последней закрытой позиции. Флаг поднят - True - последняя позиция была закрыта с убытком. Флаг опущен - False - последняя позиция была закрыта либо в ноль, либо с прибылью. Функция не учитывает свопы и комиссию. Отбор позиций задаётся внешними параметрами:
- sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
- op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
- mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
P.S. Во вложении скрипт для тестирования функции isLossLastPos().Функция isTradeToDay().
Эта функция возвращает флаг торгов сегодня. Флаг поднят - True - сегодня открывались позиции. Флаг опущен - False - сегодня не открывалось ни одной позиции. Отбор учитываемых позиций задаётся внешними параметрами:
- sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
- op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
- mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции isTradeToDay().Функция isCloseLastPosByStop().
Эта функция возвращает флаг закрытия последней позиции по стопу. Флаг поднят - True - сработал StopLoss. Флаг опущен - False - позиция была закрыта по другой причине. Более точный отбор учитываемых позиций задаётся внешними параметрами:
().Добрый день . При реализации кода с этой функцией появилась непонятность. Применил я эту функцию вот так:
До этого момента всё работает нормально! При появлении флага, - закрываются все BUY-позиции и удаляются BUY-отложки, как я и задавал! Но потом эксперт, согласно своим сигналам на вход вновь выставляет ордера-отложки. Как и положено.
Но эти ордера тут же удаляются! Видимо, флаг всё ещё висит. А почему он висит? Ведь последние позиции уже не по стоплоссу, а принудительно были закрыты!
Как быть мне в такой ситуации? Чтобы после выполнения команды на закрытие данного алгоритма, эксперт мог нормально выставлять свои дальнейшие ордера?
Как быть мне в такой ситуации? Чтобы после выполнения команды на закрытие, эксперт мог нормально выставлять свои дальнейшие ордера?
Этот вопрос нужно решать в контексте всей задачи, потому что подразумевается не просто отдельное действие, а взаимодействие, причём в определённом порядке. Поэтому опишите задачу полностью. Код не нужен. Просто опишите задачу словами.
Вопрос на разминку. Зачем нужно удалять ордера и снова их ставить? Я считаю, что предпочтительнее модифицировать.
У меня ордера и позиции группируются в массивы по профитам, убыткам, отложкам стоп. и лим. и проч. резонам .
В данном конкретном случае, я закрываю массив позиций BUY, которые открылись стоповыми отложками и суммарно набрали заданный профит. И удаляю оставшиеся, несработавшие стоповые отложки.
//---------------------------------------------------------------------------------------------
Вот сейчас вывел в комментарий функцию - Comment (isCloseLastPosByStop());
Смотрю. Изначально функция =0. После первого же закрытия по стоплоссу Comment (isCloseLastPosByStop()); меняется на единицу, а потом - после принудительного закрытия других позиций, не возвращается к нулевому значению, а так и продолжает оставться единицей!