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

 
Sepulca:

Хорошая задачка для мозгов. Можно вот так попробовать:

Результат тестирования для размерности 4. Если Х элемент array не выбирается, иначе использовать array[цифра] и фрагмент для размерности 6:


Посмотрел ваш код, но не понятно следующее - вы ни на одном из этапов не считывали данных оригинального массива. только количество элементов в нем
 
//chief2000:

Посмотрел ваш код, но не понятно следующее - вы ни на одном из этапов не считывали данных оригинального массива. только количество элементов в нем


А зачем мне данные оригинального массива? Я просто согласно вашей задумке делаю выборки элементов массива. А что делать с данными из выборки - Вам решать. Т.е. если N[0]=3, если N[1]=2, если N[2]=1, если N[3]=0, то для дальнейшего анализа используем array[N[0]], array[N[1]], array[N[2]], array[N[3]], а если N[0]=3, N[1]=2, N[2]<0, N[3]<0, то для дальнейшего анализа используем только array[N[0]], array[N[1]] поскольку N[2]<0 и N[3]<0. Делается перебор всех возможных комбинаций, которые не повторяются согласно Вашему посту (с учетом того что нумерацмя массивов начинается с 0 до ArraySize(array)-1):

[4] <=> { 1 2 3 4 }

1, 12, 13, 14, 123, 124, 134, 1234, 
2, 23, 24, 234, 
3, 34,
4

А дальше действуйте согласно своему алгоритму:

if(NewComb){
// Получили новую комбинацию в массиве N размерностью k    
    
    for(i=0;i<k;i++){// Перебираем массив N. Если N[i]<0 то элемент array[N[i]] не участвует в выборке.
                     // Например, для размерности 4 если N[0]=3,N[1]=1,N[2}<0,N[3]<0 то это выборка array[3] и array[1]
                     //                             если N[0]=3,N[1]=2,N[2]=1,N[3]=0 то это выборка array[3] и array[2] array[1] и array[0]
     if(N[i]>=0){// использовать как-то array[N[i]]}
    }

   }
 
Sepulca:


А зачем мне данные оригинального массива? Я просто согласно вашей задумке делаю выборки элементов массива. А что делать с данными из выборки - Вам решать. Т.е. если N[0]=3, если N[1]=2, если N[2]=1, если N[3]=0, то для дальнейшего анализа используем array[N[0]], array[N[1]], array[N[2]], array[N[3]], а если N[0]=3, N[1]=2, N[2]<0, N[3]<0, то для дальнейшего анализа используем только array[N[0]], array[N[1]] поскольку N[2]<0 и N[3]<0. Делается перебор всех возможных комбинаций, которые не повторяются согласно Вашему посту (с учетом того что нумерацмя массивов начинается с 0 до ArraySize(array)-1):

А дальше действуйте согласно своему алгоритму:


Теперь ясно (у меня считывание данных происходит на следующем этапе, просто непривычно работать с не своим кодом).
Большое Спасибо!

 

Помогите найти ошибку в функции.

Проблема в том, что если считать бары выше МА - функция возвращает корректное значение.

А вот если ниже МА - функция возвращает всегда 1 (единица)

int CheckFiltr ()
   {
   int i=1;
   for (;;)
      {
      if (NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)||NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm))
         {
         i++;
         Comment ("Фильтр = ",i);         
         }
      else break;
      }
   return (i);
   }
 
MarkTrade:

Помогите найти ошибку в функции.

Проблема в том, что если считать бары выше МА - функция возвращает корректное значение.

А вот если ниже МА - функция возвращает всегда 1 (единица)

Навскидку так лучше, хотя можно значительно оптимизировать код, т.к. только грамматику исправил:

int CheckFiltr ()
   {
   int i=1;
   int Norm=Digits;
   for (;;)
      {
      if (
           (   NormalizeDouble(High[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
            && NormalizeDouble(Low[i] ,Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
           )
          ||
           (   NormalizeDouble(High[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm) 
            && NormalizeDouble(Low[i] ,Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
           )
         )

         {
         i++;
         Comment ("Фильтр = ",i);         
         }
      else break;
      }
   return (i);
   }
 
paladin80:

Для вашего примера разницы вообще-то нет, но в любом случае надо указать начало и конец массива.

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


Спасибо еще раз! Теперь попытался сделать количество "проверяемых" баров оптимизируемым, но результатов в окне просто нет. Пробовал начинать подсчет и с начала и с конца, но тщетно.

extern int number=3;
//------------------------------------+
for (int x=number; x>=1; x--)
{
 if(Open[x]==Open[x-1]) continue;
    if(Open[x]<Open[x-1])
   {
   //--- action
   }
 else{
    if(Open[x]>Open[x-1])
   {
   //--- action
  }
 }
}
 
Sepulca:
Навскидку так лучше, хотя можно значительно оптимизировать код:


Так работает... Спасибо!

Только вот понять бы, почему мой вариант работать не хочет...

 
MarkTrade:


Так работает... Спасибо!

Только вот понять бы, почему мой вариант работать не хочет...


Посмотрите внимательней на свой код

 if (NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
||NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm))
     
Первый член Вы просто сравниваете с нулем, т.е. истинно или нет.
 
MarkTrade:


Так работает... Спасибо!

Только вот понять бы, почему мой вариант работать не хочет...

Ваш код:

int CheckFiltr ()
   {
   int i=1;
   for (;;)
      {
      if (NormalizeDouble(High[i],Norm)&&
          NormalizeDouble(Low[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
            ||    
          NormalizeDouble(High[i],Norm)&&
          NormalizeDouble(Low[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm))
         {
         i++;
         Comment ("Фильтр = ",i);         
         }
      else break;
      }
   return (i);
   }

Может так понятней

опс.. уже ответили, да можно без нормализации

 
Roger:


Посмотрите внимательней на свой код

Первый член Вы просто сравниваете с нулем, т.е. истинно или нет.


то есть выражение "если а и в больше с" не правильно, а правильно "если а больше с и в больше с" - я верно Вас понял?
Причина обращения: