Расчет свопа - как?

 

Что-то лыжи не едут, точнее едут, но не так :)

Есть код расчета свопа, точнее кусочек, выдернутый их контекста : 

D.mSwap = 0;
        
        MqlDateTime day = {0};
        MqlDateTime deal = {0};
        
        TimeCurrent(day);
        TimeToStruct(D.mStart, deal); // D.mStart - время открытия первой позиции в серии, если мартин, то это время открытия первой сделки в серии

        datetime current = StringToTime( // текущая дата
            string(day.year) + "." + 
            string(day.mon) + "." + 
            string(day.day));
            
        datetime start = StringToTime( // дата открытия позиции
            string(deal.year) + "." + 
            string(deal.mon) + "." + 
            string(deal.day));

        while (current > start) // своп начисляется каждый день, поэтому от текущей даты отсчитываем кол-во дней и суммируем их свопы
        {
            TimeToStruct(current, day);
            
            if (day.day_of_year != deal.day_of_year)
            {
                D.mSwap += NormalizeDouble(MathMax(D.mVolume, 1) * 
                    (SymbolInfoDouble(s, SYMBOL_TRADE_TICK_VALUE)) * 
                    (SymbolInfoDouble(s, D.mDirection > 0 ? SYMBOL_SWAP_LONG : SYMBOL_SWAP_SHORT)) *
                    (SymbolInfoInteger(s, SYMBOL_SWAP_ROLLOVER3DAYS) + 1 == day.day_of_week ? 3 : 1), 2);



// подебажим данные открытой и виртуальной позиции, результаты ниже
bool x = PositionSelect(s); 
datetime x1 = (x ? datetime(PositionGetInteger(POSITION_TIME)) : 0);
double x2 = (x ? PositionGetDouble(POSITION_SWAP) : 0);
LogData("### : " + x1 + " / " + current + " > " + start + " : " + (current > start) + " : " + D.mSwap + " / " + x2);



             }
            
            current -= PeriodSeconds(PERIOD_D1);
        }

и вот что получается в итоге : 

// V - виртуальные сделки
// R - реальные
// формат после V / R : время открытия : лот : баланс : цена открытия
// формат после ### : реальная цена открытия / текущая дата > виртуальная цена открытия : текущая дата больше открытия, своп начисляется : своп виртуальный : своп реальный

V : 2014.01.17 19:35:00 : 0.08 : 10966.45000000 : 1.35298000
R : 2014.01.17 19:35:00 : 0.08 : 10966.45000000 : 1.35298000
V : 2014.01.17 20:35:00 : 0.16 : 10957.57000000 : 1.35226000
R : 2014.01.17 20:35:00 : 0.16 : 10957.57000000 : 1.35226000
### : 2014.01.17 20:35:00 / 2014.01.20 00:00:00 > 2014.01.17 00:00:00 : true : -0.92 / -0.92
### : 2014.01.17 20:35:00 / 2014.01.19 00:00:00 > 2014.01.17 00:00:00 : true : -1.84 / -0.92
### : 2014.01.17 20:35:00 / 2014.01.18 00:00:00 > 2014.01.17 00:00:00 : true : -2.76 / -0.92

по логу видно, что текущая дата 2014.01.20, открылась позиция 2014.01.17, т.е. я должен был получить убыток по EURUSD по свопам = 0.92 * 3 = 2.76, почему МТ посчитал убыток только за последний день?

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

while (current > start)
т.е. если считать свопы только за 1 день, то расчеты сходятся с МТ-шными, что за хрень, свопы же каждый день начисляются, почему МТ в позиции, открытой несколько дней, считает своп только за последний?
 

Не вдаваясь в подробности вашего вопроса скажу так, что в архитектуре МТ5, своп - это атрибут закрывающей сделки (!). Во как. Т.е. если у Вас есть открытая позиция, то своп по ней будет известен лишь в момент закрытия этой позиции. Он будет начислен на закрывающую эту позицию сделку.

Хотя конечно, логичнее своп было бы представлять в виде производной финансовой операции.

 
C-4:

Не вдаваясь в подробности вашего вопроса скажу так, что в архитектуре МТ5, своп - это атрибут закрывающей сделки (!). Во как. Т.е. если у Вас есть открытая позиция, то своп по ней будет известен лишь в момент закрытия этой позиции. Он будет начислен на закрывающую эту позицию сделку.

Хотя конечно, логичнее своп было бы представлять в виде производной финансовой операции.

не, это врядли, МТ не просто не насчитывает свопы за каждый день до закрытия позиции, он и после закрытия их так считает, как показано в логах, потому что финальный баланс у меня сходится с МТ-шным копейка-в-копейку если я своп не по дням считаю, а по позициям, т.е. неважно сколько дней открыта позиция, своп с нее снимается только один раз ...
 
artemiusgreat:
не, это врядли, МТ не просто не насчитывает свопы за каждый день до закрытия позиции, он и после закрытия их так считает, как показано в логах, потому что финальный баланс у меня сходится с МТ-шным копейка-в-копейку если я своп не по дням считаю, а по позициям, т.е. неважно сколько дней открыта позиция, своп с нее снимается только один раз ...
Своп один раз снимается. Но величина снятия каждый раз разная. Чем больше удерживаете позицию дней - тем больше свопа начисляется при ее закрытии. Или у Вас получается что величина свопа - константа, не зависящая от количества удержания позиции?
 
C-4:
Своп один раз снимается. Но величина снятия каждый раз разная. Чем больше удерживаете позицию дней - тем больше свопа начисляется при ее закрытии. Или у Вас получается что величина свопа - константа, не зависящая от количества удержания позиции?

вот получается, что не зависит, причем не у меня, а в МТ, при этом я помню, что в режиме визуализации своп даже на открытой позиции пересчитывается каждый день, надо будет перепроверить, может быть визуально он показывает, но к балансу при закрытии прибавляет всегда только своп всего за 1 день ...

глянул в отчет МТ, что-то не ладное, на примере простого мартина : 

2014.12.19 18:1086EURUSD.mbuyin0.011.22414860.000.000.0010 134.12
2014.12.19 18:3687EURUSD.msellout0.011.22299870.000.00-1.1510 132.97sl 1.22299
2014.12.19 18:4588EURUSD.mbuyin0.021.22339880.000.000.0010 132.97
2014.12.19 18:4989EURUSD.msellout0.021.22223890.000.00-2.3210 130.65sl 1.22223
2014.12.19 18:4990EURUSD.mbuyin0.041.22236900.000.000.0010 130.65
2014.12.22 04:5691EURUSD.msellout0.041.22436910.00-0.928.0010 137.73tp 1.22436


Последняя сделка открывается 2014.12.19 и закрывается 2014.12.22

22 - 19 = (3 дня) х (- 0.92) = - 2.76

кто сожрал два свопа?

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

ой, кажется понял, у меня практически все сделки совершались в пятницу, а потому выходные не учитывались, за них свопы снимались со среды на четверг, вопрос снят

 
C-4:

Не вдаваясь в подробности вашего вопроса скажу так, что в архитектуре МТ5, своп - это атрибут закрывающей сделки (!). Во как. Т.е. если у Вас есть открытая позиция, то своп по ней будет известен лишь в момент закрытия этой позиции. Он будет начислен на закрывающую эту позицию сделку.

Хотя конечно, логичнее своп было бы представлять в виде производной финансовой операции.

???