Прошу помоши, не пойму что в коде неверно.

 

Советник на большом интервале времени при тестировании совершает очень мало сделок (пропускает удовлетворяющие условия), может заглохнуть.

Укажите на ошибку, буду очень благодарен.  условия: расчитывается регрессия, макс. отклонение вверх вниз у определенного кол-ва баров, дак вот между отклонениями должно быть меньше столько то пипов (как бы ширина канала), а так же расстояние между рассчитанным значением регрессии на N-ом и первом баре по модулю не больше определенного кол-ва пипов.

В файле код, с отступами

int N, i, Ticket1, Ticket2;
double k, Price1, Price2, val;
double a, b, c, a1, b1;
double sumx = 0.0;
double sumxy = 0.0;
double sumx2 = 0.0;
double ln_maxDev, ln_maxDev1;
double deviation;
double dvalue;
int Orders1 (double a1,double b1,double ln_maxDev1)
  {
  Price1=MathRound((a1+ln_maxDev1-b1+20*Point)*10000)/10000;
  Price2=MathRound((a1-ln_maxDev1-b1-20*Point)*10000)/10000;
  Ticket1=OrderSend(Symbol( ),OP_BUYSTOP,0.1, Price1,3, Price2+10*Point, 0);
  Ticket2=OrderSend(Symbol( ),OP_SELLSTOP,0.1, Price2,3, Price1-10*Point, 0);
  return;  
  }
bool TSs()
  {
  if ((Ask+40*Point)<OrderStopLoss())
  {
  OrderModify(OrderTicket( ),OrderOpenPrice( ),Ask+40*Point,OrderTakeProfit( ),0);
  return(true);
  }  
  return(false);  
  }
bool TSb()
  {
  if ((Bid-40*Point)>OrderStopLoss())
  {
  OrderModify(OrderTicket( ),OrderOpenPrice( ),Bid-40*Point,OrderTakeProfit( ),0);
  return(true);
  }  
  return(false);  
  }
int start()
  {
  if ((iBars(0,0)!=N)&&(iBars(0,0)>7))
  {
  N=iBars(0,0);
  double value;
  double sumy = 0;
  for ( i = 1; i < 8; i++)
  {
  value = Close[i];
  sumy += value;
  sumxy += value * i;
  sumx += i;
  sumx2 += i * i;
  }
  c = sumx2 * 8 - sumx * sumx;
  b = (sumxy * 8 - sumx * sumy) / c;
  a = (sumy - sumx * b) / 8;
  ln_maxDev = 0;
  for (i = 0; i < 8; i++)
  {
  dvalue = a + b * (i - 1);
  deviation = MathAbs(Close[i] - dvalue);
  if (deviation >= ln_maxDev)
  {
  ln_maxDev = deviation;
  }
  }
  k=MathAbs(7*b);
  val=2*ln_maxDev;
  if (OrderSelect(Ticket1, SELECT_BY_TICKET)==True)
  {  
  if (OrderType()==OP_BUYSTOP)
  {
  if (OrderSelect(Ticket2, SELECT_BY_TICKET)==True)
  {
  if (OrderType()==OP_SELLSTOP)
  {
  if ((k<0.0015)&&(val<=0.004))
  {
  OrderDelete(Ticket1);
  OrderDelete(Ticket2);
  Orders1(a,b,ln_maxDev);
  }
  }
  else
  {  
  if (OrderCloseTime()==0)
  {
  OrderDelete(Ticket1);
  TSs();
  }
  else 
  {  
  OrderDelete(Ticket1);
  if ((k<0.0015)&&(val<=0.004))
  {
  Orders1(a,b,ln_maxDev);
  }
  }
  }
  }
  else  
  {
  if ((k<0.0015)&&(val<=0.004))
  {
  OrderDelete(Ticket1);
  Orders1(a,b,ln_maxDev);
  }
  }
  }  
  else 
  {
  if (OrderCloseTime()==0)
  {
  if ((OrderSelect(Ticket2, SELECT_BY_TICKET)==True)&&(OrderCloseTime()==0))
  {
  OrderDelete(Ticket2);
  }
  OrderSelect(Ticket1, SELECT_BY_TICKET);
  TSb();
  }
  else
  {
  if (OrderSelect(Ticket2, SELECT_BY_TICKET)==True)
  {
  if (OrderType()==OP_SELLSTOP)
  {
  if ((k<0.0015)&&(val<=0.004))
  {
  OrderDelete(Ticket2);
  Orders1(a,b,ln_maxDev);
  }
  }
  else
  {
  if (OrderCloseTime()==0)
  {
  TSs();
  }
  else 
  {  
  if ((k<0.0015)&&(val<=0.004))
  {
  Orders1(a,b,ln_maxDev);
  }
  }
  }
  }
  else
  {  
  if ((k<0.0015)&&(val<=0.004))
  {
  Orders1(a,b,ln_maxDev);
  }
  }
  }
  }
  }
  else
  {
  if (OrderSelect(Ticket2, SELECT_BY_TICKET)==True)
  {
  if (OrderType()==OP_SELLSTOP)
  {
  if ((k<0.0015)&&(val<=0.004))
  {
  OrderDelete(Ticket2);
  Orders1(a,b,ln_maxDev);
  }
  }
  else
  {
  if (OrderCloseTime()==0)
  {
  TSs();
  }
  else 
  {  
  if ((k<0.0015)&&(val<=0.004))
  {
  Orders1(a,b,ln_maxDev);
  }
  }
  }
  }
  else
  {  
  if ((k<0.0015)&&(val<=0.004))
  {
  Orders1(a,b,ln_maxDev);
  }
  }
  }
   
  }
  else
  {  
  if (OrderSelect(Ticket1, SELECT_BY_TICKET)==True)
  {
  if (OrderType()==OP_BUY)
  {
  if (OrderCloseTime()==0)
  {
  if ((OrderSelect(Ticket2, SELECT_BY_TICKET)==True)&&(OrderCloseTime()==0))
  {
  OrderDelete(Ticket2);
  }
  OrderSelect(Ticket1, SELECT_BY_TICKET);
  TSb();
  }
  else  
  {
  if (OrderSelect(Ticket2, SELECT_BY_TICKET)==True)
  {
  if (OrderType()==OP_SELL)
  {
  if (OrderCloseTime()==0)
  {
  TSs();
  }
  }
  }
  }
  }  
  else 
  {
  if (OrderSelect(Ticket2, SELECT_BY_TICKET)==True)
  {
  if (OrderType()==OP_SELL)
  {
  if (OrderCloseTime()==0)
  {
  OrderDelete(Ticket1);
  TSs();
  }
  }
  }
  } 
  }
  else  
  {
  if (OrderSelect(Ticket2, SELECT_BY_TICKET)==True)
  {
  if (OrderType()==OP_SELL)
  {
  if (OrderCloseTime()==0)
  {
  TSs();
  }
  }
  }
  }
  }
   
return(0);
}




Файлы:
nrg.txt  9 kb
 
kbndbyjd писал (а) >>

В файле код, с отступами


Улыбнуло. Особенно когда отступы посмотрел.
 
Да, отступы знатные! Прикрепите файл из директории компилятора как есть т.е. в виде *.mq4
 
Прикрепил. Спасибо за интерес.
Файлы:
nr7m.mq4  9 kb
 
kbndbyjd писал (а) >>
Прикрепил. Спасибо за интерес.

Просмотрел бегло, заметил пока вот, что:

Вместо

iBars(0,0)
Надо писать
iBars(NULL,0)
Честно говоря в такие конструкции вникать совсем не хочется. Так, что пользуйтесь Print'oм, для отладки кода.
 
Спасибо за принт нашел ошибку, почему-то регрессия высчитывает странные значения параметров k и val, где k - разница между первой и последней точкой канала, а val - ширина канала. Он высчитывает как-то рандомно, периодически ширина может доходить до более чем 1000 пипсов, то же и с k. Не подскажите где в регрессии ошибка?
 
kbndbyjd писал (а) >>
Спасибо за принт нашел ошибку, почему-то регрессия высчитывает странные значения параметров k и val, где k - разница между первой и последней точкой канала, а val - ширина канала. Он высчитывает как-то рандомно, периодически ширина может доходить до более чем 1000 пипсов, то же и с k. Не подскажите где в регрессии ошибка?

У Вас переменные

double sumx = 0.0;
double sumxy = 0.0;
double sumx2 = 0.0;
объявлены на глобальном уровне. При каждом тике начинает работать функция старт и начинает считаться регрессия, но в этих переменных остаются значения от предыдущего подсчета и они постояно увеличиваются, не обнуляются как должны. Посмотрите ветку Игоря Кима он как раз недавно выложил функцию по расчету регрессии. Вот ссылка
 
Доброго дня, коллеги! Без помощи не разберусь. Одновременно устанавливаются отложенные ордера buystop и sellstop (по списку первый), при срабатывании buystop удаляется sellstop. В ситуации наоборот buystop не удаляется. Почему?
Файлы: