Как сгруппировать показатель лота в 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;
}

введите здесь описание изображения


person Roller    schedule 17.11.2020    source источник


Ответы (2)


Нет, цикл не нужен. Вы можете получить свою систему слоев следующим образом:

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, то нет необходимости вычитать 1 из TotalSell() внутри MathPow().

person Enivid    schedule 27.11.2020
comment
да! это то, что я ищу .. спасибо! - person Roller; 28.11.2020
comment
Итак, для случая, когда сделок на стороне ПРОДАЖИ не было, ваш код будет возводить в степень основание == 1,8 до степени -1/5? Это кажется ужасно неправильным и безответственным, не так ли? Он производит около 5 SHORT, по 0,89 лота каждый на первом снимке, всего что-то около 4,45 лота только на первом слое составной схемы - это правильно? Я сомневаюсь. - person user3666197; 28.11.2020
comment
@ user3666197, вопрос не содержит никаких условий для слоя № 0, но -1 / 5 для целых чисел в MQL4 дает 0. Извините, я не понимаю, что вы подразумеваете под созданием SHORT. - person Enivid; 28.11.2020
comment
В MQL4 задокументировано, что экспонента приводит второй операнд к удвоению, поэтому нет никакой гарантии, что ваш код не будет скомпилирован без этого для операндов. Даже одноразового теста в скрипте недостаточно, чтобы избежать этих рисков, как ясно из опубликованного API - double MathPow(двойное основание, двойная экспонента); -- так что никто не гарантирует, что любая следующая сборка MQL4-компилятора будет производить машинный код каким-то определенным образом (все мы помним тот день, когда строка MQL4 просто перестала быть строкой и незаметно начала становиться структурой, поэтому, если я скажем, риск, я знаю, насколько он велик) :о) - person user3666197; 28.11.2020
comment
Кстати, в области профессиональной торговли термин короткая понятен и звучит (уже несколько сотен лет): покупка инструмента — это длинная позиция, продажа — короткая, поэтому 5 коротких позиций — это 5 позиций. в группе именно так, как требовалось. - person user3666197; 28.11.2020
comment
@user3666197 Я прекрасно понимаю все слова в вашем комментарии о производстве шорт. Чего я не понимаю, так это значения предложений, в которых вы их используете. Кто производит шорты? Почему он производит шорты? Как вы пришли к числам 0,89 и 4,45? - person Enivid; 28.11.2020
comment
@user3666197 user3666197 Что касается кода, единственная проблема заключается в том, что группа объявлена ​​как двойная, и неоднозначность между слоем и TotalSell () из текста вопроса. Теперь я обращусь к ним обоим в редактировании. PS: если делитель целочисленный, то используется целочисленное деление, даже если результат присваивается переменной типа double согласно документации MQL4. - person Enivid; 28.11.2020

В : Как сгруппировать показатель лота в MQL4 / MT4?

Ну, с технической точки зрения, Экспонента = 1,8 сама по себе не показатель степени, а скорее константа масштабирования, которая возводится в степень. простыми порядковыми номерами.

См. формулу расчета размера лота, соответствующую таблице выше:

|
|>>> 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, размером 0,06 лота каждая, и никуда не двигаться дальше).

Эта информация не присутствовала в Вопросе и, очевидно, остается для нас неразрешимой, если не было добавлено больше информации.

person user3666197    schedule 26.11.2020
comment
все в порядке ... эта недостающая часть просто путем деления на группу -----> лот = начальный лот * MathPow (экспонента, TotalSell () / группа); это даст результат цели ;)???????? - person Roller; 28.11.2020