Время свечи вычислить
Показано с 1 по 7 из 7

Тема: Время свечи вычислить

  1. #1
    Новичок
    Регистрация
    22.02.2016
    Сообщений
    5
    Promo (¢)
    1,580
    Благодарности
    Получено: 0
    Отправлено: 3

    Question Время свечи вычислить

    Всем привет,

    ктобы смог мине помочь.

    Я тут индикатор себе настроил. Он показывает первую свечьку потороя переступает через линию Moving Average.

    Далее я строю себе робота и тут мене нужно знать точьноё время именно этой свечьки.
    Но у меня не получаеться.

    В принципе нужно ведь с iCustom работать. Ну и так вот он у меня выглядит:
    Код HTML:
        double Cross = iCustom(NULL,60,"Crossover","Ban",1,60,70,0,0);
    этот Cross показывает токое число: 2147483647
    Вопрос: что теперь с этим чеслом сделать или я вообще не правельный подход выбрал?

    Unbenannt.JPG

    Вы не можете благодарить!

  2. #2
    Уважаемый Аватар для viktan
    Регистрация
    18.09.2014
    Адрес
    Far, far away...
    Сообщений
    2,810
    Promo (¢)
    11,425
    Благодарности
    Получено: 2,385
    Отправлено: 1,304
    Цитата Сообщение от shurka Посмотреть сообщение
    В принципе нужно ведь с iCustom работать. Ну и так вот он у меня выглядит:
    double Cross = iCustom(NULL,60,"Crossover","Ban",1,60,70,0,0);
    этот Cross показывает токое число: 2147483647
    Для вопросов по языку существует тема: http://forum.roboforex.ru/showthread...550#post757550
    Дополнительных тем по каждому вопросу создавать не нужно.

    По сабжу - попробую чуть-чуть поработать телепатом. В нулевом буфере iCustom для каждого бара может быть два значения - EMPTY_VALUE (то самое число 2147483647, оно же Max(int)) или значение цены, на уровне которой будет нарисована стрелка. То есть нужно искать бар, где значение не равно EMPTY_VALUE или нолю.
    Тогда поиск номера свечи будет выглядеть так:
    PHP код:
    int Shift  = -1//искомый сдвиг
    for(int i 0iBarsi++){
         
    double Cross iCustom(NULL,60,"Crossover","Ban",1,60,70,0,i);
         if(
    Cross != EMPTY_VALUE && Cross != 0){    //на всякий случай делаем еще проверку на ноль
            
    Shift i;  //нужный нам сдвиг
            
    break; //выходим из цикла
         
    }

    Строго говоря, вызов дополнительного индикатора через iCustom тут и не нужен, гораздо быстрее и экономичнее посчитать так:
    PHP код:
    int Cross()
    {
       
    int MA_Period 70;
       
    double MA1MA2;
       for(
    int i=0;i<Bars-1;i++){
          
    MA1 iMA(NULL60MA_Period0MODE_SMAPRICE_CLOSEi); 
          
    MA2 iMA(NULL60MA_Period0MODE_SMAPRICE_CLOSEi+1); 
          if(
    Open[i] < MA1 && Open[i+1] > MA2//пересечение сверху вниз
             
    return(i);
          if(
    Open[i] > MA1 && Open[i+1] < MA2//Пересечение снизу вверх
             
    return(i);   
         }


    Вы не можете благодарить!
    Хоть и не ново, я напомню снова: перед лицом и друга и врага, Ты - господин несказанного слова, а сказанного слова - ты слуга.
    ©Омар Хайам

  3. #3
    Новичок
    Регистрация
    22.02.2016
    Сообщений
    5
    Promo (¢)
    1,580
    Благодарности
    Получено: 0
    Отправлено: 3
    Спасибо за ответ viktan,

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

    я так и думал уже, что iCustom тут не совсем правильно. В общем я твой придлог щас для себя вот так переделал:
    Код HTML:
    int Cross() { 
       double Upper_now, Upper_prev, Upper_after;
       double Lower_now, Lower_prev, Lower_after;
       int Range_Start_Hour;
       
       for(int i=0;i<Bars-1;i++){ 
          Upper_now   = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,i);
          Upper_prev  = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,i+1);
          Upper_after = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,i-1);
          Lower_now   = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,i);
          Lower_prev  = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,i+1);
          Lower_after = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,i-1);
       
          if ((Upper_now < iLow(NULL,Timeframe,i)) && (Upper_prev > iLow(NULL,Timeframe,i+1)) && (Upper_after <=iLow(NULL,Timeframe,i-1))) {
             return(i); 
             Range_Start_Hour = TimeHour(iTime(NULL,Timeframe,i));
             if (Alerts==true){
                Print("Moving Average has crossed up");
             }
          }
          else if ((Lower_now > iHigh(NULL,Timeframe,i)) && (Lower_prev < iHigh(NULL,Timeframe,i+1)) && (Lower_after >= iHigh(NULL,Timeframe,i-1))) {
             return(i); 
             Range_Start_Hour = TimeHour(iTime(NULL,Timeframe,i));
             if (Alerts==true){
                Print("Moving Average has crossed down");
             }
          }
       }
    }
    В принцыпе я хочю тот час бара дальще для Range-Theory брать.
    Как ты уже наверно себе представить можешь, я наченающий по теме MQL.

    Далее я бы щас хотел бы проверить правильный ли час это функцыя выдаёт.
    типо так:
    Код HTML:
    Comment("Range Start Hour: ",Range_Start_Hour,"\n");
    Неуверен правильно и можно ли так?

    Вы не можете благодарить!

  4. #4
    Уважаемый Аватар для viktan
    Регистрация
    18.09.2014
    Адрес
    Far, far away...
    Сообщений
    2,810
    Promo (¢)
    11,425
    Благодарности
    Получено: 2,385
    Отправлено: 1,304
    Цитата Сообщение от shurka Посмотреть сообщение
    return(i);
    Это оператор безусловного выхода из функции. То есть все что после него в коде выполняться не будет.
    Нужно так:
    PHP код:
    if ((Upper_now iLow(NULL,Timeframe,i)) && (Upper_prev iLow(NULL,Timeframe,i+1)) && (Upper_after <=iLow(NULL,Timeframe,i-1))) {
             
    Range_Start_Hour TimeHour(iTime(NULL,Timeframe,i));
             if (
    Alerts==true){
                Print(
    "Range Start Hour: ",Range_Start_Hour,"\n");
             }
             return(
    i);     

    Upper_after = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLO SE,MODE_UPPER,i-1);
    Будет ошибка при i = 0, нужно тогда цикл делать не с нуля, а с 1:
    PHP код:
       for(int i=1;i<Bars-2;i++){ 

    Вы не можете благодарить!
    Хоть и не ново, я напомню снова: перед лицом и друга и врага, Ты - господин несказанного слова, а сказанного слова - ты слуга.
    ©Омар Хайам

  5. #5
    Новичок
    Регистрация
    22.02.2016
    Сообщений
    5
    Promo (¢)
    1,580
    Благодарности
    Получено: 0
    Отправлено: 3
    Вот так сейчас выглядит код:

    Код HTML:
    int Cross() { 
       double Upper_now, Upper_prev, Upper_after;
       double Lower_now, Lower_prev, Lower_after;
       int Range_Start_Hour;
    
       for(int c=1;c<Bars-1;c++){ 
          Upper_now   = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,c);
          Upper_prev  = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,c+1);
          Upper_after = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,c-1);
          Lower_now   = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,c);
          Lower_prev  = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,c+1);
          Lower_after = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,c-1);
       
          if ((Upper_now < iLow(NULL,Timeframe,c)) && (Upper_prev > iLow(NULL,Timeframe,c+1)) && (Upper_after <=iLow(NULL,Timeframe,c-1))) {
             Range_Start_Hour = TimeHour(iTime(NULL,Timeframe,c));
             if (Alerts==true){
                Comment("Range Start Hour: ",Range_Start_Hour,"\n");
             }
             return(c);     
          }  
          else if ((Lower_now > iHigh(NULL,Timeframe,c)) && (Lower_prev < iHigh(NULL,Timeframe,c+1)) && (Lower_after >= iHigh(NULL,Timeframe,c-1))) {
             Range_Start_Hour = TimeHour(iTime(NULL,Timeframe,c));
             if (Alerts==true){
                Comment("Range Start Hour: ",Range_Start_Hour,"\n");
             }
             return(c); 
          }
         }
    }
    Для понатия:
    Всю эту функцию надо ведь вне кода ставидь или можна прямо в init(start) ?
    Думаю надо вне кода. Но потом я незнаю надо ли Cross() где-то вызывать?
    Почему-то не так и не так не получаеться час бара вызвать.

    Вы не можете благодарить!

  6. #6
    Уважаемый Аватар для viktan
    Регистрация
    18.09.2014
    Адрес
    Far, far away...
    Сообщений
    2,810
    Promo (¢)
    11,425
    Благодарности
    Получено: 2,385
    Отправлено: 1,304
    Цитата Сообщение от shurka Посмотреть сообщение
    Всю эту функцию надо ведь вне кода ставидь или можна прямо в init(start) ?
    Думаю надо вне кода. Но потом я незнаю надо ли Cross() где-то вызывать?
    Почему-то не так и не так не получаеться час бара вызвать.
    Функцию внутри другой функции, конечно же нельзя, о чем вам прямо скажет компилятор. Можно вставить функцию сразу после другой функции, например OnStart()/OnCalculate()

    Ну и, конечно же, функцию кросс нужно вызвать из основного блока, из функции OnStart():

    PHP код:
    int OnStart(){
    //....
    int CrossShift =  Cross(); 
    Если в функции Cross() возвращать при одном пересечении (например, верхней ленты боллинджера) положительное значение номера бара, а при другом пересечении (нижней ленты) отрицательное:
    PHP код:
    return(-c); 
    Тогда после вызова функции в блоке OnStart() можно будет определить не только номер бара пересечения, но и его тип:
    PHP код:
    if(CrossShift 0//Пересечение нижней границы
        
    {
        
    //...Действия
        
    }
    else 
    //пересечение верхней границы
        
    {
         
    //...Действия
         

    Можно, конечно, вообще не заморачиваться с дополнительными функциями, а просто разместить код в основном блоке (все что внутри int Cross(){} вставляйте в начало функции OnStart()), только оператор return(c); замените на запоминание сдвига:
    PHP код:
    CrossShift c;
    break; 

    Вы не можете благодарить!
    Хоть и не ново, я напомню снова: перед лицом и друга и врага, Ты - господин несказанного слова, а сказанного слова - ты слуга.
    ©Омар Хайам

  7. #7
    Новичок
    Регистрация
    22.02.2016
    Сообщений
    5
    Promo (¢)
    1,580
    Благодарности
    Получено: 0
    Отправлено: 3
    Думаю дела черес функцию будет элегантнее потому-что код возможно более акуратно выглядет.

    Но я пока всё в отдел int start() вставил и вроде на первый взгляд так выглядит как мене нужно - спасибо огромное за это.

    Код теперь так выглядит:
    Код HTML:
       double Upper_now, Upper_prev, Upper_after;
       double Lower_now, Lower_prev, Lower_after;
       int Range_Start_Hour, CrossShift;
    
       for(int c=1;c<Bars-1;c++){ 
          Upper_now   = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,c);
          Upper_prev  = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,c+1);
          Upper_after = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_UPPER,c-1);
          Lower_now   = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,c);
          Lower_prev  = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,c+1);
          Lower_after = iBands(NULL,Timeframe,Bandsperiod,deri,0,PRICE_CLOSE,MODE_LOWER,c-1);
       
          if ((Upper_now < iLow(NULL,Timeframe,c)) && (Upper_prev > iLow(NULL,Timeframe,c+1)) && (Upper_after <=iLow(NULL,Timeframe,c-1))) {
             Range_Start_Hour = TimeHour(iTime(NULL,Timeframe,c));
             if (Alerts==true){
                Comment("Range Start Hour: ",Range_Start_Hour,"\n");
             }
             CrossShift = c; 
             break;  
          }  
          else if ((Lower_now > iHigh(NULL,Timeframe,c)) && (Lower_prev < iHigh(NULL,Timeframe,c+1)) && (Lower_after >= iHigh(NULL,Timeframe,c-1))) {
             Range_Start_Hour = TimeHour(iTime(NULL,Timeframe,c));
             if (Alerts==true){
                Comment("Range Start Hour: ",Range_Start_Hour,"\n");
             }
             CrossShift = c; 
             break;  
          }
       }
    Я ещё не совсем понял для чего тут "CrossShift =c" нужно.

    И кроме того у меня ещё один вопрос немного возникает что-бы перфект было.
    Я бы ещё хотел что-бы допустим когда свечки переступили линию с низу в верх, мой Range_Start_Hour выказыволся только до сех пор, пока свечки не задели линию опять.

    Типо так:
    Код HTML:
          while ((iLow(NULL,Timeframe,c) > Upper_now && iLow(NULL,Timeframe,c+1) > Upper_prev)) {
    Только опять-же неуверен куда этот контроль надо вставить. Думаю на ведь перед if-конроль этот while поставить, или?

    Вы не можете благодарить!

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •