Найти ошибку в блоке

 

Всем привет!

Не судите пожалуйста строго.

Нужен блок,который возвращает профит нужного ордера из истории , но ордер который открывал именно этот советник.

Из своих закрытых смотрел бы ордера в истории и возвращал нужный на  N назад.

Накидал вот такой блок, но не работает.

Возвращает , но по всем ордерам, без привязки к магическим числам.

Зашел в тупик,помогите пожалуйста определить ошибку!

double HistoryProfitOrder(string sy="", int op=-1, int mn=-1,int n=0) {

  int i;
  int k=OrdersHistoryTotal();
  double p;
  if (sy=="0") sy=Symbol();
  for (i; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (op<0 || OrderType()==op) {
          if (mn<0 || OrderMagicNumber()==mn) {
             if (OrderSelect(i-n, SELECT_BY_POS, MODE_HISTORY))
           p = OrderProfit()+OrderSwap()+OrderCommission();
          }
        }
      }
    }
  }
  return(p);
}



 

Еще раз, прошу помощи!

Подозреваю, что тут все просто, но не доходит.

Не оставайтесь в стороне, Спасибо!

 
double HistoryProfitOrder(string sy="", int op=-1, int mn=-1,int n=0)
OrderType
()==op)

Что за OrderType со значением -1 ?  Вроде тайпы положительное значение имеют от нуля и выше.

Я сам то такие блоки не придумывал ещё, сложная задача для меня. Ждите, подтянутся специалисты.

В чём прикол то, объясните, для чего требуется находить конкретный закрытый ордер и смотреть его профит?


OrderType

Возвращает тип операции текущего выбранного ордера.

int  OrderType();

Возвращаемое значение

Тип операции текущего выбранного ордера. Mожет быть одной из следующих величин:

  • OP_BUY - ордер на покупку,
  • OP_SELL - ордер на продажу,
  • OP_BUYLIMIT - отложенный ордер на покупку по достижении заданного уровня, текущая цена выше уровня,
  • OP_BUYSTOP - отложенный ордер на покупку по достижении заданного уровня, текущая цена ниже уровня,
  • OP_SELLLIMIT - отложенный ордер на продажу по достижении заданного уровня, текущая цена ниже уровня,
  • OP_SELLSTOP - отложенный ордер на продажу по достижении заданного уровня, текущая цена выше уровня.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

  int order_type;
  if(OrderSelect(12, SELECT_BY_POS)==true)
    {
     order_type=OrderType();
     // ...
    }
  else
    Print("OrderSelect() вернул ошибку - ",GetLastError());


OrderProfit

Возвращает значение чистой прибыли выбранного ордера.

double  OrderProfit();

Возвращаемое значение

Значение чистой прибыли (без учета свопов и комиссий) выбранного ордера. Для открытых ордеров это текущая нереализованная прибыль, для закрытых ордеров - зафиксированная прибыль.

Примечание

Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Пример:

  if(OrderSelect(10, SELECT_BY_POS)==true)
    Print("Profit for the order 10 ",OrderProfit());
  else
    Print("OrderSelect() вернул ошибку - ",GetLastError());

 

Вы справку mql юзаете? 


ВОт у меня блок есть кода где поиск всех закрытых ордеров и сумма профита по ним. Может если как-то модернизировать, то что-то получится. Но слабоват я))

//+------------------------------------------------------------------+
//| Profit / loss of closed OP_BUY and OP_SELL                       |
//+------------------------------------------------------------------+
double CalculateProfitHistory()
  {
   double profithistory=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;
      if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
         if(OrderType()<=OP_SELL && SwapAndComissions==true) profithistory+=OrderProfit()+OrderSwap()+OrderCommission();
      else if(OrderType()<=OP_SELL && SwapAndComissions==false) profithistory+=OrderProfit();
     }
   return (profithistory);
  }
 
Проверка по магику у вас есть только для ордера i, а для i-n такой проверки нет, как и проверки по символу
 
geratdc_:
Что за OrderType со значением -1 ?  Вроде тайпы положительное значение имеют от нуля и выше.

внимательно смотрим код:

if (op<0 || OrderType()==op)
 
Andrey F. Zelinsky:

внимательно смотрим код:

Да я понял, но разве тип ордера может быть отрицательным?

 
Мне самому интересно как это можно решить - выбрать конкретный ордер и высунуть инфу о его профите и комиссиях. У мну есть идея торговая на эту тему. А ещё интересней узнать про стратегию, задуманную автором)))
 
geratdc_:

Да я понял, но разве тип ордера может быть отрицательным?

не может -- просто когда задан "-1" на входе, то согласно коду -- тип не проверяется (т.е. любой тип подходит)

 
Andrey F. Zelinsky:

не может -- просто когда задан "-1" на входе, то согласно коду -- тип не проверяется (т.е. любой тип подходит)

То есть все ордера и отложки и баи и селы, да? Понятно. Ну короче он больше моего знает))

 
geratdc_:


Я сам то такие блоки не придумывал ещё, сложная задача для меня. Ждите, подтянутся специалисты.

В чём прикол то, объясните, для чего требуется находить конкретный закрытый ордер и смотреть его профит?

Прикола нет.

Функция универсальна

примеры использования

HistoryProfitOrder(); // получаем профит по всем закрытым позициям
HistoryProfitOrder(Symbol(),OP_BUY ); //Только по текущему символу, и только покупки
HistoryProfitOrder(Symbol(),OP_BUY,123 ); //Только по текущему символу, и только покупки с магиком  123

Как то так.

 
Pavel Luzin:

Всем привет!

Не судите пожалуйста строго.

Нужен блок,который возвращает профит нужного ордера из истории , но ордер который открывал именно этот советник.

...

поясните точно, что вы хотите найти -- что значит "нужный ордер" -- как вы понимаете, что это именно "нужный ордер"

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