Скачать MetaTrader 5

GetProfitLastPosInPoint

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй программы в Code Base. Увеличивай свой рейтинг!
Liana
361
Liana 2013.05.28 13:31 

Уважаемые подскажите. Мне нужно получить сумарный профит в пунктах всех закрытых позиций с определенным 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 дает прибавление (сумирует) профит.

Boris
3901
Boris 2013.05.28 13:41  
liana:

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

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

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

 


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

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

pr+= даёт сумму.
Liana
361
Liana 2013.05.28 13:47  

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

pako
3309
pako 2013.05.28 14:05  
liana:

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


как вы вызываете функцию? с какими параметрами?
Liana
361
Liana 2013.05.28 14:27  

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

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

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

pako
3309
pako 2013.05.28 14:38  

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

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 и т.д

Liana
361
Liana 2013.05.28 15:13  

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

 

Да у меня 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;
pako
3309
pako 2013.05.28 15:20  
liana:

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

 

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

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


работает?

Liana
361
Liana 2013.05.28 15:22  

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

Igor Kim
2742
Igor Kim 2013.05.28 16:43  
При получении профита закрытых позиций лучше ограничивать выборку датой, с которой смотреть закрытые позиции. В качестве примера GetProfitFromDateInCurrency()
pako
3309
pako 2013.05.28 17:43  
KimIV:
При получении профита закрытых позиций лучше ограничивать выборку датой, с которой смотреть закрытые позиции. В качестве примера GetProfitFromDateInCurrency()


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

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

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

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий