GBP建ての口座で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を宣言したなら、それは何の値なのですか?
 

いいえ - 私が言っているのは、私が上のコードで示したものは、すべてのFXペアで完璧に動作するということです...。XAUSDでは、完璧に動作しますが、トレードに割り当てられたロットは、おそらくそうあるべきものの半分のようなもので、トレードごとに使用する予定の残高の何%のリスクに従っています...

つまり、平たく言えば、2%のリスクを取りたいのに、その取引(XAUSD)がストップアウトしたら、代わりに1%の損失になる...おかしいな?

UPDATE: すみません、誤ってDigitのsを空白にしてしまいました...。ということで、読みやすくしました。これは、Digits (thefunction)のはずです。

私が言いたいのは、私の口座がGBP建てであることが、割り当てられるべき正しいロットサイズに影響を及ぼしているということです... 私が米ドル口座を持っていたら、それはより正確ではないでしょうか(私が間違っていたら訂正してください!)。

 
DomGilberto:
いいえ - 私が言っているのは、私が上のコードで示したものは、すべてのFXペアで完璧に動作するということです...。XAUSDでは、完璧に動作しますが、トレードに割り当てられたロットは、おそらくそうあるべきものの半分のようなもので、トレードごとに使用する予定の残高の何%のリスクに従っています...

つまり、平たく言えば、2%のリスクを取りたいのに、そのトレード(XAUSD)がストップアウトしたら、代わりに1%の損失になる...変だろう?
OK、では計算に関わるすべての変数を印刷して、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 ポイント...ということで、頭を抱えています・・・。ぶっちゃけ、GBP建ての口座を持っているので、1トロイオンスポジションを少なめに適用しているのだと納得しています...。私はちょうど私が示したものから私が正しい/間違っていることを教えてくれる人が必要ですか?
 
DomGilberto:
これはスプレッドベッティングの口座ではありません。

WHRoader - この計算でポイントが必要ないってどういうことですか?

もし計算式にポイントが含まれていなかったら、どうやってストップまでの距離に基づいて与えられたトレードに正しいリスクを適用すればいいんだ...?(混乱中)。

23.64 || 2,364 ポイント...ということで、頭を抱えています・・・。ぶっちゃけ、GBP建ての口座を持っているので、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で実際にGBPを取引していることを確認します。