[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 323

 

Вот что получается:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                           // Счётчик идущих друг за другом свечей с..
       cntDn,                                                                           // .. требуемыми признаками
       t;                                                                               // Счётчик всех просчитанных баров
       
   for (int i=i_AnyBarsToHistory; i>=1; i--, t++)
   {
      if (directionMA == CROSS_UP)                                                      // Если машки направлены вверх
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                   // .. прибавим 1 к счётчику
         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                 // .. счётчик обнуляем
                                                                                        
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);

         if (t == i_AnyBarsToHistory)
         {
             if (cntDn == i_sequentBarsСount)                                                // Если cnt баров в подряд медвежьи..
                 return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                     // .. Выходим из функции
         }
      }

      if (directionMA == CROSS_DN)                                                      // Если машки направлены вниз
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                   // .. прибавим 1 к счётчику
         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                 // .. счётчик обнуляем
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

         if (t == i_AnyBarsToHistory)
         {
             if (cntUp == i_sequentBarsСount)                                                // Если cnt баров в подряд бычьи..
                 return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                     // .. Выходим из функции
         }
      }
      return (REQUIRED_SEQUENTIAL_MISS);
   }
}

  По сути, не принтуется даже строка:

Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

 Значит выше по ходу есть какой-то косяк.

 

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

return (REQUIRED_SEQUENTIAL_MISS);

 Хотя очевидно, что код то элементарный, и вроде как ошибок то быть не может там.

 

Доброго всем! Уважаемые гуру, подскажите почему v_s увеличивается и уменьшает при увеличении и уменьшении профита в валюте депозита?    

 value_profit() - это расчет профита в валюте депозита.

   double value_stop,value_step;
   value_stop=((AccountBalance()/100)*1);
   value_step=((AccountBalance()/100)*4);
   double v_s;
   
   if (value_profit()>=(value_step+value_stop))
     for (int v=1;v<=100;v++)
     {
        if (value_profit()>=(value_step+(value_stop*v)))
        
        {
        v_s=value_stop*v;
        }
        else
        {        
        if (value_profit()<=v_s)
        close_all();
        }
      
     }
 
hoz:

 По сути, не принтуется даже строка:

1. Зачем делать модульность именно сразу? Конечно, у каждого свой стиль,  но я бы сначала отшлифовал компактный вариант, а потом, когда он будет работать как часы, перевёл бы его на модульность. Компактный вариант (без вынесенных функций Trade, LastCandlesType, GetStateOfMA, GetGeneralSignal) приводил как вариант внутренности start() на прошлой странице. Как он у вас работает? Если заработает, тогда разделяйте на модули.

2.  Код, мне кажется, абсолютно идентичен прежнему, т.к. счётчик t изменяется абсолютно параллельно счётчику i. Зачем тогда сравнивать с t, если можно сравнить с i? И, идя по логике дальше, зачем тогда сравнивать с i, если у нас код не работал?

3. Извиняюсь за назойливость, но как у вас всё-таки будет работать такой вариант с выносом всё-таки выхода за цикл:

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

 Я понимаю, что тоже может не работать, мало ли что, но мне необходимо в этом убедиться, чтобы разбираться дальше.

4. Чисто моё личное приспособление: код набирать не в метаэдиторе, а в любом другом редакторе с нумерацией строк, и принтовать на каждом изменении любой переменной и на каждой, на любой проверке if или switch, в той же строке (после последней точки с запятой). Принтуйте в формате номер строки - проверяемое значение (значения). Принт выношу за if таким образом: if(tracing) {Print(StringConcatenate("номер_строки: имя_переменной=", имя_переменной));} а переменную объявляю в шапке, типа: bool tracing=false;//включить трассировку. Тогда у вас будет полноценная трассировка и соответственно полноценная отладка. Но логи чистить чаще правда приходится. Если сразу в метаэдиторе, то сначала можно делать пустой шаблон типа

/*001*/

...

/*999*/

в начале строк (и это работает), а потом уже в копии этого шаблона набирать код. Но это я только так думаю, на практике так пробовать пытался, но пытался непоследовательно.

 
rajak:

Доброго всем! Уважаемые гуру, подскажите почему v_s увеличивается и уменьшает при увеличении и уменьшении профита в валюте депозита?    

 value_profit() - это расчет профита в валюте депозита.

   double value_stop,value_step;
   value_stop=((AccountBalance()/100)*1);
   value_step=((AccountBalance()/100)*4);
   double v_s;
   
   if (value_profit()>=(value_step+value_stop))
     for (int v=1;v<=100;v++)
     {
        if (value_profit()>=(value_step+(value_stop*v)))
        
        {
        v_s=value_stop*v;
        }
        else
        {        
        if (value_profit()<=v_s)
        close_all();
        }
      
     }
Бегло посмотрев, сразу увидел косяк с кавычками. Научить пользоваться оператором if.
 
gyfto:

3. Извиняюсь за назойливость, но как у вас всё-таки будет работать такой вариант с выносом всё-таки выхода за цикл:

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

Хм. Заработало. Прогнал в визуале несколько "экранов", всё чётко на данном интервале. Осталось понять, почему прошлый раз не работало. Это будет полезно, чтоб в будущем не споткнуться.
 
hoz:

Хм. Заработало.


Рад))))

hoz:

Осталось понять, почему прошлый раз не работало. Это будет полезно, чтоб в будущем не споткнуться.

 Потому что на будущее нехрен выходить из for, не дойдя до Close[0] или что там будет считаться границей окна в любом другом алгоритме. Это же не while.

 
gyfto:

1. Зачем делать модульность именно сразу? Конечно, у каждого свой стиль,  но я бы сначала отшлифовал компактный вариант, а потом, когда он будет работать как часы, перевёл бы его на модульность. Компактный вариант (без вынесенных функций Trade, LastCandlesType, GetStateOfMA, GetGeneralSignal) приводил как вариант внутренности start() на прошлой странице. Как он у вас работает? Если заработает, тогда разделяйте на модули.

На самом деле, я привык так писать. Да и искать ошибки проще. Ведь и щяс я сразу знал что косяк был в функции LastCandlesType(). Но причину пока что не выяснил, хотя Ваш вариант заработал.

gyfto:

2.  Код, мне кажется, абсолютно идентичен прежнему, т.к. счётчик t изменяется абсолютно параллельно счётчику i. Зачем тогда сравнивать с t, если можно сравнить с i? И, идя по логике дальше, зачем тогда сравнивать с i, если у нас код не работал? 

Поздно писал, .. моральная перегрузка видать.

gyfto:

 Я понимаю, что тоже может не работать, мало ли что, но мне необходимо в этом убедиться, чтобы разбираться дальше.

Работает! Осталось понять почему тот код не работал. Первый момент бросившийся в глаза, это выход из функции когда значение счётчика достигнет значения i_sequentBarsСount. Но, опять же, я же принтовал и значение счётчика только 1 показывало постоянно, когда я поместил дефолтный выход из функции return(REQUIRED_SEQUENTIAL_MISS);

До того как я его поместил, всё просчитывалось верно, но сова не верно торговала. Там вообще творилось абы что. Хотя по идее, если ни какой if их расположенных выше дефолтового выхода не сработал, значит не сработало ни одного из условий, и даже если поместить в условие дефолтовый выход не должно сработать. И, наоборот, если условие соблюдается, оно должно соблюдаться. 


gyfto:

4. Чисто моё личное приспособление: код набирать не в метаэдиторе, а в любом другом редакторе с нумерацией строк, и принтовать на каждом изменении любой переменной и на каждой, на любой проверке if или switch, в той же строке (после последней точки с запятой). Принтуйте в формате номер строки - проверяемое значение (значения). Принт выношу за if таким образом: if(tracing) {Print(StringConcatenate("номер_строки: имя_переменной=", имя_переменной));} а переменную объявляю в шапке, типа: bool tracing=false;//включить трассировку. Тогда у вас будет полноценная трассировка и соответственно полноценная отладка. Но логи чистить чаще правда приходится. Если сразу в метаэдиторе, то сначала можно делать пустой шаблон типа

/*001*/

...

/*999*/

в начале строк (и это работает), а потом уже в копии этого шаблона набирать код. Но это я только так думаю, на практике так пробовать пытался, но пытался непоследовательно.


Ну так мы же принтуем исходя из данных эксперта, а не номеров строк. Зачем Вам номера строк? Я лично использую для анализа кода т.к. там реально есть удобные моменты. А писать и отлаживать код ориентируясь на номера строк для меня нонсенс.
 
hoz:

 Осталось понять почему тот код не работал.


Как я сам понял. Считываем пересечения машек. Точнее три идущие подряд бычьи или медвежьи свечи после пересечения в любой момент. Когда условие выполняется, входим в рынок. Но по словесному описанию, эти три или больше идущих подряд свечей относятся к правой границе окна. У вас же по коду они могли относиться и к середине окна. Поэтому советник выходил в рынок тогда, когда наступало условие (три свечи), при том что последняя свеча могла быть далеко не последняя.
 
gyfto:

Как я сам понял. Считываем пересечения машек. Точнее три идущие подряд бычьи или медвежьи свечи после пересечения в любой момент. Когда условие выполняется, входим в рынок. Но по словесному описанию, эти три или больше идущих подряд свечей относятся к правой границе окна. У вас же по коду они могли относиться и к середине окна. Поэтому советник выходил в рынок тогда, когда наступало условие (три свечи), при том что последняя свеча могла быть далеко не последняя.


 Да. Вывод тут такой: зная синтаксис, нужно ещё следить за логикой. Ведь это очень важно. У меня там как-раз таки была логическая ошибка.

Вроде и простая, а что-то я сам зациклился и сразу не осилил. Мла. Бывает .. :(

 

Добрый день!

Мой вопрос будет немного отстранённым от темы. 

Подскажите, пожалуйста, можно ли где-нибудь найти нарезку фигур ТА в виде CSV файлов? Приемлем вариант с txt, xls или любыми другими форматами, которые можно обработать программно.

В различных статьях, учебниках по ТА присутствуют примеры фигур ТА, но разумеется в виде обычных картинок. А не попадались ли кому-то более-менее большие наборы фигур ТА, сохраненные как кусочек истории какой-нибудь валютной пары на периодах H1-H4 скажем? 

Гуглил, не нашел. Разумеется, можно вручную перебрать историю, отметить фигуры, экспортировать этот кусок истории как .csv; повторить нужное количество раз, собрать в итоге базу фигур. Но если кто-то это уже сделал, хотелось бы сэкономить время.

Заранее спасибо :) 

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