如何在 MQL4 / MT4 中对很多指数进行分组?

How to group a lot exponent in MQL4 / MT4?

我设法得到了正常的手数指数,但我需要通过图片中的分组示例对其进行一些更改。有人可以指导我如何使用分组技术获得手数指数 Group=5 Exponent=1.8?

double GroupExponent(int type)
{
   double lot=0,exponent=1.8,group=5,initialLot=0.01;
   if(type==OP_SELL)                         
   .............                            //<---- Do i need to loop this area ?
      lot= initialLot * MathPow(exponent,TotalSell());   
   return lot;
}

int TotalSell()
{
   int Sell=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
   {
      if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))continue;
      if(OrderSymbol()==Symbol() && OrderType()==OP_SELL))
         Sell++;
   }
   return Sell;
}

Q : "How to group a lot exponent in MQL4 / MT4?"

嗯,从技术上讲,指数 = 1.8 本身并不是指数,而是一个比例常数,即 按普通序数取幂

看Lot-sizings的计算公式,符合上面的Table:

|
|>>> for                                   aLayerNUMBER in range( 1, 11 ):
...      aVolumeInLOTs = 0.01 * ( 1.8 ** ( aLayerNUMBER - 1 ) )
...      print "LAYER: {0: >2d} - {1: >5.2f} Lots".format( aLayerNUMBER,
...                                                        aVolumeInLOTs
...                                                        )
... 
LAYER:  1 -  0.01 Lots
LAYER:  2 -  0.02 Lots
LAYER:  3 -  0.03 Lots
LAYER:  4 -  0.06 Lots
LAYER:  5 -  0.10 Lots
LAYER:  6 -  0.19 Lots
LAYER:  7 -  0.34 Lots
LAYER:  8 -  0.61 Lots
LAYER:  9 -  1.10 Lots
LAYER: 10 -  1.98 Lots
+0:01:07.587141
13:31:06
|
|>>>

在 MQL4 中会有,最常见的是:
double aVolumeInLOTs = NormalizeDouble( 0.01 * MathPow( 1.8, aLayerNUMBER - 1 ), 2 );

分组是(此处)5 笔交易的组,每笔交易的规模/交易量相同,
再次以指数级数(0.01、0.02、0.03、0.06、0.10、0.19、0.34、 0.61, 1.10, 1.98, 3.57, 6.42, 11.56, 20.82, 37.48, 67.46, 121.43, 218.59, 393.46, ... )

拼图的最后一块是一个原因,在哪里停止产生 5 次交易的组(为什么在第四组 5-s 停止,每组大小为 0.06 手,而不继续进行任何其他操作).

该信息未出现在问题中,因此显然对我们来说仍然是无法确定的,除非添加了更多信息。

不,您不需要周期。您可以像这样获得图层系统:

double GroupExponent(int type)
{
   double lot=0,exponent=1.8,initialLot=0.01;
   int group = 5;
   if(type==OP_SELL)                         
   {
      lot = NormalizeDouble(initialLot * MathPow(exponent, (TotalSell() - 1) / group), 2);
   }
   return lot;
}

int TotalSell()
{
   int Sell=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
   {
      if(!OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))continue;
      if(OrderSymbol()==Symbol() && OrderType()==OP_SELL))
         Sell++;
   }
   return Sell;
}

注意:只有当 Layer == 1 等于 TotalSell() == 1 时,这才会按预期工作。如果Layer == 1等于TotalSell() == 0,那么MathPow()里面的TotalSell()就不需要减1了。