Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 790

 

Всем Доброго времени суток!

Мозг припух; в документации ответа не нашел, но может кто сталкивался. Вот такая строчка в советнике (доля положительных сделок): 

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd," ",2/5*100," ",100*2/5);

Выдает в журнал (например): 

3/6=0.00=0 0 40

При этом если решение от 1: 

3/3=1.00=1 0 40

Переменная BestOd=OderPluseCount/OderTotal типа double, остальные int.

То есть, как только встречается значение меньше 1, то автоматом компилятор превращает его в 0... Последние два выражения из констант вообще удивительные результаты дают - вроде, одно и тоже, а нет )))

Пробовал разные подстановки, - все, что больше 1 имеет корректную дробную часть

 

 
Igor_:

Всем Доброго времени суток!

Мозг припух; в документации ответа не нашел, но может кто сталкивался. Вот такая строчка в советнике (доля положительных сделок): 

Print(OderPluseCount,"/",OderTotal,"=",DoubleToStr((OderPluseCount/OderTotal),2),"=",BestOd," ",2/5*100," ",100*2/5);

Выдает в журнал (например): 

3/6=0.00=0 0 40

При этом если решение от 1: 

3/3=1.00=1 0 40

Переменная BestOd=OderPluseCount/OderTotal типа double, остальные int.

То есть, как только встречается значение меньше 1, то автоматом компилятор превращает его в 0... Последние два выражения из констант вообще удивительные результаты дают - вроде, одно и тоже, а нет )))

Пробовал разные подстановки, - все, что больше 1 имеет корректную дробную часть. 

Попробуй так

DoubleToStr((double)(OderPluseCount/OderTotal),2)

 
AlexeyVik:

Попробуй так

DoubleToStr((double)(OderPluseCount/OderTotal),2)

Не помогает. Но спасибо )
 
Igor_:
Не помогает. Но спасибо )
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)
 
Vinin:
DoubleToStr((double)(OderPluseCount/(OderTotal*1.0)),2)

Так работает, Спасибо. Похоже на шаманство )))

Честно говоря, я больше переживаю не за отображение, а за правильный расчет BestOd. Пришлось и его править.

Сделал так:

BestOd=(OderPluseCount/(OderTotal*1.0));

Этому есть какое-то объяснение? Ведь если бы не принт, отловить такую ошибку очень сложно. В каких случаях она может вылезти?

 
Igor_:

Так работает, Спасибо. Похоже на шаманство )))

Честно говоря, я больше переживаю не за отображение, а за правильный расчет BestOd. Пришлось и его править.

Сделал так:

BestOd=(OderPluseCount/(OderTotal*1.0));

Этому есть какое-то объяснение? Ведь если бы не принт, отловить такую ошибку очень сложно. В каких случаях она может вылезти?

При любых действиях с целочисленными значениями в результате будет целое. 
 

Сам нашел ответ в справочнике, раздел "Приведение типов". 

Если два значения объединяются бинарным оператором, то перед выполнением операции операнд младшего типа преобразовывается к более старшему типу в соответствии с приоритетом, указанным на схеме: 

Но тип double по этой схеме самый старший. А у меня были оба int. Поэтому и результат целочисленный. Введение константы старшего типа (double, float), преобразовал все int к нему.

Век живи, - век учись, а в документацию заглядывай ))) 

 
Здравствуйте! У меня такой вопрос. 
Как в советнике, который перебирает и модифицирует открытые позиции, сделать так, что бы он при очередном проходе не модифицировал повторно те ордера, которые прошли модификацию. Как то их надо "помазать"
Что то на ум ничего не приходит.
Буду очень признателен.
 
Gobsek:
что бы он при очередном проходе не модифицировал повторно те ордера, которые прошли модификацию. Как то их надо "помазать"

а что именно интересует - просто перевод в безубыток?
 

У меня тоже вопрос к спецам. Я ранее не имел дело с индикаторами.

Возможно ли на графике в отдельном окне изобразить график баланса по мэйджику, но без привязки к барам?

То есть чтобы рисовалась кривая линия наподобие той, которая рисуется в тестере стратегий, чтобы она вся умещалась в одном окне.