Мне кажется, скобочки криво стоят.
for (i=0; i<OrdersTotal(); i++){ if (OrderSelect(i , SELECT_BY_POS, MODE_HISTORY)) { if (OrderComment()=="+Order_2"){ int Profit2=OrderProfit(); Print ("Profit +Order_2 = ",Profit2); } } }
Замени
if (OrderComment()=="+Order_2")
на
if (StringFind(OrderComment(),"+Order_2")!=-1)
А был ли мальчик (ордер)? Ставьте подряд принты на все: OrdersTotal, OrderComment на каждом проходе.
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
На тестере после изменения все ок.
Про это написано в справочнике:
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
На тестере после изменения все ок.
//Print("OrderComment()", OrderComment()); for (i=0; i<OrdersTotal(); i++){ if (OrderSelect(i , SELECT_BY_POS, MODE_HISTORY)) { if (OrderComment()=="+Order_2[tp]"); int Profit2=OrderProfit(); Print ("Profit +Order_2 = ",Profit2); } } //Print("error", GetLastError()); }С комментариями сложно, их может менять торговый сервер.
Про это написано в справочнике:
comment - Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером
Куда проще и надежнее запомнить номер тикета, и искать по нему.
ToLik_SRGV >>:
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
На тестере после изменения все ок.
С комментариями сложно, их может менять торговый сервер, про это написано и в справочнике:
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
На тестере после изменения все ок.
С комментариями сложно, их может менять торговый сервер, про это написано и в справочнике:
Все в жизни просто, надо только приспособиться. :))
//if (OrderComment()=="+Order_2[tp]") //старая строка if(StringFind(OrderComment(),"+Order_2",0)>-1) //новая строка //проверяет наличие в OrderComment() искомой подстроки "+Order_2"
ToLik_SRGV >>:
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
На тестере после изменения все ок.
С комментариями сложно, их может менять торговый сервер.
Про это написано в справочнике:
Прогнал на тестере и вот что получилось, при срабатывании профита тестер автоматичести добавляет к комментарию "[tp]",
поэтому надо искать "+Order_2[tp]", вместо "+Order_2".
На тестере после изменения все ок.
С комментариями сложно, их может менять торговый сервер.
Про это написано в справочнике:
comment - Текст комментария ордера. Последняя
часть комментария может быть изменена торговым сервером
Куда проще и надежнее запомнить номер тикета, и искать по нему.
Тикет (он же номер ордера) возвращает функция OrderSend(), а ей соответственно торговый сервер, в виде числа типа int, или -1 в случае неудачи.
Его можно сохранить в static переменную (static для того чтобы значение переменной сохранилось при следующем вызове функции start())
Если ордер был открыт, был получен тикет, то функция OrderSelect() найдет его в любом случае, где угодно (при условии корректного номера тикета).
Для того чтобы понять ордер открыт или уже закрыт, нужно проанализировать время его закрытия.
Для этого и была вызвана функция OrderCloseTime(). Открытые или отложенные ордера имеют время закрытия, равное 0 (просто потому, что они еще не успели закрыться),
нас же интересуют закрытые ордера, поэтому время их закрытия не будет равно 0.
Его можно сохранить в static переменную (static для того чтобы значение переменной сохранилось при следующем вызове функции start())
if(/*условие откр. ордера*/){ static int ticket = OrderSend(Symbol(), OP_BUY, Lot,....); //сохранение номера ордера if(ticket == -1)Print(">>>> Ошибка № ", GetLastError()); //проверка на ошибки }Номер тикета сохранен, теперь можно выбирать по нему ордер допустим так (из предыдущего примера)
if(OrderSelect(ticket, SELECT_BY_TICKET)){ if(OrderCloseTime() != 0){ Print("Profit Orders # ",ticket," = ", OrderProfit()); } }Заметь разницу в параметрах функции OrderSelect(), не нужно писать где искать (MODE_HISTORY то есть в истории).
Если ордер был открыт, был получен тикет, то функция OrderSelect() найдет его в любом случае, где угодно (при условии корректного номера тикета).
Для того чтобы понять ордер открыт или уже закрыт, нужно проанализировать время его закрытия.
Для этого и была вызвана функция OrderCloseTime(). Открытые или отложенные ордера имеют время закрытия, равное 0 (просто потому, что они еще не успели закрыться),
нас же интересуют закрытые ордера, поэтому время их закрытия не будет равно 0.
ИМХО, работа с тикетами более сложный процесс, чем простой поиск ордеров перебором. По-хорошему, надо будет создавать систему учета ордеров по тикетам, хранить и обновлять базу, сложная и кропотливая работа. Для рутинных задач это просто нецелесообразно.
ToLik_SRGV >>:
Тикет (он же номер ордера) возвращает функция OrderSend(), а ей соответственно торговый сервер, в виде числа типа int, или -1 в случае неудачи.
Его можно сохранить в static переменную (static для того чтобы значение переменной сохранилось при следующем вызове функции start())
Номер тикета сохранен, теперь можно выбирать по нему ордер допустим так (из предыдущего примера)
Заметь разницу в параметрах функции OrderSelect(), не нужно писать где искать (MODE_HISTORY то есть в истории).
Если ордер был открыт, был получен тикет, то функция OrderSelect() найдет его в любом случае, где угодно (при условии корректного номера тикета).
Для того чтобы понять ордер открыт или уже закрыт, нужно проанализировать время его закрытия.
Для этого и была вызвана функция OrderCloseTime(). Открытые или отложенные ордера имеют время закрытия, равное 0 (просто потому, что они еще не успели закрыться),
нас же интересуют закрытые ордера, поэтому время их закрытия не будет равно 0.
Тикет (он же номер ордера) возвращает функция OrderSend(), а ей соответственно торговый сервер, в виде числа типа int, или -1 в случае неудачи.
Его можно сохранить в static переменную (static для того чтобы значение переменной сохранилось при следующем вызове функции start())
Номер тикета сохранен, теперь можно выбирать по нему ордер допустим так (из предыдущего примера)
Заметь разницу в параметрах функции OrderSelect(), не нужно писать где искать (MODE_HISTORY то есть в истории).
Если ордер был открыт, был получен тикет, то функция OrderSelect() найдет его в любом случае, где угодно (при условии корректного номера тикета).
Для того чтобы понять ордер открыт или уже закрыт, нужно проанализировать время его закрытия.
Для этого и была вызвана функция OrderCloseTime(). Открытые или отложенные ордера имеют время закрытия, равное 0 (просто потому, что они еще не успели закрыться),
нас же интересуют закрытые ордера, поэтому время их закрытия не будет равно 0.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
чтобы найти профит ордера "+Order_2", но выдает вот такое :
хотя в истории он есть :
почему функция его ненаходит?!