Я использовал Open вместо Time, потому что как только происходит открытие бара, оно фиксируется навсегда и никогда не изменится. Он не ищет два последовательных бара - это один и тот же бар и спрашивает, совпадает ли открытие текущего бара, на котором только что произошел тик, со значением Open, хранящимся в ThisBarOpen. Кроме того, я бы подумал, что Open будет более простым, чем Time, потому что это простой поиск данных, в то время как Time, возможно, придется ссылаться на что-то еще и, возможно, выполнять какие-то вычисления.
Re Counter--; я не изменил это, потому что другой советник не смог бы закрыть ордер, так как код сначала проверяет, что MagicNumber и Symbol() одинаковы.
Я, конечно, понимаю, что отключение электричества может стереть содержимое BuyTicket, но этого не произошло во время моих тестов, и мой код все еще работает очень медленно. Поэтому я не могу понять, как это может быть причиной.
Мой главный вопрос на данный момент - почему потребовалось так много времени, чтобы удалить советников из окон терминала, в которых были открытые позиции, и совсем немного времени, чтобы удалить их из терминала, в котором не было открытых позиций. Возможно, совпадение - но все четыре окна?
В прошлый раз у меня была такая же проблема, и на самом деле все дело в том, как вы кодируете ea. Возможно, пришло время написать вашу программу с нуля. Например, v2.
Я не знаю, что это действительно относится к вашему вопросу, но вы ограничиваете свою торговлю 1 покупкой, 1 продажей на советника, так зачем все это делать?
if(SellTicket!=0)
{if(SmallMA>MediumMA)
{for(Counter=0;Counter<=OrdersTotal()-1;Counter++)
{SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
{Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
if(Closed) SellTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");
}
Counter--;
}}}}
Re Counter--; Я не изменил это, потому что другой советник не смог бы закрыть ордер, потому что код сначала проверяет, что MagicNumber и Symbol() одинаковы.
Мой главный вопрос на данный момент - почему потребовалось так много времени, чтобы удалить советников из окон на терминале, где были открытые позиции, и совсем немного времени, чтобы удалить их из терминала, где не было открытых позиций. Совпадение возможно - но все четыре окна?
Вы понимаете, как работают циклы?
if(BuyTicket!=0)
{
if(SmallMA<MediumMA)
{
for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
{
SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
{
// while(IsTradeContextBusy()) Sleep(10);
Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
if(Closed) BuyTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");
}
Counter--;
}
}
}
Допустим, у вас открыто 3 ордера.
При первом проходе счетчик==0, поэтому будет выбран ордер с индексом 0.
В конце цикла вы уменьшаете счетчик на 1, так что counter== -1.
Перед повторным выполнением цикла счетчик увеличивается на 1 в рамках функции for. Таким образом, счетчик ==0
При следующем выполнении цикла счетчик снова = 0!!! и так далее, и так далее.
Вы застряли в бесконечном цикле, который просто продолжает проверять индекс порядка 0.
Единственный способ, которым он остановится, это если нет открытых ордеров, потому что тогда OrdersTotal - 1 будет -1, а 0 не <= -1.
Большое спасибо GumRaj - вы решили мою проблему!!! Теперь все работает нормально. Это первый раз, когда я пишу код на MQL4, так что это процесс обучения для меня. Я запутался в том, как работает цикл for.
Sneck55: GumRaj - вы решили мою проблему!!! Теперь все работает нормально.
А как вы ее решили? Если у вас нет обратного отсчета, у вас все еще есть проблема (#3) - просто скрытая, пока у вас нет нескольких ордеров или нескольких советников.
Он должен уменьшаться, если закрывает ордер, чтобы соответствовать тому, что происходит в пуле, но не уменьшаться, если ордер не закрыт. Если он уменьшается без закрытия ордера, то он попадает в бесконечный цикл.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
У вас все еще есть Контр...
См. комментарий GumRai https://www.mql5.com/en/forum/151167/page2#954622
Спасибо за ваши сообщения.
Я использовал Open вместо Time, потому что как только происходит открытие бара, оно фиксируется навсегда и никогда не изменится. Он не ищет два последовательных бара - это один и тот же бар и спрашивает, совпадает ли открытие текущего бара, на котором только что произошел тик, со значением Open, хранящимся в ThisBarOpen. Кроме того, я бы подумал, что Open будет более простым, чем Time, потому что это простой поиск данных, в то время как Time, возможно, придется ссылаться на что-то еще и, возможно, выполнять какие-то вычисления.
Re Counter--; я не изменил это, потому что другой советник не смог бы закрыть ордер, так как код сначала проверяет, что MagicNumber и Symbol() одинаковы.
Я, конечно, понимаю, что отключение электричества может стереть содержимое BuyTicket, но этого не произошло во время моих тестов, и мой код все еще работает очень медленно. Поэтому я не могу понять, как это может быть причиной.
Мой главный вопрос на данный момент - почему потребовалось так много времени, чтобы удалить советников из окон терминала, в которых были открытые позиции, и совсем немного времени, чтобы удалить их из терминала, в котором не было открытых позиций. Возможно, совпадение - но все четыре окна?
Я не знаю, что это действительно относится к вашему вопросу, но вы ограничиваете свою торговлю 1 покупкой, 1 продажей на советника, так зачем все это делать?
У вас уже есть номер вашего тикета:
если вы сделаете его статическим int, вы сможете закрыть свой ордер явно по этому номеру тикета, не копаясь в пуле ордеров в поисках его.
Спасибо за ваши сообщения.
Re Counter--; Я не изменил это, потому что другой советник не смог бы закрыть ордер, потому что код сначала проверяет, что MagicNumber и Symbol() одинаковы.
Мой главный вопрос на данный момент - почему потребовалось так много времени, чтобы удалить советников из окон на терминале, где были открытые позиции, и совсем немного времени, чтобы удалить их из терминала, где не было открытых позиций. Совпадение возможно - но все четыре окна?
Вы понимаете, как работают циклы?
Допустим, у вас открыто 3 ордера.
При первом проходе счетчик==0, поэтому будет выбран ордер с индексом 0.
В конце цикла вы уменьшаете счетчик на 1, так что counter== -1.
Перед повторным выполнением цикла счетчик увеличивается на 1 в рамках функции for. Таким образом, счетчик ==0
При следующем выполнении цикла счетчик снова = 0!!! и так далее, и так далее.
Вы застряли в бесконечном цикле, который просто продолжает проверять индекс порядка 0.
Единственный способ, которым он остановится, это если нет открытых ордеров, потому что тогда OrdersTotal - 1 будет -1, а 0 не <= -1.