GetProfitLastPosInPoint

 

Уважаемые подскажите. Мне нужно получить сумарный профит в пунктах всех закрытых позиций с определенным magic.

У Кима есть функции GetProfitOpenPosInPoint и TakeProfitLastClosePos

Взяв за основу эти две фунции я попыталась написать функцию GetProfitClosePosInPoint

 

int GetProfitClosePosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int      i, k=OrdersHistoryTotal(), pr=0;

 
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)){
         if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(),  "JPY")<0) p=0.0001; else p=0.01;
          
          
          if (OrderType()==OP_BUY) {
            pr+=(OrderClosePrice()-OrderOpenPrice())/p;
          }
          
         
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-OrderClosePrice())/p;
          }
       
       
        }
      }
    }
  }
  return(pr);
}


Она работает но только дает профит для одной последней позиции. А у Кима, если я поняла, функция GetProfitOpenPosInPoint дает сумарный профит открытых позиций.

int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(),  "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}

Подскажите, как исправить функцию чтобы она давала сумарный профит. Или хотябы объясните, что в функции Кима GetProfitOpenPosInPoint дает прибавление (сумирует) профит.

 
liana:

Уважаемые подскажите. Мне нужно получить сумарный профит в пунктах всех закрытых позиций с определенным magic.

У Кима есть функции GetProfitOpenPosInPoint и TakeProfitLastClosePos

Взяв за основу эти две фунции я попыталась написать функцию GetProfitClosePosInPoint

 


Она работает но только дает профит для одной последней позиции. А у Кима, если я поняла, функция GetProfitOpenPosInPoint дает сумарный профит открытых позиций.

Подскажите, как исправить функцию чтобы она давала сумарный профит. Или хотябы объясните, что в функции Кима GetProfitOpenPosInPoint дает прибавление (сумирует) профит.

pr+= даёт сумму.
 

Я так и думала. А почему тогда в моей версии сумма не плюсуется хотя у меня тоже pr+= ? 

 
liana:

Я так и думала. А почему тогда в моей версии сумма не плюсуется хотя у меня тоже pr+= ? 


как вы вызываете функцию? с какими параметрами?
 

Вообще у меня задача сравнить убыток открытых позиций ( magic1) с прибылью закрытых ( magic2). И если их сумма равна или больше нуля, то закрыть позиции( magic1)  .

Lost1 = GetProfitOpenPosInPoint(NULL, -1, magic1);
Prof2 = GetProfitClosePosInPoint(NULL, -1, magic2);

if (Lost1+Prof2 >=0)
{ClosePositions(NULL, -1, magic1);}

 

суммарный профит открытых

double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}

 суммарный профит закрытых

double GetProfitClosePosInCurrency(string sy="", int op=-1, int mn=-1)
{
  double p=0;
  int    i, 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=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            
          }
        }
      }
    }
  }
  return(p);
}

 

а у вас магик точно разный? позиции по одному инструменту?

Lost1 = GetProfitOpenPosInPoint(NULL, -1, magic1);

 magic1 должен быть int, а не string, т.е должно быть число -1,0, 1,2,3 и т.д

 

Спасибо большое 

 

Да у меня magic1 и magic2 простые числа. Инструмент один. Мне нужно сравнение в пунктах, а не в Currency. Хотя наверное можно и в Currency сравнивать?

 

  Если в пунктах то нужно разделить на p?

double p;
p=MarketInfo(OrderSymbol(), MODE_POINT);
 if (p==0) if (StringFind(OrderSymbol(),  "JPY")<0) p=0.0001; else p=0.01;


p+=(OrderProfit()+OrderCommission()+OrderSwap())/p;
 
liana:

Спасибо большое 

 

Да у меня magic1 и magic2 простые числа. Инструмент один. Мне нужно сравнение в пунктах, а не в Currency. Хотя наверное можно и в Currency сравнивать?

сравнивать можно хоть в попугаях


работает?

 

я ещё на работе...:) не могу проверить. сегодня вечером попробую

 
При получении профита закрытых позиций лучше ограничивать выборку датой, с которой смотреть закрытые позиции. В качестве примера GetProfitFromDateInCurrency()
 
KimIV:
При получении профита закрытых позиций лучше ограничивать выборку датой, с которой смотреть закрытые позиции. В качестве примера GetProfitFromDateInCurrency()


если сегодня открытые позиции  с магик 3,

а вчерашние закрытые с магик 2 ,  и сравниваться будут по магику

то в ваших функциях в данном случае, ограничение по дате, ИМХО излишне

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