Всем привет!
возник вопрос,как прописать в коде открытие ордеров на открытии свечи,того таймфрейма,в окне которого стоит советник(и чтобы его можно было в тестере погонять),набросал кусок кода ниже в общем виде и нужно ли перед OrderSend(...) вставлять RefreshRates();
if (условие открытия ордера селл...)
(
RefreshRates();
OrderSend(Symbol(),OP_SELL,Lot,......)
}
if (условие открытия ордера бай...)
{
RefreshRates();
OrderSend(Symbol(),OP_BUY,Lot,.........)
}
Во многих кодах, что в свободном доступе, в которых выполняется установка по новому бару, выполнена именно так, как предложил
star603. А как быть, если в советнике есть тралл или перевод в бу? Эти функции, так же, будут выполняться раз на бар? Ок, пусть их нет и рано или поздно, Вы поставите свой код на демку/реал. В тестере идеальное исполнение, а в реале - нет. Как быть, если на новом баре позиция по какой-то причине не установилась? Ждать следующего бара..? Поэтому, делать проверку в начале ф-ции
OnTick() не целесообразно. Необходимо её выполнять там, где она необходима. Если получили сигнал на установку - только тут осуществляем её. Саму установку позиций лучше всего выполнить в отдельной ф-ции, в которой будет предусмотрены необходимые проверки и которая будет возвращать результат. Если он, результат, отрицательный, позиция не установилась - "новый бар" не засчитываем, что даст нам возможность на следующем тике повторить попытку установки позиции. Примерно, это будет вот так:
datetime TimeBar = 0;
//---
if(сигнал && TimeBar<Time[0])
{
if(ф-ция уст поз(сигнал))
{
TimeBar = Time[0];
}
}
Отсюда и ответ на Ваш вопрос о
RefreshRates() - если за первой попыткой не удалось установить позиции - рефрешить обязательно.