этот кусок кода я писал год назад по справке(значит там были такие рекомендации), и все работало и работает на терминалах которые еще не успели обновиться
Pavel Kolchin: этот кусок кода я писал год назад по справке(значит там были такие рекомендации), и все работало и работает на терминалах которые еще не успели обновиться
1) вы сделали заявление, прямо противоречащее документации и здравому смыслу
2) вы не показали кода
3) ошибка в другом месте возможно
Дело в том, что при обсуждении технических тем нельзя пользоваться словесными и сравнительными методами. Тем более, когда делаете публичные заявления.
Вот ваш код, оформленный и правильно переписанный:
voidOnStart(void)
{
string com="";
int t_pt=PositionsTotal();
//--- пройдемся по всем позициямfor(int i=0;i<t_pt;i++)
{
//--- выберем очередную открытую позицию по индексуif(!PositionGetTicket(i))
continue;
//--- отфильтруем историю по идентификатору позицийif(!HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)))
continue;
//--- пройдемся по новому отфильтрованному списку сделок int t_hdt=HistoryDealsTotal();
for(int j=0;j<t_hdt;j++)
{
ulong ticket=HistoryDealGetTicket(j);
//--- если смогли получить тикет по индексуif(ticket)
{
com+="j="+j+"\n";
com+="HistoryDealGetInteger(j,DEAL_TICKET)="+HistoryDealGetInteger(ticket,DEAL_TICKET)+"\n";
com+="HistoryDealGetInteger(j,DEAL_TIME)="+HistoryDealGetInteger(ticket,DEAL_TIME)+"\n";
com+="HistoryDealGetString(j,DEAL_SYMBOL)="+HistoryDealGetString(ticket,DEAL_SYMBOL)+"\n";
com+="HistoryDealGetInteger(j,DEAL_TYPE)="+HistoryDealGetInteger(ticket,DEAL_TYPE)+"\n";
com+="HistoryDealGetDouble(j,DEAL_VOLUME)="+HistoryDealGetDouble(ticket,DEAL_VOLUME)+"\n";
com+="HistoryDealGetDouble(j,DEAL_PRICE)="+HistoryDealGetDouble(ticket,DEAL_PRICE)+"\n";
}
}
}
Comment(com);
//---
}
У вас на самом деле была ошибка в передаче индекса j вместо номера тикета в функциях HistoryDealGetXXXX.
Но она нивелировалась нашей ошибкой, когда мы при неудаче поиска по переданному неверному индексу не сбрасывали кеш выбранной сделки и выдавали значения этой сделки. А сделка была выбрана на предыдущем шаге HistoryDealGetTicket - поэтому вы раньше получали верные значения даже при неудачном поиске.
В 1730 билде мы нашли и исправили эту ошибку(теперь сбрасываем кеш при неудаче поиска), в результате чего проявилась ваша ошибка обращения по неверному тикету.
я понимаю что сейчас правильно так, но остается два вопроса
о какой дальнейшей обработке идет речь?
Посмотрите статью Ордерa, позиции и сделки в MetaTrader 5 - для того чтобы работать со свойствами ордера/позиции/сделки, необходимы их предварительно выбрать. То есть получить эти данные в кеш для последующего считывания (обработки)
этот кусок кода я писал год назад по справке(значит там были такие рекомендации), и все работало и работает на терминалах которые еще не успели обновиться
1) вы сделали заявление, прямо противоречащее документации и здравому смыслу
2) вы не показали кода
3) ошибка в другом месте возможно
Дело в том, что при обсуждении технических тем нельзя пользоваться словесными и сравнительными методами. Тем более, когда делаете публичные заявления.
было (и работало)
теперь чтобы работало сделал так
было (и работало)
теперь чтобы работало сделал так
Во первых, код написан в режиме самострела. Так писать категорически нельзя - в нем ошибок наделано наверняка немало.
Во вторых, вы утверждаете, что раньше вот такой код работал?
Вы же передаете индекс j вместо тикета. Он и не должен был работать.
Только в тестере иногда получалось, да и то не на всех операциях. Просто там индексы от нуля могли попадать на номера тикетов, начинающиеся с единицы.
Мое мнение - безусловно ошибки в вашем коде и работа в тестере без проверок на демо/реальных счетах.
Вы же передаете индекс j вместо тикета. Он и не должен был работать.
но работал, вот у меня еще не все терминалы обновились)
кстати зачем нужно было узнавать номер тикета если мы "всегда" сюда передавали номер тикета?
Я проверю.
Вот ваш код, оформленный и правильно переписанный:
У вас на самом деле была ошибка в передаче индекса j вместо номера тикета в функциях HistoryDealGetXXXX.
Но она нивелировалась нашей ошибкой, когда мы при неудаче поиска по переданному неверному индексу не сбрасывали кеш выбранной сделки и выдавали значения этой сделки. А сделка была выбрана на предыдущем шаге HistoryDealGetTicket - поэтому вы раньше получали верные значения даже при неудачном поиске.
В 1730 билде мы нашли и исправили эту ошибку(теперь сбрасываем кеш при неудаче поиска), в результате чего проявилась ваша ошибка обращения по неверному тикету.
я понимаю что сейчас правильно так, но остается два вопроса
о какой дальнейшей обработке идет речь?
зачем предусмотрено свойство DEAL_TICKET, если для вызова функции HistoryDealGetInteger() обязательно необходимо знать тикет сделки?
я понимаю что сейчас правильно так, но остается два вопроса
о какой дальнейшей обработке идет речь?
зачем предусмотрено свойство DEAL_TICKET, если для вызова функции HistoryDealGetInteger() обязательно необходимо знать тикет сделки?
Эти свойства были добавлены позже для единообразия. Так как являются такими же атрибутами торговой сущности как и остальные свойства.
Получилось немного "масло масляное".