нужна помощь в написании кода советника

 

Всем привет!

Алгоритм кода следующий: советник ищет самый волотильный бар за определенный период (пусть будет 60 минут), и спустя 10 баров (в данном случае 10 минут) выставляет ордера на пробой цены High найденного бара вверх или на пробой цены Low вниз, если текущая цена соответственно ниже или выше найденного High или Low. Вроде бы рабочий код представлен ниже:

extern int Quant_Bars=60;

int start()
{
//----
int i,ret=0;
double Max_volume=0; // максимальный обьем
double Price_O; //цена открытия
double Price_H; //макс
double Price_L; //мин
for(i=9;i<Quant_Bars;i++) { // цикл перебора баров
if(Volume[i]>Max_volume) // если больше предыдущего
{
Max_volume=Volume[i]; //значит оно и есть
Price_O=Open[i];
Price_H=High[i];
Price_L=Low[i];
}}
if (Price_H>Ask+10*Point && OrdersTotal()==0)
{
ret=OrderSend(Symbol(),OP_BUYSTOP,0.01,Price_H,3,Price_H-100*Point,Price_H+200*Point,0,0,0,CLR_NONE);
if (ret>1) Alert (GetLastError()); // Сообщение об ошибке
return;
}
if (Price_L<Bid-10*Point && OrdersTotal()==0) // Цикл перебора ордер
{
ret=OrderSend(Symbol(),OP_SELLSTOP,0.01,Price_L,3,Price_L+100*Point,Price_L-200*Point,0,0,0,CLR_NONE);
if (ret>1) Alert (GetLastError());
return;
}
return;
}

теперь мне нужно удалять отложенные ордера, которые не стали рыночными в случае, если изменился самый волотильный бар (и соответственно цены High или Low). Я себе это представляю как то так...

int Limit_Stop=-1;

for(int j=1; j<=OrdersTotal(); j++) // Цикл перебора ордер
{
if (OrderSelect(j-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
if (OrderSymbol()!= Symb) continue;
int Tip=OrderType();
if (Tip<2) continue;
Limit_Stop=Tip;
int Ticket=OrderTicket();
}}
while(true)
{ if (Limit_Stop==-1 && Price_H!=Price_H && && Price_L!=Price_L)
{
OrderDelete(Ticket);
}}

но видимо мои представления ошибочны) Помогите подкорректировать, кто знает, плиз?!

 

&& Price_H!=Price_H && && Price_L!=Price_L) Вот это явно бред.....

Алгоритмически лучше так:

Храним в переменной время открытия текущего волатильного бара, если оно меняется, удаляем все отложки и выставляем новые. Нужны еще проверки на соответствие стоплевелам.

 

