Как всегда душераздирающий вопрос )))
Конечно же можно было решить вопрос по пятому знак просто умножив значения ейка,стопаи слипарджа на 10*
Вот кусок кода из советника
Как я понимаю тут именно нужно чтото изменить чтобы получить программное решение этого вопрса,то есть чтобы совтник сам понимал пятизначность котировки
Это вроде есть int dig = MarketInfo(symbol, MODE_DIGITS);
Но вероятно не достаточно ....
Пожалуйста введите корректировки в коде ....
Я делаю так
int MyDig
int init()
{
..
if(MarketInfo("EURUSD", MODE_DIGITS)==4)MyDig=1;else MyDig=10;
..
}
а потом уже в старте
OrderSend(....,price,slip*MyDig,stop*MyDig,take*MyDig.....)
//+------------------------------------------------------------------------------------------------------------+ //| Описание : Возвращает нормализованное под размер тика значение цены. | //+------------------------------------------------------------------------------------------------------------+ //| Параметры: | //| np - нормализуемое значение цены. | //| sy - наименование инструмента ("" или NULL - текущий символ) | //| NormalizeDoubles - Колличество цифр после точки | //+------------------------------------------------------------------------------------------------------------+ double DigitsPrice(double np = 0, string sy="", int NormalizeDoubles = -1){ if (sy=="" || sy=="0") sy=Symbol(); if (NormalizeDoubles == -1) NormalizeDoubles = MarketInfo(sy, MODE_DIGITS); int di = MarketInfo(sy, MODE_DIGITS); if (di == 5 || di == 3){ np = np * 10; } if (di == 4 || di == 2){ np = np * 1; } np = NormalizeDouble(np,NormalizeDoubles); return(np); }
Пример: int ticket; if(iRSI(NULL,0,14,PRICE_CLOSE,0)<25) { ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-DigitsPrice(25)*Point,Ask+DigitsPrice(25)*Point,"My order #"+counter,16384,0,Green); if(ticket<0) { Print("OrderSend failed with error #",GetLastError()); return(0); } }Если на ДЦ 4-х значные котировки вернется 25, если 5-ти значные вернется 250. И так по всему коду для тейков, стопов, слипов, бидов, асков и т.д. Функция универсальна, можно вернуть необходимое колличество знаков после точки. Можно обращаться к другим валютным парам.
Решение применимо для сугубо частного случая с расхоже-бытовыми инструментами. Полно инструментов и с одним знаком, и без ваабче, и с тремя, и со стандартным тиком в 25 пунктов etc... Имо, нужно иметь спецификацию для каждого инструмента каждой кухни, в соответствии с которой и определяется дальнейшая логика поведения программы - приводить или нет.
Решение применимо для сугубо частного случая с расхоже-бытовыми инструментами. Полно инструментов и с одним знаком, и без ваабче, и с тремя, и со стандартным тиком в 25 пунктов etc... Имо, нужно иметь спецификацию для каждого инструмента каждой кухни, в соответствии с которой и определяется дальнейшая логика поведения программы - приводить или нет.
А вот это верно!
особенно с выделеным намундрыкался одно время...
Я решаю этот вопрос при помощи нескольких функций, основная из них вот эта:
//Function MathPow10 int MathPow10(int Exponent) { //----------------------------------------------------------------------------// int Result; //----------------------------------------------------------------------------// Result = MathPow(10,Exponent); //----------------------------------------------------------------------------// return(Result); //----------------------------------------------------------------------------// }
Дальше в зависимости от поставленной задачи, как пример приведу функцию перерасчета ширины канала в пункты (можно и размеры свечки ей пересчитать)
//Function ChannelSizeToInt int ChannelSizeToInt(double ChannelSize, int SymbolDigits=4) //Функция возвращает ширину канала в пунктах { //----------------------------------------------------------------------------// double ChannelSizeDrobi; int Factor,Factor2; int Result; //----------------------------------------------------------------------------// if(SymbolDigits<0){SymbolDigits=0;} if(SymbolDigits>5){SymbolDigits=4;} if(SymbolDigits==0) { Result = ChannelSize; } else { Factor = MathPow10(SymbolDigits); Result = ChannelSize*Factor; } ChannelSizeDrobi = MathAbs(ChannelSize-NormalizeDouble(ChannelSize,SymbolDigits-1)); Factor2 = MathPow10(SymbolDigits-1); if((SymbolDigits!=0)&&(ChannelSizeDrobi*Factor2>=0.5)) { Result = Result+1; } //----------------------------------------------------------------------------// return(Result); //----------------------------------------------------------------------------// }
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования