Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 175

 

Советник выходит на 33 баре после сделки:

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (Time[33]>t) 
          {                                      
          Cls_B=true;              
          }

В реале и тестере вышел на 43 баре. Пробовал задать параметры выхода на пятом баре все нормально. Уважаемые, на Ваш взгляд в чем может быть проблема?

 
Forexman77:

Советник выходит на 33 баре после сделки:

В реале и тестере вышел на 43 баре. Пробовал задать параметры выхода на пятом баре все нормально. Уважаемые, на Ваш взгляд в чем может быть проблема?


А может if (условие) было выполнено несколько раз ( еще разок на 10 баре например) ? и ето выполнение отстрочило длину жизни

 
ALXIMIKS:


А может if (условие) было выполнено несколько раз ( еще разок на 10 баре например) ? и ето выполнение отстрочило длину жизни

Одна сделка: вход 15:37, выход 16:19. Выход на 41 баре, если быть более правильным.
 
Forexman77:
Одна сделка: вход 15:37, выход 16:19. Выход на 41 баре, если быть более правильным.


А если заменить на iBarShift интересно ошибка останется ??? Может пропуски баров в истории (точно нет дыротеней?) ?

ВВедите после выполнение условия подщет открытых баров, посмотрите сколько их реально открылось, а то ссылаться на время как-то не очень верно

 
ALXIMIKS:


А если заменить на iBarShift интересно ошибка останется ??? Может пропуски баров в истории (точно нет дыротеней?) ?

ВВедите после выполнение условия подщет открытых баров, посмотрите сколько их реально открылось, а то ссылаться на время как-то не очень верно

Код должен быть таким?

static datetime t;
datetime s=Time[33]>t;

if (условие)
    {
      Opn_B = true; 
      t=Time[0];
      int shif= iBarShift(Symbol(),PERIOD_M1,t,false);
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),PERIOD_M1,s,false)) 
    {                                      
     Cls_B=true;              
    }

Такой код зацикливает советника.

 

Здраствуйте, помогите пжл сделать что бы алерт проходил один раз за бар на каждой линии, а не только на первой,

ограничил количество сигналов временем, но не пойму как буфер сделать для одного бара

 datetime LastAlertTime = 0;
int start()
  {

  string namesymb=Symbol();
  string tf=Period();

       for(int i = ObjectsTotal()-1; i >= 0; i--)
      {
         string name = ObjectName(i);
         
         if(ObjectType(name) == OBJ_TREND)
         {
            double value = ObjectGetValueByShift(name, 0);                    
             if(Bid <= value + Point && Bid >= value - Point)          
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(namesymb,"  M",tf,"   ",name);
             }
                Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",tf,"   ",name); 
            } 
         }      
}
 
Forexman77:

Советник выходит на 33 баре после сделки:

В реале и тестере вышел на 43 баре. Пробовал задать параметры выхода на пятом баре все нормально. Уважаемые, на Ваш взгляд в чем может быть проблема?


Начнем на трезвую голову.

Время срабатывания флага Opn_B = true; ничего еще не значит, так как ордер в ету же секунду может и не открыться.

Можно использовать время открытия ордера OrderOpenTime или присвоить переменной t значение времени после успешного открытия.

Далее: вы использовали

minimum = iLow(Symbol(),Period(),0);

1) а нужно ли вам iLow или лучше же будет просто Low если используете ту же валюту и таймфрейм

2) значение Symbol() и Period()при многократном использовании лучше загонять в переменные. Все влияет на быстродействие - привыкайте.

На счет минутного графика - если за минуту не было ни единого тика - новый бар не рисуется (прикол может быть в етом)

А что касается iBarShift имел ввиду

static datetime t;

if (условие)
      {
      Opn_B = true; 
      t=Time[0];
      minimum = iLow(Symbol(),Period(),0);
      }
if (iBarShift(Symbol(),1,t,false)>33) 
          {                                      
          Cls_B=true;              
          }

Самым адекватным на даный момент кажется вариант

if ((TimeCurrent-t)/60)>33) Cls_B=true;
 
oleksaz:

Здраствуйте, помогите пжл сделать что бы алерт проходил один раз за бар на каждой линии, а не только на первой,

ограничил количество сигналов временем, но не пойму как буфер сделать для одного бара

string namesymb=Symbol();
string tf=Period();

Стоит ли перезначать переменные при каждом тике?

Влияет ли на быстродействие при 1000000 прогонках цикла string tf = Period(), или правильнее int tf = Period()? Здесь и сам не знаю.

 if(Bid <= value + Point && Bid >= value - Point)  

А правильное ли условие? А если гепчик в 4 пипа?

if (LastAlertTime < Time[0])
LastAlertTime = Time[0];
          

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

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

 
ALXIMIKS:


Самым адекватным на даный момент кажется вариант


Извините, но пытаться подсчитать количество баров по времени - это очень неадекватный подход.
 
ALXIMIKS:

Стоит ли перезначать переменные при каждом тике?

Влияет ли на быстродействие при 1000000 прогонках цикла string tf = Period(), или правильнее int tf = Period()? Здесь и сам не знаю.

А правильное ли условие? А если гепчик в 4 пипа?

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

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


int start()
  {
string scrdate,nametf;

        if (Period()==PERIOD_M1)  nametf="9_M1";
        if (Period()==PERIOD_M5)  nametf="8_M5";
        if (Period()==PERIOD_M15) nametf="7_M15";
        if (Period()==PERIOD_M30) nametf="6_M30";
        if (Period()==PERIOD_H1)  nametf="5_H1";
        if (Period()==PERIOD_H4)  nametf="4_H4";
        if (Period()==PERIOD_D1)  nametf="3_D1";
        if (Period()==PERIOD_W1)  nametf="2_W1";
        if (Period()==PERIOD_MN1) nametf="1_Monthly";
/////////////////  
       for(int i = ObjectsTotal()-1; i >= 0; i--)//мониторим все объекты
      {
         string name = ObjectName(i);//имя объектов берем из i переменной
         
         scrdate=StringConcatenate(Symbol()," ",TimeToStr(TimeCurrent(), TIME_DATE),"_",Hour(),".",Minute()," ",nametf," ",".jpg");//,name

         if(ObjectType(name) == OBJ_TREND)//отбираем тип по имени 
         {
            double value = ObjectGetValueByShift(name, 0);//функция для объектов
            
            Comment("\n\n Alert running \n ", TimeToStr(TimeLocal(), TIME_DATE|TIME_SECONDS),"\n\n M",Period(),"   ",name);           
            
             if(Bid <= value + Point && Bid >= value - Point)
             
            {
            if (LastAlertTime < Time[0]){
            LastAlertTime = Time[0];
            
               Alert(Symbol(),"  M",Period(),"   ",name);
               /////////////////////////////////////////////////
               WindowScreenShot(scrdate,1920,1200,0,-1,-1);
               ////////////////////////////////////////////////////////
             }               
            }
         }
}
   return(0);
  }

1. убрал

2. согласен если гепчик то нет сигнала(так и должно быть) нет сигнала ->нет цены ->нет сделки

3. об этом я и сказал выше, а что сделать не знаю

PS спасибо за ответ

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