XAUUSD неправильный размер лота на счете, номинированном в GBP?

 

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

Все размеры позиций по валютным парам верны. Поскольку мой счет деноминирован в британских фунтах, минимальный размер тика больше, чем на торговом счете, деноминированном в долларах США (разумеется).

В любом случае, поскольку я торгую с FXCM, минимальный размер позиции в MT4 составляет "1.00" тройской унции. Это примерно соответствует 0,0624 пенса за 1 цент движения. (т.е. без учета спредов 1 200,00 > 1 200,01 = £ 0,0624).

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

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+
void OrderEntry(int direction)
{
   //Padding for the stop and padding for the entry too. 
   double ATR_Pad = iATR(NULL,60,14,1) / 2; 
   double Buy_Pad = NormalizeDouble(ATR_Pad,Digits);
   double Sell_Pad = NormalizeDouble(ATR_Pad,Digits);
   
   //Stop calculations.    
   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
  
   //Lot calculation.
   double risk_amount = AccountBalance( ) * RiskPercent / 100;
   double Lot_Step = MarketInfo(Symbol(), MODE_LOTSTEP);
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   double minlot = MarketInfo(Symbol(), MODE_MINLOT);
         
          
//+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists. Pending or otherwise.
if(direction==0)
{ 
      
      //Get Highest Price in our lookback range and set buy price above it.
      int iTBT = iBarShift(NULL,60, triggerBarTime, true),
      iHH = iHighest( NULL,60, MODE_HIGH, iTBT + CandlesBeforeBiasObtained, 0 );
      double Buy_Here = High[iHH] + Buy_Pad;
      double buyPrice = NormalizeDouble( Buy_Here,Digits);
            
      double BuyStopPriceMath = MA - ATR;
      double BuyStopPrice = NormalizeDouble( BuyStopPriceMath,Digits );

      //get our buystop price from below the ma and our takeprofit based on our r:r ratio.
      double pips_to_bsl = buyPrice - BuyStopPrice;
      double buy_tp_price = ( pips_to_bsl * RewardRatio ) + buyPrice;
      double buy_takeprofit_price = NormalizeDouble( buy_tp_price, Digits );
      
      double loss_for_1_lot = pips_to_bsl/ ts * tv ;
      double LotSize_Buy = MathFloor( risk_amount / loss_for_1_lot/ Lot_Step) * Lot_Step ;


...
 

??

double buyPrice = NormalizeDouble( Buy_Here,Digit s);
 
Почему это может быть причиной меньших, чем обычно, лотов, выделенных на позицию по XAUUSD?
 
DomGilberto:
Почему это может быть причиной меньших, чем обычно, лотов, выделенных на позицию по XAUUSD?
Так вы получаете ошибку компиляции? или это опечатка? или вы объявили Digit и s как что-то? и если вы объявили Digit, то каково его значение?
 

Нет - я говорю, что то, что я показал вам в этом коде выше, работает на всех валютных парах идеально... На XAUUSD он работает отлично, но лоты, выделенные на сделку, примерно вдвое меньше, чем должны быть; в соответствии с тем, какой % риска от моего баланса я собираюсь использовать на сделку...

То есть, говоря простым языком, я хочу рискнуть 2%, если эта сделка (XAUUSD) остановится, это будет скорее 1% убытка, а не.... это странно?

UPDATE: извините, я случайно пропустил букву "с" в слове Digit... Чтобы вам было легче читать! Это должно быть Digits ( функция).

Полагаю, я пытаюсь сказать, что мой счет в британских фунтах влияет на правильный размер лота, который должен быть выделен... если бы у меня был счет в долларах США, это не было бы более точным (поправьте меня, если я ошибаюсь!).

 
DomGilberto:
Нет - я говорю, что то, что я показал вам в этом коде выше, работает на всех валютных парах идеально... На XAUUSD он работает отлично, но лоты, выделенные на сделку, примерно в два раза меньше, чем должны быть; в соответствии с тем, какой % риска от моего баланса я собираюсь использовать на сделку...

То есть, говоря простым языком, я хочу рисковать 2%, если эта сделка (XAUUSD) остановится, это будет скорее 1% убытка, а не.... это странно?
Хорошо, тогда распечатайте все переменные, участвующие в расчете, запустите его на XAUUSD и посмотрите, какая переменная или переменные неверны ... тогда вы будете ближе к пониманию того, почему это неправильно.
 

double LotSize_Sell = MathFloor( risk_amount / loss_for_1_lot1/ Lot_Step) * Lot_Step ;
2013.11
.08 23:40:30     2013.06.19 19:00  V1 - XAUUSD XAUUSD,H1:  LotSize_Sell formula: ( 200 / 23.64 / 1 ) * 1 = 8
double loss_for_1_lot1 = pips_to_ssl/ ts * tv ;
2013.11.08 23:40:30     2013.06.19 19:00  V1 - XAUUSD XAUUSD,H1:  loss_for_1_lot1 formula: 23.64 / 0.01 * 0.01 = 23.64
 double pips_to_ssl = SellStopPrice - sellPrice;

2013.11.08 23:40:30     2013.06.19 19:00  V1 - XAUUSD XAUUSD,H1:  pips_to_ssl formula: 1378.45 - 1354.81 = 23.64

Но это в рамках ST... так что, как вы мне уже говорили, это не будет отличаться от деноминации счета.....

Как вы думаете, это нормально? "23.64" пункта?


(Обновление: Просто чтобы вы знали, это отпечатки для стороны продажи! Извините, если это вас смутило... Я не знал :P)

 

Насколько я могу судить, это должно работать нормально.

Единственное, что немного странно, это TV = 0.01, кажется низким даже для микросчета, и я бы не ожидал такого для счета GBP.

Это случайно не счет для ставок на спред?

 
DomGilberto:
double pips_to_ssl = SellStopPrice - sellPrice;
Как вы думаете, это нормально? "23.64" очков?

Это изменение цены, а не количество пунктов (2364). Вы не конвертируете изменение в количество пунктов.

Вам не нужны точки в вашем

pips_to_bsl/ ts * tv

вычислениях. Переименуйте переменную в change_to_ssl.

 
Нет, это не счет для ставок на спред.

@WHRoader - Что вы имеете в виду, когда говорите, что я не хочу включать пункты в этот расчет?

Как я могу применить правильный риск к данной сделке на основе расстояния до стопа, если я не включаю пункты в формулу...? (в замешательстве).

23.64 || 2,364 пункта... Вот что я пытаюсь понять... Честно говоря, я убежден, что применяю слишком мало позиций на 1 тройскую унцию, потому что у меня счет, номинированный в фунтах стерлингов... Мне просто нужно, чтобы кто-то сказал мне, что я прав / не прав, исходя из того, что я показал?
 
DomGilberto:
Нет, это не счет спрэд-беттинга.

@WHRoader - Что вы имеете в виду, если я не хочу использовать пункты в этом расчете?

Как я могу применить правильный риск к данной сделке на основе расстояния до стопа, если я не включаю пункты в формулу...? (в замешательстве).

23.64 || 2,364 пункта... Вот что я пытаюсь понять... Честно говоря, я убежден, что применяю слишком мало позиций на 1 тройскую унцию, потому что у меня счет, номинированный в фунтах стерлингов... Мне просто нужно, чтобы кто-то сказал мне, что я прав / не прав, исходя из того, что я показал?


Не могли бы вы показать ваш код, который приводит к такому выводу?

double loss_for_1_lot1 = pips_to_ssl/ ts * tv ;

2013.11.08 23:40:30 2013.06.19 19:00 V1 - XAUUSD XAUUSD,H1: формула loss_for_1_lot1: 23.64 / 0.01 * 0.01 = 23.64

Возможно, вы могли бы добавить этот принт

Print("Валюта счета = ",AccountCurrency() );

чтобы подтвердить, что вы действительно торгуете GBP в ST, потому что я не вижу способа, которым tv может быть 0.01.