Как рассчитать размер комиссии брокера в пунктах?

 
Брокер кроме спреда начисляет комиссию, например $8 за лот ($100000). Затраты на спред отображаются на графике линиями уровней Bid и Ask (тут всё понятно).
Кроме этого хочется отобразить уровни, которые отражают затраты на комиссию (сверх спреда).
Подскажите, кто в состоянии, как преобразовать комиссию брокера которая в деньгах за лот в размер комиссии в пунктах ценового графика.
Всем профитов!
 
TickValue
 
fxsaber:
TickValue

Увы МТ4
 
Yury Kirillov:

Увы МТ4


И? мт4 - SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)

 
Arkadii Zagorulko:


И? мт4 - SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE)


Это комиссия брокера в пунктах? Что-то не похоже...

Кроме того:

SYMBOL_TRADE_TICK_VALUE

Значение SYMBOL_TRADE_TICK_VALUE_PROFIT

double

SYMBOL_TRADE_TICK_VALUE_PROFIT

Не поддерживается

double

SYMBOL_TRADE_TICK_VALUE_LOSS

Не поддерживается

double


SYMBOL_TRADE_TICK_VALUE это значение SYMBOL_TRADE_TICK_VALUE_PROFIT, а последнее Не поддерживается.

 
Yury Kirillov:

Это комиссия брокера в пунктах? Что-то не похоже...

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

tv=SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE);

(Comm/(tv*OrderLots()))*point
 
Vitaly Muzichenko:

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

tv=SymbolInfoDouble(symb,SYMBOL_TRADE_TICK_VALUE);

(Comm/(tv*OrderLots()))*point


Спасибо, но что-то не сходится в этой формуле:

1. Сомм - это комиссия в $ за лот (с её ростом комиссия в пунктах растёт - верно)

2. TV - стоимость пункта в $ (c её ростом комиссия в пунктах падает - верно)

3. OrderLots() - объём сделки в лотах (c его ростом комиссия в пунктах падает - НЕ верно)

4. point - размер пункта текущего инструмента в валюте котировки (тут не могу сообразить, как это влияет)

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

 
Yury Kirillov:


Спасибо, но что-то не сходится в этой формуле:

1. Сомм - это комиссия в $ за лот (с её ростом комиссия в пунктах растёт - верно)

2. TV - стоимость пункта в $ (c её ростом комиссия в пунктах падает - верно)

3. OrderLots() - объём сделки в лотах (c его ростом комиссия в пунктах падает - НЕ верно)

4. point - размер пункта текущего инструмента в валюте котировки (тут не могу сообразить, как это влияет)

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

Отправил в личку
 
Yury Kirillov:


Спасибо, но что-то не сходится в этой формуле:

1. Сомм - это комиссия в $ за лот (с её ростом комиссия в пунктах растёт - верно)

2. TV - стоимость пункта в $ (c её ростом комиссия в пунктах падает - верно)

3. OrderLots() - объём сделки в лотах (c его ростом комиссия в пунктах падает - НЕ верно)

4. point - размер пункта текущего инструмента в валюте котировки (тут не могу сообразить, как это влияет)

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

Но размер комиссии зависит от размера сделки. 8$ за стандартный лот, а за 0.1 лота будет 0.8$ не так-ли?

Вот и получается что если разделить комиссию на стоимость 1го пункта получим комиссию в пунктах.

 
Alexey Viktorov:

Но размер комиссии зависит от размера сделки. 8$ за стандартный лот, а за 0.1 лота будет 0.8$ не так-ли?

Вот и получается что если разделить комиссию на стоимость 1го пункта получим комиссию в пунктах.

Вопрос: будет ли работать, например:

SymbolInfoDouble("EURJPY",SYMBOL_TRADE_TICK_VALUE,m_tick_value);

Если единственный инструмент выбранный в обзоре рынка "GBPCAD"?

Комиссия брокера в пунктах:

BrokerCom=BrokerCommission/m_tick_value*_Point;

BrokerCommission - комиссия в долларах на лот $100000

Ну и держите, может кому сгодится...

Аналог SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE,m_tick_value);

