Почему советник тестирует только один день?

 

В приложении советник, делает следующее:

1. Определяет минимум и максимум
2. При достижении минимума или максимума - открывает сделку соответственно на покупку или на продажа
3. Стоплосс и тейк профит выставляются сразу, трейлинг стоп если сделка выходит в плюс

Проблема млин в том, что тестируется этот советник только на один день.
Если выбрать любой период больше одного дня, в истории появляются сделки только за первый день.
Дальше просто бесполезно процессор парится... Никаких новых сделок в истории не появляется ни за час ни за два часа тестирования

С одной стороны советник простой. Но я думаю проблема в том, что при закрытии сделки, советник не может сбросить старые значения минимума и максимума.

Если вживую торговать, то просто ручками мона все удалить... В общем, в итоге я добавил следующее:

4. Сделка открыта - определить ее тикет, сохранить в глобальной переменной
5. Сделка закрыта, проверить есть ли тикет (глобальная переменная не равна ноль), если да - обнулить все значения, отчистить график от стрелок млин всяких
6. Обнулить тикет

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

Файлы:
 
//le maxi de minis.mq4
//Evgeny I. SHCHERBINA
#property copyright "Evgeny I. SHCHERBINA"

extern double lot = 0.1;
double maxi = 0, mini = 0;
int timer1 = 120, ts = 0, ticket, t_modify, g_ticket = 0;
string object;

int init(){
  if(OrdersTotal() == 0){
    maxi = 0; 
    mini = 0;
    ts = 0; 
    ObjectDelete("arrow1");
    ObjectDelete("arrow2");
  }
  /*else{ Вообще какойто бред
    OrderSelect(0,SELECT_BY_POS);
    if(OrderType() == OP_SELL && (OrderStopLoss() <= OrderOpenPrice())){
      ts = 1;
    }else if(OrderType() == OP_BUY && (OrderStopLoss() >= OrderOpenPrice())){
      ts = 1;
    }
  }*/
  //timer1_ticking();
}

int start(){
  if(OrdersTotal() == 0){
    //if(g_ticket > 0){!!!
      mini = 0;
      maxi = 0;
      ts = 0;
      g_ticket = 0;
      ObjectDelete("arrow1");

      ObjectDelete("arrow2");

    //}
    find_maxi(); 
    find_mini();
  }
  if(OrdersTotal() > 0){
    OrderSelect(0,SELECT_BY_POS);
    //g_ticket = OrderTicket();!!!

    if(OrderType() == OP_SELL && (OrderOpenPrice()-50*Point) >= Bid && ts == 0){
      t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Bid+50*Point,OrderTakeProfit(),0,Red);
      ts = 1;
    }else if(OrderType() == OP_SELL && (OrderStopLoss()-100*Point) >= Bid && ts == 1){
      t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Bid+100*Point,OrderTakeProfit(),0,Red);
    }
    if(OrderType() == OP_BUY && (OrderOpenPrice()+50*Point) <= Ask && ts == 0){
      t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Ask-50*Point,OrderTakeProfit(),0,Red);
      ts = 1;
    }else if(OrderType() == OP_BUY && (OrderStopLoss()+100*Point) <= Ask && ts == 1){
      t_modify = OrderModify(OrderTicket(),OrderOpenPrice(),Ask-100*Point,OrderTakeProfit(),0,Red);
    }
  }
  return;
}

/*int timer1_ticking(){
  while(timer1 >= 0){
    timer1--;
    object = "Поиск экстремумов: " + timer1 + " сек.";
    ObjectSetText("Obj",object,12,"Times New Roman",Aqua);
    ObjectCreate("Obj",OBJ_LABEL, 0, 0, 0);
    ObjectSet("Obj", OBJPROP_XDISTANCE, 5);
    ObjectSet("Obj",OBJPROP_YDISTANCE,20);
    Sleep(1000);
  }
}*/

