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

[Удален]  

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

Укажите на ошибку, буду очень благодарен.  условия: расчитывается регрессия, макс. отклонение вверх вниз у определенного кол-ва баров, дак вот между отклонениями должно быть меньше столько то пипов (как бы ширина канала), а так же расстояние между рассчитанным значением регрессии на 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 не удаляется. Почему?
Файлы: