[АРХИВ!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 4. - страница 547

 
Vinin:
Только не забывайте что в init() не всегда доступно рыночное окружение
Честно говоря меня очень заинтриговало это известие. Попробовал представить при каких условиях может быть не доступно рын. окружение: может типа обрыв связи в момент включения советника, или если в субботу или воскресенье запустил советник. Я за своими не заметил такого типа проблем. С одной стороны говорят, что в init() можно зациклить нахождение значения, но узнаю что init() ограничен по времени. Может в начале start() при появлении нового бара (хотя бы М1) находить значения из рын. окружения, это и так лучше чем на каждом тике.
 
Pacman:


Я очень благодарен Вам за анализ моего кода. Спасибо что выделили для этого время.

...

А оператор while работает когда его значение равно true, т.е. получается что значение false он не принимает.

В while надо бы поставиь условие, которое как мин. может принимать два значения, напр. флаг (true или false). Если же стоит константа (true), а не условие тогда while не нужен. Уберите while (true) и скобки к нему и будет тот же результат.
 
Вопрос к знатокам. В справке про OrderSend() на месте slippage стоит 3. Это для примера на 4-знаковых котировках? Для 5-знаковых можно оставить 3 или надо 30?
 
paladin80:
Вопрос к знатокам. В справке про OrderSend() на месте slippage стоит 3. Это для примера на 4-знаковых котировках? Для 5-знаковых можно оставить 3 или надо 30?

Для пятизнаковых надо 30.

Я вставляю такую конструкцию в init() каждого советника, тогда без разницы на 4-х или 5-ти знаках ДЦ, рекомендую:

  if (Digits==3 || Digits==5){myPoint=Point*10; slpg=slpg*10;}
  else myPoint=Point; 
 
кто знает можно ли увеличить скорость тестирования?
 

 Добрый день. Подскажите - стоит задачи рисовать вертикальные линии каждую минуту. Как привязать отрисовку не просто к минутам, а к ЦЕНЕ ОТКРЫТИЯ минутки. Сложность в том, что цену открытия минутки нужно идентифицировать на нестандатном тайме, т.е. не минутном. Написал такой кусок кода, но как ввести туда цену открытия минутки, если индюк будет висеть на нестандартном тайме не понимаю

  new_Minute=TimeMinute(Time[i]) != TimeMinute(Time[i+1]); // новая минута

   Ind_Buffer_0[i]=0

   if(new_Minute && Period()<30 )              Ind_Buffer_0[i]=max;

 ...и дальше уже стандартная отрисовка через объекты. 

 Может кто подскажет, что можно сделать, если можно вообще. 

 
Lonely_man:

 Добрый день. Подскажите - стоит задачи рисовать вертикальные линии каждую минуту. Как привязать отрисовку не просто к минутам, а к ЦЕНЕ ОТКРЫТИЯ минутки. Сложность в том, что цену открытия минутки нужно идентифицировать на нестандатном тайме, т.е. не минутном. Написал такой кусок кода, но как ввести туда цену открытия минутки, если индюк будет висеть на нестандартном тайме не понимаю

  new_Minute=TimeMinute(Time[i]) != TimeMinute(Time[i+1]); // новая минута

   Ind_Buffer_0[i]=0

   if(new_Minute && Period()<30 )              Ind_Buffer_0[i]=max;

 ...и дальше уже стандартная отрисовка через объекты. 

 Может кто подскажет, что можно сделать, если можно вообще. 

У вертикальной линии нет координаты - цена.
 
paladin80:
В while надо бы поставиь условие, которое как мин. может принимать два значения, напр. флаг (true или false). Если же стоит константа (true), а не условие тогда while не нужен. Уберите while (true) и скобки к нему и будет тот же результат.


Если убрать оператор while то как будет отрабатывать оператор continue; 

Ведь нам необходимо в случае ошибки повторить проверку условий и открытие ордеров.

 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
 continue;                              // Повторная попытка
 return;                                // Выход из start()

Оператор continue передает управление в начало ближайшего внешнего оператора цикла while или for, вызывая начало следующей итерации. 

Может я что-то не понимаю? 

 

Добрый день.

У меня торговая стратегия сформирована на открытие отложенных ордеров по уже сформированному предпоследнему бару [номер 1]. Т.е. он открывает позиции (отложенные ордера на buystop И sellstop), и они сработают, если цена вышла за границы максимума/минимума ценового диапазона 1-го бара на 20 пунктов (Цены открытия).

При этом в ней также прописано автоматическое удаление не сработавших отложенных ордеров, основанное на следующем: Если сформировался новый бар под номером 1, то соответственно цена открытия отложенного ордера/ордеров не совпадет с максимумом/минимумом нового текущего бара номер 1 +/- 20 пунктов (вероятнее всего, так как редко идут совпадения максимумов/минимумов двух рядом стоящих баров) .

Но вот почему-то бывает так, что он сначала откроет обе позиции, но через несколько секунд закроет одну из них (хотя новый бар под номером 1 еще не сформировался).

Господа эксперты, я новичок и, возможно, не учитываю какие-то нюансы. Подскажите пожалуйста где возможна ошибка.

 RefreshRates();
for(int n=1;n<=OrdersTotal();n++)            //цикл перебора всех имеющихся ордеров
{
  if(OrderSelect(n-1,SELECT_BY_POS)==true)   //если найден ордер, то...
  {
    if((OrderType()==4)&& (OrderOpenPrice()!= High[1]+20*Point))                      // проверяем его тип (buystop/sellstop), если его тип buystop и цена покупки не совпадает с максимумом текущего 1-го бара, то..
      {
          OrderDelete(OrderTicket());                                                  // удаляем его
         
       }
    if((OrderType()==5) && (OrderOpenPrice()!= Low[1]-20*Point))                       // если его тип sellstop и цена продажи не совпадает с минимумом текущего 1-го бара, то ...
    {      
           
            OrderDelete(OrderTicket());                                                //удаляем его
         
    }
  }
}



 
Файлы:
 

Когда сравниваете дробные числа, их надо нормализовать до значащей цифры.

Когда удаляете ордера, отсчет надо вести с конца, а не с начала. 

Причина обращения: