Уважаемые, у меня вопрос...

 

Столкнулся с проблемой знака после запятой для объема лота...

к примеру в Альпари или на Адмирале LOTSTEP=0.01 т.е. можем поставить 0.11, 0.63 и т.д.

у WForex или MMCIS LOTSTEP=0.1 т.е 0.11 или 0.63 уже не возможно - 131 ошибка

так как програмно влипить количество знаков для расчета лота?

предположим код расчитал размер лота 1.47321990 как отрезать стока знаков скока надо...

для альпари писал так Lots=NormalizeDouble(Lots/2,2); для ММСИС - не проходит... нужно на один знак уменьшить, как сделать универсально, что бы код сам определял необходимое количество знаков после запятой для размера лота?

 
valenok2003 писал(а) >>
Digits - предопределённая переменная.

int Digits

Количество цифр после десятичной точки в цене текущего инструмента.

а мне не цену расчитать а объем сделки!!!

 
valenok2003 >>:
Digits - предопределённая переменная.

Не всегда получится то, что хотелось бы.


to Michelangelo

Используйте эту функцию. Объяснять не буду, разберетесь.

//————————————————————————————————————————————————————————————————————————
//Выбор в дискретном пространстве.
//Режимы:
//1-ближайшее снизу
//2-ближайшее сверху
//любое-до ближайшего
double SelectInDiscreteSpace
 (
 double In,
 double InMin,
 double InMax,
 double step,
 int    RoundMode
 )
{
  if(step==0.0)
    return(In);
  // обеспечим правильность границ
  if( InMax < InMin )
  {
    double temp = InMax; InMax = InMin; InMin = temp;
  }
  // при нарушении - вернем нарушенную границу
  if( In < InMin ) return( InMin );
  if( In > InMax ) return( InMax );
  if( InMax == InMin || step <= 0.0 ) return( InMin );
  // приведем к заданному масштабу
  step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );
  switch( RoundMode )
  {
  case 1:  return( InMin + step * MathFloor ( ( In - InMin ) / step ) );
  case 2:  return( InMin + step * MathCeil  ( ( In - InMin ) / step ) );
  default: return( InMin + step * MathRound ( ( In - InMin ) / step ) );
  }
}
//————————————————————————————————————————————————————————————————————————
 
double MarketInfo( string symbol, int type) 
в помощь, там есть параметр запроса:
MODE_LOTSTEP 24 Шаг изменения размера лота
 
sanyooooook писал(а) >>
в помощь, там есть параметр запроса:
MODE_LOTSTEP 24 Шаг изменения размера лота


Сань, это то понятно...

вопрос вот вчем: мы знаем что Step=MarketInfo(Symbol(),MODE_LOTSTEP);

а также Lots=(сложные вычесления)=0.6346

теперь надо привести Lots (нормализовать) до количества занков в Step... для разных ДЦ он (Step) разный... у когото 0.1, у когото 0.01 и нужно -

Lots=(Некая функция(Lots,Step));

 
Michelangelo >>:


Сань, это то понятно...

вопрос вот вчем: мы знаем что Step=MarketInfo(Symbol(),MODE_LOTSTEP);

а также Lots=(сложные вычесления)=0.6346

теперь надо привести Lots (нормализовать) до количества занков в Step... для разных ДЦ он (Step) разный... у когото 0.1, у когото 0.01 и нужно -

Lots=(Некая функция(Lots,Step));

int X=NormalizeDouble(1/MarketInfo(Symbol(),MODE_LOTSTEP),0);
switch (X)
{
   case 10: LotDigits=1;
   case 100: LotDigits=2;
}
что-нибудь типа этого
 

опять через задний проход идти... :)

MarketInfo(Symbol(),MODE_LOTSTEP)=1*10^(-x)... вот этот х и надо найти...

Step=MarketInfo(Symbol(),MODE_LOTSTEP);

i=0;

while (Step!=1)

{ i++; Step=Step*10;}

Lots=NormalizeDouble(Lots,i);

 
Michelangelo >>:


Сань, это то понятно...

вопрос вот вчем: мы знаем что Step=MarketInfo(Symbol(),MODE_LOTSTEP);

а также Lots=(сложные вычесления)=0.6346

теперь надо привести Lots (нормализовать) до количества занков в Step... для разных ДЦ он (Step) разный... у когото 0.1, у когото 0.01 и нужно -

Lots=(Некая функция(Lots,Step));

дал же выше код, юзайте на здоровье. возможно там, откуда взята эта функция, есть ещё полезные в хозяйстве штуки, посмотрите.

а у кого то 0.05.

используйте так:


Lots=SelectInDiscreteSpace(SlognoNaydeniyLot,MinLot,MaxLot,Step,3);

поэкспериментируйте с MaxLot - ни к чему не обязывающая величина с тем, что бы получалось то, что нужно.

 
//===============================================================================
// Функция расчитывает объем лота исходя из заданного уровня риска
//===============================================================================
double GetLots(string lSymbol) {
   double LotMin     = MarketInfo(lSymbol, MODE_MINLOT);
   double LotMax     = MarketInfo(lSymbol, MODE_MAXLOT);
   double LotStep    = MarketInfo(lSymbol, MODE_LOTSTEP);
   double MarginInit = MarketInfo(Symbol(), MODE_MARGININIT);
   double lot=MathRound(Lots/LotStep)*LotStep;
//   if (Risk>0) {
//   
//      lot=(AccountBalance()/
//   
//   }
   
   
   lot=MathMax(LotMin,MathMin(LotMax,lot));
   
   return(lot); 
}
Можно примерно так делать
 
// ============ ProverkaLota() ==================================================
// функция принимает и нормализует лот ордера
//-----------------------------------------------------
double ProverkaLota(double LotOrdera){
  string SMB=Symbol();
  double MinLots=(MarketInfo(SMB,MODE_MINLOT));
  double MaxLots=MarketInfo(SMB,MODE_MAXLOT);
  double CorrectLot=0;
  int    diglots=0;
  switch(MinLots){
    case 0.01:   diglots=2; break;
    case 0.1:    diglots=1; break;
    case 1:      diglots=0; break;
    default:
      CorrectLot=0;
  }
  CorrectLot=NormalizeDouble(LotOrdera,diglots);
  if(CorrectLot<MinLots){
    CorrectLot=MinLots;
  }
  if(CorrectLot>MaxLots){
    CorrectLot=MaxLots;
  }
  return(CorrectLot);
}
// =============================================================================================
 
drknn >>:

я может что-то путаю, но

Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.

Причина обращения: