XAUUSD lote de tamanho errado em conta denominada em GBP?

 

Aprecio que isto tenha sido brevemente abordado no passado, mas eu queria falar sobre isso novamente, já que estou testando minha EA com uma pequena conta ativa.

Todos os dimensionamentos de posição com os pares de moedas estão corretos. Como minha conta é denominada em GBP, o tamanho mínimo do tick é maior do que o de uma conta de negociação que foi denominada em USD (é claro).

De qualquer forma, como estou negociando com FXCM, o tamanho mínimo da posição dentro da MT4 é de "1,00" onça troy. Isto equivale aproximadamente a 0,0624 pence por 1 centavo de movimento. (isto é, excluindo spreads 1.200,00 > 1.200,01 = 0,0624 libras esterlinas).

Este é o código que estou usando... Por alguma razão, estou certo de que não está calculando o tamanho correto da posição...

//+------------------------------------------------------------------+
//| 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);
 
Por que essa seria a razão dos lotes menores do que o normal alocados para a posição no XAUUSD?
 
DomGilberto:
Por que essa seria a razão dos lotes menores do que o normal alocados para a posição no XAUUSD?
Então você recebe um erro de compilação ? ou é um erro de digitação ? ou você declarou Digit e s como algo ? e se você declarou Digit qual é o seu valor ?
 

Nenhum - Estou dizendo que o que lhe mostrei nesse código acima funciona perfeitamente em todos os pares FX... No XAUUSD, funciona perfeitamente, mas os lotes alocados à negociação é como metade do que provavelmente deveria ser; de acordo com qual % de risco do meu saldo eu pretendo usar por negociação...

Então, em termos leigos; quero arriscar 2%, se esse comércio (XAUUSD) parar, será mais como uma perda de 1% em vez.... seu esquisito?

ATUALIZAÇÃO: Desculpe-me por ter espaçado acidentalmente os s do Digit... Então, vocês poderiam ler mais facilmente! Deveria ser o Digit (a função).

Acho que o que estou tentando dizer é que, sendo minha conta denominada GBP está tendo um efeito sobre o tamanho correto do lote que deveria ser alocado... onde como se eu tivesse uma conta em USD, não seria mais preciso (me corrija se eu estiver muito longe!).

 
DomGilberto:
Nenhum - Estou dizendo que o que lhe mostrei nesse código acima funciona perfeitamente em todos os pares FX... No XAUUSD, funciona perfeitamente, mas os lotes alocados à negociação é como metade do que provavelmente deveria ser; de acordo com qual % de risco do meu saldo eu pretendo usar por negociação...

Então, em termos leigos; quero arriscar 2%, se esse comércio (XAUUSD) parar, será mais como uma perda de 1% em vez.... seu esquisito?
OK, então imprima todas as variáveis envolvidas no cálculo, execute-o no XAUUSD e veja qual variável ou variáveis estão incorretas ... então você estará mais perto de saber por que está errado.
 

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

Isso está dentro do ST... então, como você já me disse antes, não será diferente na denominação da conta....

Isso lhe parece bem? pontos "23,64"?


(Atualização: Só para que você saiba, elas são as impressões para o lado da venda! Desculpe se isso o confundiu... Eu não percebi :P)

 

Tanto quanto eu posso ver, isso deve funcionar bem.

A única coisa um pouco estranha é a TV = 0,01, parece baixa mesmo para uma conta micro e não esperaria isso para uma conta em libras esterlinas.

Por acaso, é uma conta de apostas em spread?

 
DomGilberto:
double pips_to_ssl = SellStopPrice - sellPrice;
Isso lhe parece bem? pontos "23,64"?

Isso é uma mudança no preço, não um número de pontos (2364.) Você não está convertendo a mudança para o número de pontos.

Você não quer pontos em seu

pips_to_bsl/ ts * tv

cálculo. Renomear a variável para mudar_para_ssl

 
Não, não é uma conta de apostas spread.

@WHRoader - O que você quer dizer com "não quero pontos nesse cálculo"? :s?

Como posso aplicar o risco correto à determinada operação com base na distância até a parada se eu não incluir pontos na fórmula...? (confuso).

23,64 || 2.364 pontos... É isso que estou tentando fazer com que minha cabeça se mova... Para ser franco, estou convencido de que estou aplicando muito poucas posições de 1 onça troy porque tenho uma conta denominada em libras esterlinas... Eu só preciso que alguém me diga que estou certo / errado pelo que eu mostrei?
 
DomGilberto:
Não, não é uma conta de apostas em spread.

@WHRoader - O que você quer dizer com "não quero pontos nesse cálculo"? :s?

Como posso aplicar o risco correto à dada operação com base na distância até a parada se eu não incluir pontos na fórmula...? (confuso).

23,64 || 2.364 pontos... É isso que estou tentando fazer com que minha cabeça se mova... Para ser franco, estou convencido de que estou aplicando muito poucas posições de 1 onça troy porque tenho uma conta denominada em libras esterlinas... Eu só preciso que alguém me diga que estou certo / errado pelo que eu mostrei?


Você pode, por favor, mostrar seu código que resulta nesta impressão?

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: perda_para_1_lot1 fórmula :23.64 / 0.01 * 0.01 = 23.64

Talvez você possa adicionar esta impressão

Imprimir("Moeda da conta = ",AccountCurrency() );

para confirmar que você está realmente negociando GBP no ST porque eu não vejo como a TV pode ser 0,01