//======================================================================================================
//    CalcTickValue()  - вычисляет стоимость пункта для указанного инструмента
//    Вход:
//       iSymbol  -  используемый инструмент (валютная пара)
//    Выход:
//       double   -  расчетная стоимость
//======================================================================================================
double CalcTickValue(string iSymbol){
string
   iPairs=
      "#GBP"+"%0"//GBPUSD
      "#EUR"+"%0"//EURUSD
      "#AUD"+"%0"//AUDUSD
      "#NZD"+"%0"//NZDUSD
      "#LTC"+"%0"//LTCUSD
      "#BTC"+"%0"//BTCUSD
      "#USD"+"%0"//
      
      "#CAD"+"%1"//!!!USDCAD
      "#JPY"+"%1"//!!!USDJPY
      "#TRY"+"%1"//!!!USDTRY
      "#MXN"+"%1"//!!!USDMXN
      "#NOK"+"%1"//!!!USDNOK
      "#SEK"+"%1"//!!!USDSEK
      "#CNH"+"%1"//!!!USDCNH
      "#HKD"+"%1"//!!!USDHKD
      "#ZAR"+"%1"//!!!USDZAR
      "#RUB"+"%1"//!!!USDRUB
      
      "#USOil"+"%0"
      "#UKOil"+"%0";
string
   BaseCurrency=StringSubstr(iSymbol,0,3),
   CotirCurrency=StringSubstr(iSymbol,3,3),
   OilCurrency=StringSubstr(iSymbol,2,3);//не доделано
   {if(BaseCurrency=="USD")//USDZZZ - Прямая котировка, Базовая валюта доллар США, стоимость лота $100000.0
   {
      /*Расчет стоимости пункта на Форекс/Forex в прямых котировках
      В прямых котировках мы совершаем операции с долларом, а «оплачиваем» второй валютой. 
      Цена пункта на форекс в этом случае будет зависеть от текущей котировки.
      Для примера возьмем USD/CHF. Предположим, что ее текущее значение 1.2000. Рассчитаем цену пункта для операции объемом 10 000 (0.1 лот) базовой валюты. 
      Исходя из текущего курса: 10 000 USD = 12 000 CHF.
      Предположим, что цена прошла в нужном нам направлении 1 пункт, и текущий курс составил 1.2001. 10 000 долларов в данном случае уже будет стоить 12 001 франков. Следовательно, мы заработали 1 швейцарский франк. Теперь нужно перевести это значение в американские доллары. Для этого нужно разделить прибыль на текущий курс: 1 / 1.2001 = 0.83 $. Это и есть цена одного пункта по паре USD/CHF.
      Чтобы упростить эту процедуру можно пользоваться следующей формулой:
      Цена пункта = размер пункта * объем позиции / текущий курс
      Для разобранного выше примера по паре USD/CHF:
      0,0001 (один пункт) * 10 000 (объем позиции) / 1,2001 (текущий курс) = 0,83 $.*/
      //Цена пункта = размер пункта * объем позиции / текущий курс
      return(SymbolInfoDouble(iSymbol,SYMBOL_POINT)*100000.0/((SymbolInfoDouble(iSymbol,SYMBOL_ASK)+SymbolInfoDouble(iSymbol,SYMBOL_BID))/2));
   }else{//if(BaseCurrency!="USD") Базовая валюта НЕ доллар США
//*****
      {if((CotirCurrency=="USD")||(OilCurrency=="Oil"))//XXXUSD или XXOil (фактически OILUSD) Обратная котировка, Валюта котировки доллар США, стоимость лота $100000.0*PriceXXX
      {
         /*Как рассчитать стоимость пункта в обратной котировке
         Здесь расчет легче. Забегая вперед, скажем, что в обратных котировках 1 пункт объемом 10 000 всегда равен 1 доллару США, независимо от текущего курса.
         Для примера возьмем пару EUR/USD. Здесь доллар не является базовой валютой, и все операции производятся с евро. 
         Если курс EUR/USD 1.4000, то 10 000 EUR (объем позиции) = 14 000 USD. Если цена прошла в нужном нам направлении 1 пункт, курс будет 1.4001, 10 000 EUR = 14 001 USD, доход составил 1 доллар.
         Делить полученный результат на текущий курс не нужно, т.к. в обратной котировке стоимость пункта от него не зависит, кроме того, результат мы получили уже в долларах.
         Формула расчета: Цена пункта = размер пункта * объем позиции
         Таким образом, для пары EUR/USD из нашего примера: 0,0001 * 10 000 = 1 $*/
         {if(SymbolSelect(iSymbol,true))//попытка выбрать символ в окне MarketWatch (Обзор рынка)
         {
            return(SymbolInfoDouble(iSymbol,SYMBOL_POINT)*100000.0);
         }else{
            return(-1);
         }}//if(SymbolSelect(iSymbol,true))
      }else{//XXXZZZ //if((CotirCurrency!="USD") Кросс-курс, Базовая валюта НЕ доллар США, Валюта котировки НЕ доллар США, стоимость лота $100000.0*PriceXXXUSD
         /*Расчет стоимости пункта на Форекс/Forex в кросс-курсах
         В кросс-курсах не присутствует USD. Для примера возьмем GBP/CHF, курс 1.4400.
         Формула расчета:
         Цена пункта = объем позиции * размер пункта * текущая котировка базовой валюты по отношению к USD / текущий курс валютной пары (кросс-курс)
         Для GBP/CHF: 10 000 * 0.0001 * 1.5800 (курс GBP/USD) / 1.4400 = 1.1 $*/
         {if(!IsTesting())
         {
            //Работаем в реальном режиме
            {if(StringSubstr(iPairs,StringFind(iPairs,"%",StringFind(iPairs,BaseCurrency,1))+1,1)=="0")//Ишем базовую валюту и за ней после % признак перевернутости
            {//Для базовых валют вида XXXUSD (например EURUSD) - нормальная не перевёрнутая
               {if(SymbolSelect(BaseCurrency+"USD",true))//попытка выбрать символ в окне MarketWatch (Обзор рынка)
               {
                  //return(100000.0*(SymbolInfoDouble(BaseCurrency+"USD",SYMBOL_ASK)));//не работает в тестере
                  return(100000.0*SymbolInfoDouble(iSymbol,SYMBOL_POINT)
                              *((SymbolInfoDouble(BaseCurrency+"USD",SYMBOL_BID)))
                              /((SymbolInfoDouble(iSymbol,SYMBOL_BID)))
                              //*((SymbolInfoDouble(BaseCurrency+"USD",SYMBOL_ASK)+SymbolInfoDouble(BaseCurrency+"USD",SYMBOL_BID))/2)
                              ///((SymbolInfoDouble(iSymbol,SYMBOL_ASK)+SymbolInfoDouble(iSymbol,SYMBOL_BID))/2)
                         );//не работает в тестере
               }else{
                  return(-1);
               }}//if(SymbolSelect(BaseCurrency+"USD",true))
            }else{//Для базовых валют вида USDXXX (например USDCAD) в парах XXXYYY (напрмер CADJPY)- перевернутая 
               {if(SymbolSelect("USD"+BaseCurrency,true))//попытка выбрать символ в окне MarketWatch (Обзор рынка)
               {
                  //Print(100000.0*(1/SymbolInfoDouble("USD"+BaseCurrency,SYMBOL_ASK)+1/SymbolInfoDouble("USD"+BaseCurrency,SYMBOL_BID))/2);
                  return(100000.0*SymbolInfoDouble(iSymbol,SYMBOL_POINT)
                              *((1/SymbolInfoDouble("USD"+BaseCurrency,SYMBOL_ASK)+1/SymbolInfoDouble("USD"+BaseCurrency,SYMBOL_BID))/2)
                              /((SymbolInfoDouble(iSymbol,SYMBOL_ASK)+SymbolInfoDouble(iSymbol,SYMBOL_BID))/2)
                         );
               }else{
                  return(-1);
               }}//if(SymbolSelect("USD"+BaseCurrency,true))
            }}//if(StringSubstr(iPairs,StringFind(iPairs,"%",StringFind(iPairs,BaseCurrency,1))+1,1)=="0")   
         }else{
            //Работаем в тестере - невозможно получить котировки других валют
            return(-1);
         }}//if(!IsTesting())
      }}//if((CotirCurrency=="USD")||(OilCurrency=="Oil"))
   }}//if(BaseCurrency=="USD")
   return(-1);
}//

Это примерные прикидки, прошу не судить строго... :-)

 
Yury Kirillov:

Вопрос: будет ли работать, например:

SymbolInfoDouble("EURJPY",SYMBOL_TRADE_TICK_VALUE,m_tick_value);

Если единственный инструмент выбранный в обзоре рынка "GBPCAD"?

Комиссия брокера в пунктах:

BrokerCom=BrokerCommission/m_tick_value*_Point;

BrokerCommission - комиссия в долларах на лот $100000

Ну и держите, может кому сгодится...

Аналог SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_VALUE,m_tick_value);

Это примерные прикидки, прошу не судить строго... :-)

Меня смутила вот эта строка

return(SymbolInfoDouble(iSymbol,SYMBOL_POINT)*100000.0);

Размер стандартного лота не у всех 100к. Сюда лучше взять SYMBOL_TRADE_CONTRACT_SIZE

Дальше разбираться не осилил, пойду что-нить полезное сделаю.