Как определить зафиксированную прибыль в пунктах после переноса стоп-лосса?

 

Доброго дня!

Как определить зафиксированную прибыль в пунктах после переноса стоп-лосса для нескольких ордеров? Выводит неверные значения.

Вот фрагмент кода:

//+----------------------------------------------------------------------------+
//|  Версия   : 01.08.2008                                                     |
//|  Описание : Возвращает фиксированный  профит открытых позиций в пунктах    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetFixProfitInPips(string sy="", int op=-1, int mn=-1) {
  double pip;
  int    i, k=OrdersTotal();
  san=0; double prB=0; double prS=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) {
          pip=MarketInfo(OrderSymbol(), MODE_POINT);
        // 
         if (StringFind(OrderSymbol(), "JPY")<0) pip=0.00001; else pip=0.001;
           if (OrderType()==OP_BUY) {
            RefreshRates();
    if((OrderProfit()>0) && (OrderStopLoss()>OrderOpenPrice())) prB+=(OrderStopLoss()-OrderOpenPrice())/pip;
   // if((OrderProfit()>0) && (OrderStopLoss()>OrderOpenPrice())) prB+=OrderTakeProfit();
  //  if((OrderProfit()>0) && (OrderStopLoss()>OrderOpenPrice())) prB+=OrderProfit();
   // if((OrderProfit()>0) && (OrderStopLoss()>OrderOpenPrice())) prB+=(OrderProfit()-OrderOpenPrice())/pip;
    //  if((OrderProfit()>0) && (OrderStopLoss()>OrderOpenPrice())) prB+=(OrderTakeProfit()-OrderOpenPrice())/pip;
     
         //  prB+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/pip;
          }
          if (OrderType()==OP_SELL) {
            RefreshRates();
    if((OrderProfit()>0) && (OrderStopLoss()<OrderOpenPrice()))  prS+=(OrderOpenPrice()-OrderStopLoss())/pip;
    // if((OrderProfit()>0) && (OrderStopLoss()<OrderOpenPrice()))  prS+=OrderProfit();
   //if((OrderProfit()>0) && (OrderStopLoss()<OrderOpenPrice())) prS+=(OrderOpenPrice()-OrderProfit())/pip;
           // prS+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/pip;
          }
          san=prB+prS;
        }
      }
    }
  }
  return(san);
}

//+----------------------------------------------------------------------------+
 

так попробуйте

if (OrderType()==OP_BUY) prB+=(OrderStopLoss()-OrderOpenPrice())/pip;

if (OrderType()==OP_SELL) prS+=(OrderOpenPrice()-OrderStopLoss())/pip;

 
Renat Akhtyamov #:

так попробуйте

if (OrderType()==OP_BUY) prB+=(OrderStopLoss()-OrderOpenPrice())/pip;

if (OrderType()==OP_SELL) prS+=(OrderOpenPrice()-OrderStopLoss())/pip;

такая конструкция не проходит......

Я сделал по -другому, но работает только для бай ордеров, для селл не получается, ниже код:

ищу причину.....

//+----------------------------------------------------------------------------+
//|  Версия   : 01.08.2023                                                     |
//|  Описание : Возвращает фиксированный  профит открытых позиций в пунктах    |
//|             после переноса стоп-лосса по тралу                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetFixProfitInPips(string sy="", int op=-1, int mn=-1) {
  double pip;
  int    i, k=OrdersTotal();
  san=0; double prB=0; double prS=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)
      {
          pip=MarketInfo(OrderSymbol(), MODE_POINT);
    // if (StringFind(OrderSymbol(), "JPY")<0) pip=0.00001; else pip=0.001;
         if (OrderType()==OP_BUY) {
            RefreshRates();
   if ((OrderProfit()>0) && (OrderStopLoss()>OrderOpenPrice()))   prB+=((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())-(MarketInfo(OrderSymbol(), MODE_BID)-OrderStopLoss()))/pip;
                                    }
          if (OrderType()==OP_SELL) {
            RefreshRates();
  // if ((OrderProfit()>0) && (OrderStopLoss()<OrderOpenPrice()))   prS+=((MathAbs(MarketInfo(OrderSymbol(), MODE_ASK)-OrderOpenPrice())/pip)-(MathAbs(MarketInfo(OrderSymbol(), MODE_ASK)-OrderStopLoss())/pip));
                                    }
     san=prB+prS;
        }
      }
    }
  }
  return(san);
}
//+----------------------------------------------------------------------------+
 
fregat555 #:

такая конструкция не проходит......

Я сделал по -другому, но работает только для бай ордеров, для селл не получается, ниже код:

ищу причину.....

ну раз для баек работает, то для селлок это нужно перевернуть, у Вас закомментировано плюсом

prB+=((MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())-(MarketInfo(OrderSymbol(), MODE_BID)-OrderStopLoss()))/pip;

и почему считаете байки по Аску а не по Биду?

Чтобы прикинуть профит, нужно считать по цене закрытия.

И к тому же, при наличии стопов, нужно брать не Аск и Бид, а цену открытия ордера и стопы

И тут из бида вычли тот же бид, зачем?

(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())-(MarketInfo(OrderSymbol(), MODE_BID)