XAUUSD在以英镑计价的账户上的手数错误?

 

我知道这个问题在过去已经被简单地提到过,但我想再次提出来,因为我正在用一个小的真实账户测试我的EA。

所有货币对 的头寸大小都是正确的。因为我的账户是以英镑计价的,所以最小刻度的大小比以美元计价的交易账户要大(当然)。

无论如何,由于我在FXCM交易,MT4的最小头寸大小是 "1.00 "金衡盎司。这大致相当于每1美分的变动为0.0624便士。(也就是说,不包括点差 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%的损失,而不是....,这很奇怪?

更新:对不起,我不小心把Digit的s隔开了...。所以你们可以更容易地阅读它!它应该是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 "点?


(Update: Just so you know, they're the prints for the sell side!如果这让你感到困惑,很抱歉。我没有意识到 :P)

 

在我看来,这应该是可行的。

唯一有点奇怪的是TV=0.01,即使是微型账户也似乎很低,而且我不希望英镑账户也是如此。

这是不是一个差价投注账户?

 
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("Account currency= ",AccountCurrency())。

以确认你确实在ST中交易英镑,因为我看不出tv会是0.01。