Сейчас надо только немного переделать (день на неделю).
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает количество убыточных позиций, закрытых сегодня. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+int NumberOfLossPosToday(string sy="", int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal(), kp=0;
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) {
t=OrderCloseTime();
if (Year()==TimeYear(t) && DayOfYear()==TimeDayOfYear(t)) {
if (OrderProfit()<0) kp++;
}
}
}
}
}
}
}
return(kp);
}
Вы наверное меня неправильно поняли. Я не от кого ничего не требовал, а просто обратился за помощью, с надеждой на то, что кто-то, сталкивался с такой проблемой уже в прошлом и ему не будет трудно поделиться решением. Этот форум, ведь не запрещает, такого рода сообщения. Не так ли? Поэтому прошу не считать меня лентяем, просто реально застрял на этой задаче.
Вы наверное меня неправильно поняли. Я не от кого ничего не требовал, а просто обратился за помощью, с надеждой на то, что кто-то, сталкивался с такой проблемой уже в прошлом и ему не будет трудно поделиться решением. Этот форум, ведь не запрещает, такого рода сообщения. Не так ли? Поэтому прошу не считать меня лентяем, просто реально застрял на этой задаче.
int WeekOfMonth(datetime dt=0) {
if (dt<=0) dt=TimeCurrent();
datetime d;
int i, kd=TimeDay(dt), nn=1;
for (i=2; i<=kd; i++) {
d=StrToTime(TimeYear(dt)+"."+TimeMonth(dt)+"."+i);
if (TimeDayOfWeek(d)==1) nn++;
}
return(nn);
}
int CalculateLossOrders(string sy="", int op=-1) {
datetime t;
int i, k=OrdersHistoryTotal(), kp=0;
int week = WeekOfMonth(TimeCurrent());
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 || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
if (op<0 || OrderType()==op) {
t=OrderCloseTime();
if (Year()==TimeYear(t) && Month()==TimeMonth(t) && week == WeekOfMonth(OrderCloseTime())) {
if (OrderProfit()<0) kp++;
}
}
}
}
}
}
return(kp);
}
Использование для Buy'a
if(CalculateLossOrders("", 0) < 2)
{
Print("В этой недели ещё нет двух минусов на Buy");
}
Использование для Sell'a
if(CalculateLossOrders("", 1) < 2)
{
Print("В этой недели ещё нет двух минусов на Sell");
}
Полезного - много!!! Именно убыточных по кол-ву за неделю - я там не нашел...
Я то же! :)
Полезного - много!!! Именно убыточных по кол-ву за неделю - я там не нашел...
неожиданный ответ.
я дал ссыль прямо на функцию. осталось приложить руки.
или уж тогда надо обращаться в job
Хотя нет что-то полезное всё же я нашел....
Сейчас надо только немного переделать (день на неделю).
неожиданный ответ.
я дал ссыль прямо на функцию. осталось приложить руки.
или уж тогда надо обращаться в job
С таким успехом руки приложить можно и с пустого места. Так что простите...
С таким успехом руки приложить можно и с пустого места. Так что простите...
совершенно верно: можно и нужно.
совершенно верно: можно и нужно.
Вы наверное меня неправильно поняли. Я не от кого ничего не требовал, а просто обратился за помощью, с надеждой на то, что кто-то, сталкивался с такой проблемой уже в прошлом и ему не будет трудно поделиться решением. Этот форум, ведь не запрещает, такого рода сообщения. Не так ли? Поэтому прошу не считать меня лентяем, просто реально застрял на этой задаче.
С уважением...
Вы наверное меня неправильно поняли. Я не от кого ничего не требовал, а просто обратился за помощью, с надеждой на то, что кто-то, сталкивался с такой проблемой уже в прошлом и ему не будет трудно поделиться решением. Этот форум, ведь не запрещает, такого рода сообщения. Не так ли? Поэтому прошу не считать меня лентяем, просто реально застрял на этой задаче.
С уважением...
вы все правильно говорите.
и я помог, как мог. все будет хорошо. мир вам ))
Решил проблему следующим образом...
int WeekOfMonth(datetime dt=0) { if (dt<=0) dt=TimeCurrent(); datetime d; int i, kd=TimeDay(dt), nn=1; for (i=2; i<=kd; i++) { d=StrToTime(TimeYear(dt)+"."+TimeMonth(dt)+"."+i); if (TimeDayOfWeek(d)==1) nn++; } return(nn); } int CalculateLossOrders(string sy="", int op=-1) { datetime t; int i, k=OrdersHistoryTotal(), kp=0; int week = WeekOfMonth(TimeCurrent()); 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 || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) { if (op<0 || OrderType()==op) { t=OrderCloseTime(); if (Year()==TimeYear(t) && Month()==TimeMonth(t) && week == WeekOfMonth(OrderCloseTime())) { if (OrderProfit()<0) kp++; } } } } } } return(kp); } Использование для Buy'a if(CalculateLossOrders("", 0) < 2) { Print("В этой недели ещё нет двух минусов на Buy"); } Использование для Sell'a if(CalculateLossOrders("", 1) < 2) { Print("В этой недели ещё нет двух минусов на Sell"); }Советник торгует только отложенными ордерами, поэтому в этом нет смысла.
В последнем посте у вас рабочая версия, но с атавизмами типа || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP.
Ордера этого типа в функции CalculateLossOrders() в приведенных вами примерах не обрабатываются.