int find_maxi(){
  int i;
  double oc1, oc2, oc3, oc4, oc5, oc6, oc7;
  //for(i=0; i>=0; i++){Видимо из индюка стянули, вообще какаято ерунда дальше идет    
    i=0;//!!!
    if(Close[i] > Open[i]){oc4 = Close[i];}
    else{oc4 = Open[i];}
    if(oc4 > Bid){//Bid равен Close[0]

      if(Close[i-3] > Open[i-3]){oc1 = Close[i-3];}//Смысл этого какой?
      else{oc1 = Open[i-3];}
      if(Close[i-2] > Open[i-2]){oc2 = Close[i-2];}
      else{oc2 = Open[i-2];}
      if(Close[i-1] > Open[i-1]){oc3 = Close[i-1];}
      else{oc3 = Open[i-1];}
      if(Close[i+1] > Open[i+1]){oc5 = Close[i+1];}
      else{oc5 = Open[i+1];}
      if(Close[i+2] > Open[i+2]){oc6 = Close[i+2];}
      else{oc6 = Open[i+2];}
      if(Close[i+3] > Open[i+3]){oc7 = Close[i+3];}
      else{oc7 = Open[i+3];}
      if(oc1 <= oc4 && oc2 <= oc4 && oc3 <= oc4 && oc5 <= oc4 && oc6 <= oc4 && oc7 <= oc4){
        if(maxi == 0){ObjectDelete("arrow1"); maxi = oc4;}
        ObjectCreate("arrow1",OBJ_ARROW, 0, Time[i], High[i]+0.001);
        ObjectSet("arrow1",OBJPROP_ARROWCODE,218);
        ObjectSet("arrow1",OBJPROP_COLOR,Aqua);
        break;
      }
    }
    if(maxi == Bid){open_order(1);}//Из этой строки можно сделать вывод что i=0(выше), иначе торговля вестись не будет соответственно убрать цикл
  //}
}

int find_mini(){
  int i;
  double oc1, oc2, oc3, oc4, oc5, oc6, oc7;
  for(i=0; i>=0; i++){
    if(Close[i] < Open[i]){oc4 = Close[i];}
    else{oc4 = Open[i];}
    if(oc4 < Bid){
      if(Close[i-3] < Open[i-3]){oc1 = Close[i-3];}
      else{oc1 = Open[i-3];}
      if(Close[i-2] < Open[i-2]){oc2 = Close[i-2];}
      else{oc2 = Open[i-2];}
      if(Close[i-1] < Open[i-1]){oc3 = Close[i-1];}
      else{oc3 = Open[i-1];}
      if(Close[i+1] < Open[i+1]){oc5 = Close[i+1];}
      else{oc5 = Open[i+1];}
      if(Close[i+2] < Open[i+2]){oc6 = Close[i+2];}
      else{oc6 = Open[i+2];}
      if(Close[i+3] < Open[i+3]){oc7 = Close[i+3];}
      else{oc7 = Open[i+3];}
      if(oc1 >= oc4 && oc2 >= oc4 && oc3 >= oc4 && oc5 >= oc4 && oc6 >= oc4 && oc7 >= oc4){
        if(mini == 0){ObjectDelete("arrow2"); mini = oc4;}
        ObjectCreate("arrow2",OBJ_ARROW, 0, Time[i], Low[i]-0.0005);
        ObjectSet("arrow2",OBJPROP_ARROWCODE,217);
        ObjectSet("arrow2",OBJPROP_COLOR,Aqua);
        break;
      }
    }
    if(mini == Bid){open_order(2);}
  }
}

int open_order(int type){
  if(OrdersTotal() == 0){
    if(type == 1){
      ticket = OrderSend(Symbol(),OP_SELL,lot,Bid,3,Bid+100*Point,mini,"sh_order",356111515938,0,Green);
    }else if(type == 2){
      ticket = OrderSend(Symbol(),OP_BUY,lot,Ask,3,Ask-100*Point,maxi,"sh_order",356111515938,0,Green);
    }
  }
}

Код очень плохой, в нем дофига ошибок логических в том числе. Не торгует больше дня, и виснет от того что не может выйти из цикла в ваших функция по максимумам минимум. Выделил основные ошибки. Но так как не понял что анализирует данный советник, нет возможностей сделать его рабочим по вашей тс.

 

Ну, с таким количеством "выявленных" ошибок, не мне за голову браться (я тут слава богу программить научился в свои 27), а тому кто нашел эти ошибки...
Почитайте описание что и как работает выше (пункты 1-3), чтобы не задавать вопросы, смысл этого какой )))

А ошибку я нашел уже и исправил. Не работало пушто в определенный момент советник не мог найти новый максимум (минимум) на 15-мин свечках. То есть он конечно есть, но уходил слишком далеко... Я ведь не ограничиваю поиск максимума (минимума) каким-то количеством свечек. Теперь ограничил, если максимум (минимум) не найден в диапазоне 300 15-мин. свечек, определять его как Bid+300*Point для максимума соответветственно.

Так что все кул, протестил, все работает )))))))) Всем спасибо, все свободны

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