Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 287

 
Добрый день. Помоги с функцией пожалуйста, суммирует убыток закрытых ордеров, при использование с функцией закрытие ордеров метатрейдер вылетает, думаю какая та ошибка в этой функции.
double ClosProfit()
{
double summa=0;
int orders=OrdersHistoryTotal(); 
{
for(int i=orders-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
{
Print("Error in history!");
break;
}
if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL)
continue;
//---
if(OrderProfit()>0) break;
If(OrderProfit()<0)i++;
}
If(i<0)
summa=OrderProfit()+summa;
}
If(OrderProfit()>summa)
summa=OrderProfit()+summa;
return(summa);
}
 
Lowech:
Добрый день. Помоги с функцией пожалуйста, суммирует убыток закрытых ордеров, при использование с функцией закрытие ордеров метатрейдер вылетает, думаю какая та ошибка в этой функции.

Лучше уже готовые посмотреть и если надо то под себя подкорректировать. GetProfitFromDateInCurrency()

 
Lowech:
Добрый день. Помоги с функцией пожалуйста, суммирует убыток закрытых ордеров, при использование с функцией закрытие ордеров метатрейдер вылетает, думаю какая та ошибка в этой функции.

что значит метатрейдер вылетает? Программа компилируется с ошибками!!!

в трех местах вместо if с маленькой строчной буквы написано If с большой прописной буквы

пара фигурных скобок явно лишняя: первая после int orders=OrdersHistoryTotal();  и парная ей после summa=OrderProfit()+summa; - но это маловажно

ну и еще есть...

 
Lowech:
Добрый день. Помоги с функцией пожалуйста, суммирует убыток закрытых ордеров, при использование с функцией закрытие ордеров метатрейдер вылетает, думаю какая та ошибка в этой функции.

Попробуй так :

double ClosProfit()
{ double summa=0;
  int orders=OrdersHistoryTotal(); 
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0.0) summa=OrderProfit()+summa;
  }
  return(summa);
}
 
Опоздал на 2 минуты пока писал ...  Давайте рассмотрим внимательно эту часть:
  for(int i=orders-1;i>=0;i--)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
    {
      Print("Error in history!");
      break;
    }
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()>0) break;
    if(OrderProfit()<0)i++;
  }
  if(i<0)

Скомпилировал ее с директивой #property   strict - ругает последнюю строку: 'i' - undeclared identifier. Дело в том, что переменная объявлена в цикле и действительна только в нем. Без директивы #property   strict скомпилировалось без ошибок, но это плохо. Директиву надо использовать.

Вместо if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)  проще написать if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). Теперь далее у Вас стоит break - это выход из цикла. А надо обработать другие ордера. Впрочем на истории это лишнее. Ошибка случается на рыночных и отложенных ордерах, если к моменту обработки ордер закрыли и он отсутствует. В общем, правильнее if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; - продолжить обработку следующих ордеров

Из тех же соображений if(OrderProfit()>0) break; заменить на if(OrderProfit()>0) continue;

А вот и причина ошибки: if(OrderProfit()<0)i++; - если встретится убыточный номер, то индекс увеличивается. А заголовок цикла  for(int i=orders-1;i>=0;i--) его уменьшает. Повторяется обработка того же ордера - программа зацикливается. Наверное, надо так:

#property   strict
double ClosProfit()
{
  double summa=0;
  for(int i=OrdersHistoryTotal()-1; i>=0; i--)
  {
    if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
    if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
    if(OrderProfit()<0) summa+=OrderProfit();
  }
  return(summa);
}
 
STARIJ:
Опоздал на 2 минуты пока писал ...  Давайте рассмотрим внимательно эту часть:

Скомпилировал ее с директивой #property   strict - ругает последнюю строку: 'i' - undeclared identifier. Дело в том, что переменная объявлена в цикле и действительна только в нем. Без директивы #property   strict скомпилировалось без ошибок, но это плохо. Директиву надо использовать.

Вместо if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)  проще написать if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)). Теперь далее у Вас стоит break - это выход из цикла. А надо обработать другие ордера. Впрочем на истории это лишнее. Ошибка случается на рыночных и отложенных ордерах, если к моменту обработки ордер закрыли и он отсутствует. В общем, правильнее if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; - продолжить обработку следующих ордеров

Из тех же соображений if(OrderProfit()>0) break; заменить на if(OrderProfit()>0) continue;

А вот и причина ошибки: if(OrderProfit()<0)i++; - если встретится убыточный номер, то индекс увеличивается. А заголовок цикла  for(int i=orders-1;i>=0;i--) его уменьшает. Повторяется обработка того же ордера - программа зацикливается. Наверное, надо так:


Спасибо, больше метатрейдер  не вылетает) По поводу 

if(OrderProfit()>0) break; заменить на if(OrderProfit()>0) continue;

мне нужно чтобы если ордер закрылся профитом, этот профит функция не учитывала, только сумму убытка и до первого ордера закрытого в профит. Т.е. 

if(OrderProfit()>0) break;


должна останавливать счетчик если ордер закрылся в профит, я правильно понимаю?
 
Lowech:

Спасибо, больше метатрейдер  не вылетает) По поводу мне нужно чтобы если ордер закрылся профитом, этот профит функция не учитывала, только сумму убытка и до первого ордера закрытого в профит. Т.е. 
должна останавливать счетчик если ордер закрылся в профит, я правильно понимаю?
Рассуждения Ваши почти правильны. Тут отсутствует гарантия какого-либо порядка расположения ордеров в истории. Для себя - можно, на продажу - плохо
 
STARIJ:
Рассуждения Ваши почти правильны. Тут отсутствует гарантия какого-либо порядка расположения ордеров в истории. Для себя - можно, на продажу - плохо
А разве цикл по ордерам не попорядку ордера считает?
 
STARIJ:

Если есть исходник - DROW_NONE - отсутствие какого-либо рисования

Не помогло, всё-равно отображает циферки в углу

 
LowechА разве цикл по ордерам не попорядку ордера считает?

по порядку расположения в списке. Но гарантия какого либо упорядочивания в этом списке отсутствует

Причина обращения: