Уважаемые, у меня вопрос... - страница 2

 
Michelangelo >>:


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

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

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

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

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

Некая функция

double Normalize (double lots, double step) {
   return (MathRound(lots/step)*step);
}

Normalize(0.6346,0.1)==0.6

Normalize(0.6346,0.01)==0.63

:)

 
JavaDev >>:

Некая функция

Normalize(0.6346,0.1)==0.6

Normalize(0.6346,0.01)==0.63

:)

это понятно

double NormalizeDouble( double value, int digits)
Округление числа с плавающей запятой до указанной точности.
Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров должны быть нормализованы с точностью, значение которой хранится в предопределенной переменной Digits.
Параметры:
value - Величина с плавающей точкой.
digits - Формат точности, число цифр после десятичной точки (0-8).
 

тему можно закрыть... хоят разнообразие таких функций есть хорошо... :)

 
sanyooooook >>:

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

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



А собственно что смущает? Целый тип? Если это так, то могу сказать однозначно - передаю дробное значение лота на вход оператора switch и проблем нет ни каких - работает как часики.

Вообще, тут не понятно, что имеется ввиду под термином "целого типа". Дело в том, что такого типа данных в языке нет. Есть целочисленый, но не целый. И тут же в справке метаэдитора приводится пример использования оператора switch, в котором на вход подаётся не переменная, содержащая целочисленное значение, а переменная, содержащая строковое значение. 

 
drknn >>:


А собственно что смущает? Целый тип? Если это так, то могу сказать однозначно - передаю дробное значение лота на вход оператора switch и проблем нет ни каких - работает как часики.

Вообще, тут не понятно, что имеется ввиду под термином "целого типа". Дело в том, что такого типа данных в языке нет. Есть целочисленый, но не целый. И тут же в справке метаэдитора приводится пример использования оператора switch, в котором на вход подаётся не переменная, содержащая целочисленное значение, а переменная, содержащая строковое значение.

почему-то когда я использовал этот оператор он ни как не хотел пропускать дробные значения выражения switch, компилятор ошибок не выдает а вот при выполнении программы возращаеться непонятно что
 
drknn >>:


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

Не подскажите ссылку на такой советник  (или скрипт автомат):

 Работаю на снове Parabolic. Как только происходит перелом тренда по Р. (точка перескакивает верх или вниз), открываю сделку. ТР не ставлю, SL=значение параболика. SL передвигаю за каждой свечкой. Закрываю сделку при переломе тренда. На 15-ти минутах и выше работает нормально не жалуюсь. Но тупо сидеть ждать перелома...

Чего хотелось бы:

1. Чтобы советник хотя бы крякнул при переломе.

2. Скрипт автомат выше изложенное делал сам. 

Заранее благодарен. 

 
sanyooooook писал(а) >>

это понятно

double NormalizeDouble( double value, int digits)
Округление числа с плавающей запятой до указанной точности.
Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров должны быть нормализованы с точностью, значение которой хранится в предопределенной переменной Digits.
Параметры:
value - Величина с плавающей точкой.
digits - Формат точности, число цифр после десятичной точки (0-8).


Саш, прочти внимательней... автор не использует NormalizeDouble, он пишет свою функцию Normalize :) а ключевая строка в ней MathRound(lots/step)*step

что есть следующее Lots (типа double) делиться на Step, т.е. умножается на 10^x, округляем полученый результат до ближайшего целого и делим на 10^х, получаем размер лота с точным количеством знаков после запятой, что и требовалось получить...

MathRound(0.6346/0.01)=63;

63*0.01=0.63

имхо самый красивый вариант... и простой... :)

 
Michelangelo >>:


Саш, прочти внимательней... автор не использует NormalizeDouble, он пишет свою функцию Normalize :) а ключевая строка в ней MathRound(lots/step)*step

что есть следующее Lots (типа double) делиться на Step, т.е. умножается на 10^x, округляем полученый результат до ближайшего целого и делим на 10^х, получаем размер лота с точным количеством знаков после запятой, что и требовалось получить...

MathRound(0.6346/0.01)=63;

63*0.01=0.63

)) ну да, не заметил извиняюсь
 
Michelangelo >>:

тему можно закрыть... хоят разнообразие таких функций есть хорошо... :)

Ну зачем-же закрывать, а пофлудить :)

Если уж сильно охота получить точность в количественно выражении (и как я понял в этом и есть вся проблема), то можно конечно перебором 0.1, 0.01 и т.д.

Можно строчки поразбирать (и такие исходники видел), а можно вспомнить школьный курс математики.

int Precision(double val) {
   if (val>1) return (0);
   return (MathRound(MathLog(1/val)/MathLog(10)));
}

Precision(1)==0;

Precision(0.1)==1;

Precision(0.01)==2; и т.д.

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