Т.е. я один раз делаю OrderSelect, а потом еще раз из функции... Чертовщина какая-то...
Вы выбрали ордер по тикету
Ушли в функцию проверки количества ордеров. Если ордеров больше одного, то в цикле выбираются по одному все имеющиеся ордера для их подсчёта
После возврата из функции выделенным оказывается тот, кторый был последним в списке ордеров в терминале, и он не обязательно будет тем, который вы в п.1 выбрали по тикету.
Далее вы проверяете время закрытия уже нового выделенного ордера, а закрывать пытаетесь тот, который якобы выбран по тикету, но его выбор уже утерян.
Простая же логика...
Следите за последовательностью проводимых операций.
Очевидно, что сначала нужно проверить количество, затем выбрать нужный ордер, и затем уже проводить над ним нужные вам операции.
Ушли в функцию проверки количества ордеров. Если ордеров больше одного, то в цикле выбираются по одному все имеющиеся ордера для их подсчёта
После возврата из функции выделенным оказывается тот, кторый был последним в списке ордеров в терминале, и он не обязательно будет тем, который вы в п.1 выбрали по тикету.
Далее вы проверяете время закрытия уже нового выделенного ордера, а закрывать пытаетесь тот, который якобы выбран по тикету, но его выбор уже утерян.
Простая же логика...
Следите за последовательностью проводимых операций.
Очевидно, что сначала нужно проверить количество, затем выбрать нужный ордер, и затем уже проводить над ним нужные вам операции
как мне теперь вывести, что количество знаков после запятой здесь 2? чтобы потом нормализовать объем ордера до двух знаков после запятой.
Попробуйте вот эту.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 16.05.2008 |//| Описание : Возвращает нормализованное значение торгуемого лота. |//+----------------------------------------------------------------------------+//| Параметры: |//| lo - нормализуемое значение лота. |//| ro - способ округления ( False - в меньшую, |//| True - в большую сторону) |//| sy - наименование инструмента ("" или NULL - текущий символ) |//+----------------------------------------------------------------------------+double NormalizeLot(double lo, bool ro=False, string sy="") {
double l, k;
if (sy=="" || sy=="0") sy=Symbol();
double ls=MarketInfo(sy, MODE_LOTSTEP);
double ml=MarketInfo(sy, MODE_MINLOT);
double mx=MarketInfo(sy, MODE_MAXLOT);
if (ml==0) ml=0.1;
if (mx==0) mx=100;
if (ls>0) k=1/ls; else k=1/ml;
if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;
if (l<ml) l=ml;
if (l>mx) l=mx;
return(l);
}
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
multiplicator: я вижу, что при открытии терминал сам нормализовывает ордер до нужного количества знаков после запятой. может и не нужно ничего нормализовывать?
multiplicator: я вижу, что при открытии терминал сам нормализовывает ордер до нужного количества знаков после запятой. может и не нужно ничего нормализовывать?
Если хотите впоследствии получать ошибку за ошибкой - не нормализуйте.
А ведь что-то, действительно, не так...
Т.е. я один раз делаю OrderSelect, а потом еще раз из функции... Чертовщина какая-то...
Простая же логика...
Следите за последовательностью проводимых операций.
Очевидно, что сначала нужно проверить количество, затем выбрать нужный ордер, и затем уже проводить над ним нужные вам операции.
вы в каком направлении просматриваете массив ордеров ?
если при "ревизии" возможны закрытия/удаления, то лучше смотреть в обратном. От OrdersTotal()-1 до 0 включительно.
иначе можно наступить :-)
я как-то таким образом чуть персональный грааль не открыл :-)
удаление старых ордеров из "глубин времени" в настоящее (через раз, а не всех) подняло тестерную прибыльность в какие-то небеса :-)
Простая же логика...
Следите за последовательностью проводимых операций.
Очевидно, что сначала нужно проверить количество, затем выбрать нужный ордер, и затем уже проводить над ним нужные вам операции
Сделал вот так:
Просто поставил вначале подсчет ордеров, а потом все остальное.
Благодарствую, Артем. Заработает- с меня Грааль. Именно эта ошибка меня и губила...
Как посчитать количество знаков после запятой?
например, я узнал, что минимальный лот 0.01.
как мне теперь вывести, что количество знаков после запятой здесь 2?
чтобы потом нормализовать объем ордера до двух знаков после запятой.
Как посчитать количество знаков после запятой?
например, я узнал, что минимальный лот 0.01.
как мне теперь вывести, что количество знаков после запятой здесь 2?
чтобы потом нормализовать объем ордера до двух знаков после запятой.
Попробуйте вот эту.
Попробуйте вот эту.
Зачем такое старьё предлагать?
Как посчитать количество знаков после запятой?
например, я узнал, что минимальный лот 0.01.
как мне теперь вывести, что количество знаков после запятой здесь 2?
чтобы потом нормализовать объем ордера до двух знаков после запятой.
Вот в статье есть готовая функция.
Остаётся только добавить действие в зависимости от возвращённого результата работы этой функции.
я ставлю такой лот
а сделка открывается с объемом 1.11.
так может и не нужно ничего нормализовывать?
я вижу, что при открытии терминал сам нормализовывает ордер до нужного количества знаков после запятой.
может и не нужно ничего нормализовывать?
Если редактор делает то же самое - не нужно.
я вижу, что при открытии терминал сам нормализовывает ордер до нужного количества знаков после запятой.
может и не нужно ничего нормализовывать?
Если хотите впоследствии получать ошибку за ошибкой - не нормализуйте.
Если хотите впоследствии получать ошибку за ошибкой - не нормализуйте.