RefreshRates() в тестере

 

Здравствуйте!

Столкнулся со следующей проблемой.

После выполнения некоторых условий алгоритма, советник должен выставить отложенный ордер БайСтоп (если позволяет расстояние до цены установки) или войти по рынку на Бай (если рассчётная цена установки достигнута/превышена).

Для этого использую конструкцию:

while(true)
{
   RefreshRates();
                  
   if((pr-Ask)>StopLevel*Point) 
   {
      if(SetOrder(Symbol(), OP_BUYSTOP, lot, pr, sl, tp, com, exp)==true) break;
   }
                  
   if(Ask>=pr)
   {
      if(SetOrder(Symbol(), OP_BUY, lot, Ask, sl, tp, com, exp)==true) break;
   }
}

pr - расчетная цена.

while(true) использую потому, что на следующем тике условие для выставления/открытия ордера может уже не выполняться, но ордер должен быть выставлен/открыт обязательно.

В тестере всё идёт хорошо до тех пор, пока в результате гэпа цена Ask не оказывается между pr и (pr-StopLevel), т.е. слишком близко для быставления БайСтоп, но слишком далеко для открытия Бай.

В этом месте советник зависает, т.к. RefreshRates() в тестере не работает.

Что в данном случае можно сделать, чтобы в тестере получить новую Ask не выходя из цикла?

Заранее благодарю за ответ.

 
Analitik >>:

Здравствуйте!

Заранее благодарю за ответ.

Sleep попробуй добавить.

 
TheXpert писал(а) >>

Sleep попробуй добавить.

Добавил сразу же. Sleep так же не работает.

 

Дело не в том, что в тестере советник не получает новый Ask, а в том, что тестирование останавливается до завершения выполнения функции start(), прежде чем дать новый тик тестер ждет полного завершения выполнения функции start().

 
Integer писал(а) >>

Дело не в том, что в тестере советник не получает новый Ask, а в том, что тестирование останавливается до завершения выполнения функции start(), прежде чем дать новый тик тестер ждет полного завершения выполнения функции start().

Я это понимаю. Т.е. ни какого варианта получить новый Ask в цикле нет?

 
Analitik >>:

Я это понимаю. Т.е. ни какого варианта получить новый Ask в цикле нет?

Получается так, тогда остается генерировать сигнал и ставить до тех пор, пока сигнал остается.

При этом цикл будет замыкаться терминалом.


Но вообще ставить стоп ордера в цикле это плохо.

 
TheXpert писал(а) >>

Получается так, тогда остается генерировать сигнал и ставить до тех пор, пока сигнал остается.

При этом цикл будет замыкаться терминалом.

Но вообще ставить стоп ордера в цикле это плохо.

Не совсем понял, что нужно сделать...

 
Analitik >>:

Не совсем понял, что нужно сделать...

Что-то типа такого:

// генерация сигнала

if (надо выставлять бай)
{
   GlobalVariableSet("BuySignal", 1);
}

if (надо выставлять селл)
{
   GlobalVariableSet("SellSignal", 1);
}

//...

double buySignal = GlobalVariableGet("BuySignal");

if(buySignal == 1)
{
   RefreshRates();
                  
   if((pr-Ask)>StopLevel*Point) 
   {
      if(SetOrder(Symbol(), OP_BUYSTOP, lot, pr, sl, tp, com, exp)==true) GlobalVariableSet("BuySignal", 0);
   }
                  
   if(Ask>=pr)
   {
      if(SetOrder(Symbol(), OP_BUY, lot, Ask, sl, tp, com, exp)==true) GlobalVariableSet("BuySignal", 0);
   }
}
 
TheXpert писал(а) >>

Что-то типа такого:

Спасибо. Я думал над подобным вариантом. Если ни чего другого не останется, то придётся сделать именно так.

Уважаемые разработчики, можно узнать Ваше мнение?

 
Analitik >>:

Спасибо. Я думал над подобным вариантом. Если ни чего другого не останется, то придётся сделать именно так.

Уважаемые разработчики, можно узнать Ваше мнение?

Тьфу, конечно же не через GlobalVariable это меня не в ту степь понесло. В Вашем случае сигналы нужно хранить в глобальных переменных самого эксперта.

 
Да конечно, но сути это не меняет.