У меня идет привязка не ко времени, а к ценам, думаю тут не принципиально к чему привязывать...главное при изменении условий удалить ордер старый и установить новый...что у меня и не получаеться((

 
zhuchek писал(а) >>

У меня идет привязка не ко времени, а к ценам, думаю тут не принципиально к чему привязывать...главное при изменении условий удалить ордер старый и установить новый...что у меня и не получаеться((

Насколько я понял, у Вас идет привязка к конкретному бару, и его экстремумам, но номер бара может поменяться, а время его открытия - нет.

int PrevVBarTime=0;

int Start()

{

Ищем волатильный бар, его время открытия пусть будет Time[i]

if (Time[i]==PrevVBarTime) return; // если бар не изменился - делать нам нефиг

PrevVBarTime=Time[i];

Перебираем и удаляем все отложки данного эксперта (без всяких Price_H!=Price_H && && Price_L!=Price_L);

Выставляем новые отложки с руководствуясь High[i] и Low[i];

}

Ну или я чего-то не допонял.

 
Figar0 писал(а) >>

Насколько я понял, у Вас идет привязка к конкретному бару, и его экстремумам, но номер бара может поменяться, а время его открытия - нет.

int PrevVBarTime=0;

int Start()

{

Ищем волатильный бар, его время открытия пусть будет Time[i]

if (Time[i]==PrevVBarTime) return; // если бар не изменился - делать нам нефиг

PrevVBarTime=Time[i];

Перебираем и удаляем все отложки данного эксперта (без всяких Price_H!=Price_H && && Price_L!=Price_L);

Выставляем новые отложки с руководствуясь High[i] и Low[i];

}

Ну или я чего-то не допонял.

Пытаюсь все это склеить и реализовать, вот что получаеться....в результате исполнения выставляеться ордер, но...на следующем тике он удаляеться. Если Вам не тяжело, обратите мое внимание на ошибки. Спасибо.

extern int Quant_Bars=60;

int start()
{
//----
int i,ret=0; 
int PrevVBarTime=0;
string Symb=Symbol();
double Max_volume=0; // максимальный обьем 
double Price_O; //цена открытия
double Price_H; //макс
double Price_L; //мин
for(i=9;i<Quant_Bars;i++) { // цикл перебора баров
if(Volume[i]>Max_volume) // если больше предыдущего
{
Max_volume=Volume[i]; //значит оно и есть
Price_O=Open[i]; 
Price_H=High[i];
Price_L=Low[i];
PrevVBarTime=Time[i];
}}
if (Price_H>Ask+10*Point && OrdersTotal()==0)
{
ret=OrderSend(Symbol(),OP_BUYSTOP,0.01,Price_H,3,Price_H-100*Point,Price_H+200*Point,0,0,0,CLR_NONE);
if (ret>1) Alert (GetLastError()); // Сообщение об ошибке
return;
}
if (Price_L<Bid-10*Point && OrdersTotal()==0) // Цикл перебора ордер
{
ret=OrderSend(Symbol(),OP_SELLSTOP,0.01,Price_L,3,Price_L+100*Point,Price_L-200*Point,0,0,0,CLR_NONE);
if (ret>1) Alert (GetLastError());
return;
}


if (Time[i]==PrevVBarTime) return; // если бар не изменился - делать нам нефиг

PrevVBarTime=Time[i];

int Limit_Stop=-1;

for(int j=1; j<=OrdersTotal(); j++) // Цикл перебора ордер
{ 
if (OrderSelect(j-1,SELECT_BY_POS)==true) // Если есть следующий 
{ // Анализ ордеров: 
if (OrderSymbol()!= Symb) continue;
int Tip=OrderType(); 
if (Tip<2&&PrevVBarTime!=Time[i]) continue;
Limit_Stop=Tip;
int Ticket=OrderTicket(); 
}}
OrderDelete(Ticket); 
}
 

if (Time[i]==PrevVBarTime) return; // если бар не изменился - делать нам нефиг

PrevVBarTime=Time[i];
1:  И чему может быть равен i

2: И что произойдёт чтобы так случилось.

if (Tip<2&&PrevVBarTime!=Time[i]) continue;

Извините что намёками,думаю Вы хотите научиться.

 
zhuki писал(а) >>

if (Time[i]==PrevVBarTime) return; // если бар не изменился - делать нам нефиг

PrevVBarTime=Time[i];
1: И чему может быть равен i

2: И что произойдёт чтобы так случилось.

if (Tip<2&&PrevVBarTime!=Time[i]) continue;

Извините что намёками,думаю Вы хотите научиться.

Ничего страшного, что намеками...все равно спасибо!

я так понял что, что советник сравнивает время PrevVBarTime с текущим временем, а не с Time[i], поэтому сразу же удаляет ордер. Поменял условие if (Tip<2&&PrevVBarTime!=Time[i])continue;

на

(Tip<2&&PrevVBarTime!=PrevVBarTime)continue;

но результат не изменился...если у Вас намеки еще не закончились, буду рад их увидеть. :) Спасибо!

 

(Tip<2&&PrevVBarTime!=PrevVBarTime)continue;

т.е. на языке человека если 1 не равно 1 то продолжить.

 
zhuki писал(а) >>

(Tip<2&&PrevVBarTime!=PrevVBarTime)continue;

т.е. на языке человека если 1 не равно 1 то продолжить.

согласен, бред! Мне нужно наверное каким то образом переменной PrevVBarTime присвоить новое значение Time[i] ?

 

Блин ну я же писал схематично) Вот этот кусок кода, дальше цикл удаления отложек, а уже затем выставление новых. Мне показалось что Вы чуть знакомы с программированием, ведь что-то уже написано и работает, но похоже ошибся) Не в обиду...

extern int Quant_Bars=60;
int  PrevVBarTime=0;

int start()
{
  int i,ret=0, BarIndex=-1; 
  string Symb=Symbol();
  double Max_volume=0, Price_O, Price_H, Price_L;

  for(i=9;i<Quant_Bars;i++) 
  { 
    if(Volume[i]>Max_volume) // если больше предыдущего
    {
      Max_volume=Volume[i]; 
      BarIndex=i;
    }
  }
  if (PrevVBarTime==Time[BarIndex]) return;
  PrevVBarTime==Time[BarIndex];
  Price_O=Open[BarIndex]; 
  Price_H=High[BarIndex];
  Price_L=Low[BarIndex];
...

 
Figar0 писал(а) >>

Блин ну я же писал схематично) Вот этот кусок кода, дальше цикл удаления отложек, а уже затем выставление новых. Мне показалось что Вы чуть знакомы с программированием, ведь что-то уже написано и работает, но похоже ошибся) Не в обиду...

