Сразу видна ошибка:
if (OrderSelect (0, SELECT_BY_POS, MODE_TRADES))
По логике видно, что вместо постоянного нулевого элемента должна стоять переменная счетчика cnt.
Сразу видна ошибка:
if (OrderSelect (0, SELECT_BY_POS, MODE_TRADES))
По логике видно, что вместо постоянного нулевого элемента должна стоять переменная счетчика cnt.
Вопрос не об этом, 0 (ноль) стоит специально для проверки селекта, т.е. открыто два ордера, (например)бай, мне нужно сравнить их цены открытия (использую при усреднении или локировании), но при выборе ордера среди открытых ордеров функция селект каждый тик выбирает то первый открытый ордер по списку, то второй, в результате имеем, что позиция ордера в списке одна, а цена другая. Хорошо, изменяем 0 (ноль) на cnt if (OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES))
добавим принт прайса
......................... { amount++; Print("cnt = " + cnt); Print("OrderTicket = " + OrderTicket()); Print("OrderOpenPrice = " + DoubleToStr(OrderOpenPrice(),4)); } ..........................
получаем теже яйца только сбоку, cnt для одного и того же ордера на каждом тике меняется местом
15:14:14 XXX GBPUSD,M1: loaded successfully 15:14:16 XXX started for testing 15:14:16 2005.04.11 01:41 XXX GBPUSD,M1: tick----------------------------------------------------------------- 15:14:16 2005.04.11 01:41 XXX GBPUSD,M1: open #1 sell 0.10 GBPUSD at 1.8824 ok 15:14:16 2005.04.11 01:42 XXX GBPUSD,M1: tick----------------------------------------------------------------- 15:14:16 2005.04.11 01:42 XXX GBPUSD,M1: cnt = 0 15:14:16 2005.04.11 01:42 XXX GBPUSD,M1: OrderTicket = 1 15:14:16 2005.04.11 01:42 XXX GBPUSD,M1: OrderOpenPrice = 1.8824 15:14:16 2005.04.11 01:43 XXX GBPUSD,M1: tick----------------------------------------------------------------- ............................................ 15:14:16 2005.04.11 01:57 XXX GBPUSD,M1: open #2 sell 0.10 GBPUSD at 1.8825 ok 15:14:16 2005.04.11 01:58 XXX GBPUSD,M1: tick----------------------------------------------------------------- 15:14:16 2005.04.11 01:58 XXX GBPUSD,M1: cnt = 0 15:14:16 2005.04.11 01:58 XXX GBPUSD,M1: OrderTicket = 2 15:14:16 2005.04.11 01:58 XXX GBPUSD,M1: OrderOpenPrice = 1.8825 15:14:16 2005.04.11 01:58 XXX GBPUSD,M1: cnt = 1 15:14:16 2005.04.11 01:58 XXX GBPUSD,M1: OrderTicket = 1 15:14:16 2005.04.11 01:58 XXX GBPUSD,M1: OrderOpenPrice = 1.8824 15:14:16 2005.04.11 01:59 XXX GBPUSD,M1: tick----------------------------------------------------------------- 15:14:16 2005.04.11 01:59 XXX GBPUSD,M1: cnt = 0 15:14:16 2005.04.11 01:59 XXX GBPUSD,M1: OrderTicket = 1 15:14:16 2005.04.11 01:59 XXX GBPUSD,M1: OrderOpenPrice = 1.8824 15:14:16 2005.04.11 01:59 XXX GBPUSD,M1: cnt = 1 15:14:16 2005.04.11 01:59 XXX GBPUSD,M1: OrderTicket = 2 15:14:16 2005.04.11 01:59 XXX GBPUSD,M1: OrderOpenPrice = 1.8825 15:14:16 2005.04.11 02:00 XXX GBPUSD,M1: tick----------------------------------------------------------------- 15:14:16 2005.04.11 02:00 XXX GBPUSD,M1: cnt = 0 15:14:16 2005.04.11 02:00 XXX GBPUSD,M1: OrderTicket = 2 15:14:16 2005.04.11 02:00 XXX GBPUSD,M1: OrderOpenPrice = 1.8825 15:14:16 2005.04.11 02:00 XXX GBPUSD,M1: cnt = 1 15:14:16 2005.04.11 02:00 XXX GBPUSD,M1: OrderTicket = 1 15:14:16 2005.04.11 02:00 XXX GBPUSD,M1: OrderOpenPrice = 1.8824 15:14:16 2005.04.11 02:01 XXX GBPUSD,M1: tick----------------------------------------------------------------- 15:14:16 2005.04.11 02:01 XXX GBPUSD,M1: cnt = 0 15:14:16 2005.04.11 02:01 XXX GBPUSD,M1: OrderTicket = 1 15:14:16 2005.04.11 02:01 XXX GBPUSD,M1: OrderOpenPrice = 1.8824 15:14:16 2005.04.11 02:01 XXX GBPUSD,M1: cnt = 1 15:14:16 2005.04.11 02:01 XXX GBPUSD,M1: OrderTicket = 2 15:14:16 2005.04.11 02:01 XXX GBPUSD,M1: OrderOpenPrice = 1.8825 ......................................................
Я упростил пример до такого состояния:
int start() { Print("tick-----------------------------------------------------------------"); if (OrdersTotal() < 1) { OrderSend (Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "xxx", 0, 0, Blue); OrderSend (Symbol(), OP_SELL, 0.1, Bid, 3, 0, 0, "xxx", 0, 0, Blue); return(0); } if (OrdersTotal() > 0) { for (int cnt = 0; cnt < OrdersTotal(); cnt++) if (OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES)) Print(cnt, " #",OrderTicket()); } return(0); }
И получил результаты:
EURUSD,H1: tick----------------------------------------------------------------- EURUSD,H1: open #1 sell 0.10 EURUSD at 0.9925 ok EURUSD,H1: open #2 sell 0.10 EURUSD at 0.9925 ok EURUSD,H1: tick----------------------------------------------------------------- EURUSD,H1: 0 #2 EURUSD,H1: 1 #1 EURUSD,H1: tick----------------------------------------------------------------- EURUSD,H1: 0 #1 EURUSD,H1: 1 #2
В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.
Большое спасибо за найденную аномалию - обязательно исправим.
В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.
Большое спасибо за найденную аномалию - обязательно исправим.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.
Большое спасибо за найденную аномалию - обязательно исправим.
Спасибо Ренат.
Это будет следующий билд?
В тестере при выборках ордеров они меняются местами.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.
Большое спасибо за найденную аномалию - обязательно исправим.
Видимо, на это влияет механизм автоматической пересортировки сделок в базе.
Большое спасибо за найденную аномалию - обязательно исправим.
Спасибо Ренат.
Это будет следующий билд?
Как минимум, в понедельник выложим текущий билд.
понедельник 21.11.05 ? :)
понедельник 21.11.05 ? :)
Чуток опоздали с понедельником - сегодня-завтра будет выложен обновленный 186 билд в виде дистрибутива.

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Код эксперта (build 186)
В логе такая инфа
Получается, что на каждый тик код выдает разные параметры ордеров, т.е. в цикле функция выбирает оба ордера, а возвращает значения одного, потом другого и так до беск. Вместо OrderTicket() с таким же успехом можно вставить остальные параметры. Что здесь не так? Хелп плз!!!