Перевод денег в пункты

 

Есть необходимость переводить текущий профит в пункты. Путаюсь делать это так:

positionInfo.SelectByIndex(index)

int pointProfit = (int) (positionInfo.Profit() / symbolInfo.Point());

Ожидая увидеть количество пунктов получаю огромные числа типа -2400000. Учитывая что стопы у сделок не больше 100 такого количества пунктов быть не может.

Почему деление профита в деньгах на стоимость пункта не дает профита в пунктах и как мне получить искомое значение?


 
Павел Раввич:

Есть необходимость переводить текущий профит в пункты. Путаюсь делать это так:

Ожидая увидеть количество пунктов получаю огромные числа типа -2400000. Учитывая что стопы у сделок не больше 100 такого количества пунктов быть не может.

Почему деление профита в деньгах на стоимость пункта не дает профита в пунктах и как мне получить искомое значение?


У Вас в делителе не стоимость пункта, а размерность пункта. У EURUSD Point равен 0,00001 на пятизнаке. Вот и посчитайте, что у Вас будет при профите минус 24 дол.

Стоимость пункта дается для одного лота, формула для вычисления пунктов будет следующей:

Кол-во пунктов = профит / (ст-ть пункта * lot)

 

ветром навеенное КСТАТИ - формула "полученный_профит/(цена_пункта * объём) насколько может быть "не int" ?

без свопов+комиссии, но со спредом ??

 
Vasiliy Pushkaryov:

У Вас в делителе не стоимость пункта, а размерность пункта. У EURUSD Point равен 0,00001 на пятизнаке. Вот и посчитайте, что у Вас будет при профите минус 24 дол.

Стоимость пункта дается для одного лота, формула для вычисления пунктов будет следующей:

Кол-во пунктов = профит / (ст-ть пункта * lot)

Получается что мне надо:

CPositionInfo positionInfo;
...
double profit = positionInfo.Profit() / (pointPrice * positionInfo.Volume());

Но где мне взять цену пункта?

Я пробовал вариант от сюда  https://www.mql5.com/ru/forum/203707/page2 но оно всегда возвращает 1

void GetPointPrice()
{  
   double tickValue = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE);
   double stts = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   string profitCurrency = SymbolInfoString(Symbol(), SYMBOL_CURRENCY_PROFIT);
   
   string accountCurrency = AccountInfoString(ACCOUNT_CURRENCY);
   if (profitCurrency != accountCurrency)
   {
      string sDirect = profitCurrency + accountCurrency;
      if (IsSymbolExists(sDirect))      
         return tickValue / stts * SymbolInfoDouble(sDirect, SYMBOL_BID);
      else
      {
         string sReverse = accountCurrency + profitCurrency;
         if (IsSymbolExists(sReverse))      
            return tickValue / stts / SymbolInfoDouble(sReverse, SYMBOL_BID);
         else
            return DBL_MAX;
      }
        
   }
   else
      return tickValue / stts;   
}
bool IsSymbolExists(string sSymbol)
{
   ResetLastError();
   SymbolInfoDouble(sSymbol, SYMBOL_BID);                      
   int error = GetLastError();
   return !(error == 5040 || (error >= 4301 && error <= 4303));
}

Может в стандартных классах MT5 уже есть решение данной проблемы?


Пробовал еще так согласно  Кол-во пунктов = профит / (ст-ть пункта * lot)

double  SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
double pointProfit = positionInfo.Profit() / (oneLotPointPrice * currentLot);

Видимо со стоимостью пункта для 1 лота что-то не клеится...

При лоте  0.01 и профите  -0.3 кол-во пунктов получается -0.0003


Стоимость 1 пункта и другие параметры ордера.
Стоимость 1 пункта и другие параметры ордера.
  • 2017.06.11
  • www.mql5.com
Помогите, пожалуйста, разобраться. Похоже, я запутался в простых вопросах. Пытаюсь программно вычислить стоимость 1 пункта...
 

скорее всго у Вас профит не верно посчитан

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

profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_COMMISSION)+PositionGetDouble(POSITION_SWAP);

формула у Вас верная:

Кол-во пунктов = профит / (ст-ть пункта * lot )

 
Павел Раввич:

Пробовал еще так согласно  Кол-во пунктов = профит / (ст-ть пункта * lot)

Видимо со стоимостью пункта для 1 лота что-то не клеится...

При лоте  0.01 и профите  -0.3 кол-во пунктов получается -0.0003


Это получается в котировках. Если считать, что позиция открыта на цене N+0.0 и закрыта N-0.0003 то это будет 30 пятизначных пунктов. Отсюда следует: Чтобы получить пункты надо это значение разделить на _Point или SymbolInfoDouble(_Symbol, SYMBOL_POINT)

 
Alexey Viktorov:

Это получается в котировках. Если считать, что позиция открыта на цене N+0.0 и закрыта N-0.0003 то это будет 30 пятизначных пунктов. Отсюда следует: Чтобы получить пункты надо это значение разделить на _Point или SymbolInfoDouble(_Symbol, SYMBOL_POINT)

не

 
Renat Akhtyamov:

не

Обоснуйте.

 
SanAlex:

может вот так ?

вот так:

(PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_COMMISSION)+PositionGetDouble(POSITION_SWAP))/(PositionGetDouble(POSITION_VOLUME)*SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE))

 
Alexey Viktorov:

Обоснуйте.

мою строчку попробуйте

я сам таким пользуюсь, чтобы определить минимальный профит в пунктах на закрытие

ну и к тому же, стоимость пункта для некоторых валютных пар зависима от цены.

соответственно нужно её считать самому на момент открытия позиции и по цене открытия позиции

поэтому ТС получил некоторое отклонение от целого значения пункта
 
Renat Akhtyamov:

мою строчку попробуйте

я сам таким пользуюсь, чтобы определить минимальный профит в пунктах на закрытие

Зачем мне что-то проверять когда я и так знаю что это неверно. Вы можете пользоваться чем угодно. Покажите пожалуйста где в документации вы нашли

PositionGetDouble(POSITION_COMMISSION)

POSITION_VOLUME

Объем позиции

double

POSITION_PRICE_OPEN

Цена позиции

double

POSITION_SL

Уровень Stop Loss для открытой позиции

double

POSITION_TP

Уровень Take Profit для открытой позиции

double

POSITION_PRICE_CURRENT

Текущая цена по символу

double

POSITION_SWAP

Накопленный своп

double

POSITION_PROFIT

Текущая прибыль

double