extern int Quant_Bars=60;
int  PrevVBarTime=0;

int start()
{
  int i,ret=0, BarIndex=-1; 
  string Symb=Symbol();
  double Max_volume=0; 
  double Price_O;
  double Price_H;
  double Price_L;

  for(i=9;i<Quant_Bars;i++) 
  { 
    if(Volume[i]>Max_volume) // если больше предыдущего
    {
      Max_volume=Volume[i]; 
      BarIndex=i;
    }
  }
  if (PrevVBarTime==Time[BarIndex]) return;
  PrevVBarTime=Time[BarIndex];
  Price_O=Open[BarIndex]; 
  Price_H=High[BarIndex];
  Price_L=Low[BarIndex];

if (Time[i]==PrevVBarTime) return; // если бар не изменился - делать нам нефиг
PrevVBarTime=Time[i];
int Limit_Stop=-1;

for(int j=1; j<=OrdersTotal(); j++) // Цикл перебора ордер
{ 
if (OrderSelect(j-1,SELECT_BY_POS)==true) // Если есть следующий 
{ // Анализ ордеров: 
if (OrderSymbol()!= Symb) continue;
int Tip=OrderType(); 
if (Tip<2&&PrevVBarTime!=Time[i]) continue;
Limit_Stop=Tip;
int Ticket=OrderTicket(); 
}
OrderDelete(Ticket); 
}
if (Price_H>Ask+10*Point && OrdersTotal()==0)
{
ret=OrderSend(Symbol(),OP_BUYSTOP,0.01,Price_H,3,Price_H-100*Point,Price_H+200*Point,0,0,0,CLR_NONE);
if (ret>1) Alert (GetLastError()); // Сообщение об ошибке
return;
}
if (Price_L<Bid-10*Point && OrdersTotal()==0) // Цикл перебора ордер
{
ret=OrderSend(Symbol(),OP_SELLSTOP,0.01,Price_L,3,Price_L+100*Point,Price_L-200*Point,0,0,0,CLR_NONE);
if (ret>1) Alert (GetLastError());
return;
}}
Да какие ж тут обиды, Вы же мне помогаете!!! Я действительно мало знаком с программированием,... вот собрал в кучу весь код, но причину того почему ордера удаляються сразу же, а не по условию не могу понять. Буду признателен если вразумите неразумного)
Причина обращения: