Не всегда получится то, что хотелось бы.
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 | Шаг изменения размера лота |
в помощь, там есть параметр запроса:
MODE_LOTSTEP | 24 | Шаг изменения размера лота |
Сань, это то понятно...
вопрос вот вчем: мы знаем что Step=MarketInfo(Symbol(),MODE_LOTSTEP);
а также Lots=(сложные вычесления)=0.6346
теперь надо привести Lots (нормализовать) до количества занков в Step... для разных ДЦ он (Step) разный... у когото 0.1, у когото 0.01 и нужно -
Lots=(Некая функция(Lots,Step));
Сань, это то понятно...
вопрос вот вчем: мы знаем что 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; }что-нибудь типа этого
Сань, это то понятно...
вопрос вот вчем: мы знаем что 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); } // =============================================================================================
я может что-то путаю, но
Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Столкнулся с проблемой знака после запятой для объема лота...
к примеру в Альпари или на Адмирале LOTSTEP=0.01 т.е. можем поставить 0.11, 0.63 и т.д.
у WForex или MMCIS LOTSTEP=0.1 т.е 0.11 или 0.63 уже не возможно - 131 ошибка
так как програмно влипить количество знаков для расчета лота?
предположим код расчитал размер лота 1.47321990 как отрезать стока знаков скока надо...
для альпари писал так Lots=NormalizeDouble(Lots/2,2); для ММСИС - не проходит... нужно на один знак уменьшить, как сделать универсально, что бы код сам определял необходимое количество знаков после запятой для размера лота?