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

 
Хотелось бы узнать происходит ли *округление значений прибыли (комиссии, свопов, баланса, средств, залога, свободных средств) для каждего ордера в отдельности?
Или округленные значения только показываються в терминале, а для вычислений используються неокругленные значения?

*округление (в смысле округление для денег) - преобразование значений до минимальной денежной единицы (т.е. до 0.01 или до 2-х знаков после запятой).

Для ясности приведу пример для прибыли:

я хочу купить 3.00 лота инструмента USD/JPY.
Я могу сделать это одним ордером по 3.00 лота или тримя ордерами по 1.00 лоту

Пусть Стоимость 1 пункта для 1 лота = 8.827683616.
Спред = 3 пункта.

Тогда прибыль при открытии позиции:

1) buy 3.00 лота;  прибыль = -3*3*8.827683616 = -79.44915254; после округления - прибыль = -79.45

2) buy 1.00 лота;  прибыль = -3*8.827683616 = -26.48305085; после округления - прибыль = -26.48
    buy 1.00 лота;  прибыль = -3*8.827683616 = -26.48305085; после округления - прибыль = -26.48
    buy 1.00 лота;  прибыль = -3*8.827683616 = -26.48305085; после округления - прибыль = -26.48
                                                                                                                                             -79.44 - сумма трех ордеров

Вот, получились разные результаты (хоть не намного, но хотелось бы знать как у вас считаеться).
Я сам пробывал проверить, но это не так то просто, когда все быстро меняеться.

Это пример с прибылью, хочу тоже спросить и по комиссии, свопам, балансу, средствам, залогу, свободным средствам?
Также хочу спросить зависит ли это от брокера или у всех брокеров одинаково считаеться?
 
Расмотрим два случая (USDJPY 113.17 / 20):
  1. #10 BUY 3.00 USDJPY at 113.20, close at 113.17

    BUY 300 000 USD -> SELL 33 960 000 YEN (rate 113.20)
    SELL 300 000 USD -> BUY 33 951 000 YEN (rate 113.17)

    профит: - 9 000 YEN или - 79.51 USD (без округления 79.50530035)

  2. #11 BUY 3.00 USDJPY at 113.20, close at 113.17

    BUY 100 000 USD -> SELL 11 320 000 YEN (rate 113.20)
    SELL 100 000 USD -> BUY 11 317 000 YEN (rate 113.17)

    профит: - 3 000 YEN или - 26.50 USD (без огругления 26.50176678)

    #12 BUY 3.00 USDJPY at 113.20, close at 113.17 (- 26.50 USD)
    #13 BUY 3.00 USDJPY at 113.20, close at 113.17 (- 26.50 USD)

    итоговый профит от трех сделок будет: -26.50 * 3 = - 79.50 USD

За счет принудительного округления сумма трех отдельных операций по сравнению с одной общей сделкой в данном конкретном случае различие в 1 цент. Это правильно, так как три отдельные сделки рассматриваются врозь.

Кроме того, в сложных кросс-курсах, где нет прямого преобразования результата сделки в валюту депозита, производятся дополнительные конверсионные операции через USD или EUR, где также во время вычислений производится округление промежуточных результатов до требуемой точности. В свое время один из банков (кто перешел на МТ) обнаружил отсутствие округления на промежуточных результатах, что иногда приводило к расхождению в 1 пипс с их собственной бухгалтерией. Конечно же, мы сразу все исправили.

Это пример с прибылью, хочу тоже спросить и по комиссии, свопам, балансу, средствам, залогу, свободным средствам?
Также хочу спросить зависит ли это от брокера или у всех брокеров одинаково считаеться?
Комиссии, маржевые требования и свопы (как и множество других параметров) каждый брокер выставляет свои. А все формулы расчетов одинаковы для всей системы МТ.
 

Кхм... вопрос не совсем в тему, но он об округлении...

Понадобилось мне однажды округлять, точнее обрезать результат:
величину обьёма позиции с точностью до минилота...

Вроде бы не проблема!
Ставь себе

NormalizeDouble( double value, int digits)
где вместо digits ставим 1 или 2
для 0.1 или 0.01 мин. лот соответственно...

Однако теряется универсальность, ибо даже в пределах одного ДЦ
на разных серверах может быть и 0.1 и 0.01 минилот...
И на одном терминале приходится держать два комплекта скриптов.

Вот как бы вычленить это, что-б разрядность переводилась в цифровое выражение...

 
kombat:

Кхм... вопрос не совсем в тему, но он об округлении...

Понадобилось мне однажды округлять, точнее обрезать результат:
величину обьёма позиции с точностью до минилота...

Вроде бы не проблема!
Ставь себе

NormalizeDouble( double value, int digits)
где вместо digits ставим 1 или 2
для 0.1 или 0.01 мин. лот соответственно...

Однако теряется универсальность, ибо даже в пределах одного ДЦ
на разных серверах может быть и 0.1 и 0.01 минилот...
И на одном терминале приходится держать два комплекта скриптов.

Вот как бы вычленить это, что-б разрядность переводилась в цифровое выражение...


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

NormalizeDouble(Value/minilot,0)*minilot;

 
Print("Минимальный лот: ",MarketInfo(Symbol(),MODE_MINLOT));
 
NormalizeDouble(Value/minilot,0)*minilot;

Увы... несколько не то...

Простой перевод разрядности в цифру! нужен.
т.е. например так:
РАЗРМЛ=формула;

И потом РАЗРМЛ подставлял туда где необходимо, например так:

ОБЪЁМ=NormalizeDouble(

РЕЗУЛЬТАТ_чего-то, РАЗРМЛ);

 

Таким образом, полученный результат от своих каких то мат. операций,
например обьём позиции 1.12345678 и округляем, точнее нормализуем
до точности позволяющей минимальным лотом...

Для ДЦ где минилот 0.1 это будет 1.1 лота
а там, где 0.01 будет 1.12 лота

Вот так...

 

Вот ещё пример где понадобилость такое округление:

"Лот м-М: ",minilot," - ",maxilot,"\n",

выводится правильно, в "своей" разрядности,
а вот так, уже восьмиразрядно:

"Лот м-М: "+minilot+" - "+maxilot+"\n",

 

Вот как решил подобное когда необходимо привести к удобоваримому виду:
если от 1.2345 отнять 1.2340 то получим 0.0005
а надо знать именно разницу 5, т.е. 5 пипов

Для чего использую множитель полученного первичного результата:
ТОЧНОСТЬ=MarketInfo(Symbol(),MODE_DIGITS);
МНОЖИТЕЛЬ=MathPow(10,ТОЧНОСТЬ);

Этим множителем и привожу как надо,
он сам подставлят 10000 или 100
в зависимости от точности, например на EURUSD или USDJPY

 
Универсальная функция расчёта лота:


extern bool   UseMM          = true; // false true.
extern double PercentDepo    = 1.0;   // Ispol'zuemyi % svobodnoi marzhi.
 
int    first,l;
double MINLOT,LOTSTEP,MAXLOT,mLot;
 
void start() {
   if(UseMM) Lot=LotSize(PercentDepo); // Raschet lota.
}
//+------------------------------------------------------------------+
double LotSize(double PD) { if(first==0) { first=1;
   MINLOT=(MarketInfo(Symbol(),MODE_MINLOT)); // Zapominaem minimal'no razreshennyi lot.
   LOTSTEP=(MarketInfo(Symbol(),MODE_LOTSTEP)); // Zapominaem minimal'nyi shag lota.
   MAXLOT=(MarketInfo(Symbol(),MODE_MAXLOT)); // Zapominaem maksimal'no razreshennyi lot.
   double d=LOTSTEP; while(d<1) { d=d*10; l++; }} // Vychislyaem "Digits" dlya avtomaticheskogo rascheta lota.
   mLot=NormalizeDouble(AccountEquity()*0.00001*PD,l); // Raschet lota.
   if(mLot<MINLOT) mLot=MINLOT; if(mLot>MAXLOT) mLot=MAXLOT; return(mLot); }
//+------------------------------------------------------------------+
 
В частности строка

double d=LOTSTEP; while(d<1) { d=d*10; l++; }

и получает разрядность лота.

Тут много лишнего, но я писал это для себя, использую как библиотеку.