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

 

Добрый день! Помогите пожалуйста разобраться с функцией ArrayMo (ф-я возвращает максимум кривой плотности ).

double ArrayMo(double& x[], int d=4) {
  double e, s=0;
  double m[][2];             // временный массив:
                             //  столбец 1 - количество значений
                             //  столбец 2 - значения
  int    i, k=ArraySize(x);
  int    n;                  // номер строки временного массива m
  int    r;                  // количество строк во временном массиве m

  if (k>0) {
    for (i=0; i<k; i++) {
      e=NormalizeDouble(x[i], d);
      n=ArraySearchDouble(m, e);
      if (n<0) {
        r=ArrayRange(m, 0);
        ArrayResize(m, r+1);
        m[r][0]++;
        m[r][1]=e;
      } else m[n][0]++;
    }
    ArraySort(m, WHOLE_ARRAY, 0, MODE_DESCEND);
    s=m[0][1];
  } else Print("ArrayMo(): Массив пуст!");

  return(s);
}

Возникли следующие вопросы:

1.С какой целью создается временный массив

m[][2]

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

n=ArraySearchDouble(m, e)

3. А дальше вообще для меня истина глубоко спрятана))))) После того как мы убедились, что значения нет, мы начинаем определять размер массива "непонятно каких значений".

Буду очень признательна за лучик света в этой истории))))


 
Лисичка, как насчет кода функции ArraySearchDouble, есть он? Без него разбираться, что делает программа, будет гораздо сложнее)
 

Здравствуйте! Вот функцию трейлинг стопа написал, проверьте, правильно ли. А то код у меня кардинально меняться будет, с ошибками тяжело разбираться будет, когда менять начну

void TrailStop(int ticket, int TStop)                           //ф-ция трейлинг стопа, TStop-расстояние в пп
   {
    if (TStop>0)
      {
       OrderSelect(ticket, SELECT_BY_TICKET);
       if(OrderType()==OP_BUY)
         {
          if(Bid - OrderOpenPrice()>Point*TStop)
            {
             if(OrderStopLoss()<Bid-Point*TStop)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Bid-Point*TStop, OrderTakeProfit(), 0, Blue);
                return;
               }
             else { }
            }
            else{ }
         }
       else if (OrderType()==OP_SELL)
         {
          if(OrderOpenPrice() - Ask>Point*TStop)
            {
             if(OrderStopLoss()>Ask + TStop*Point)
               {
                OrderModify(OrderTicket(), OrderOpenPrice(), 
                Ask+Point*TStop, OrderTakeProfit(), 0, Blue);
                return;
               }
             else { }
            }
          else { }
         }
       else { }
      }
    else { }
    }
 
gogent:

Здравствуйте! Вот функцию трейлинг стопа написал, проверьте, правильно ли. А то код у меня кардинально меняться будет, с ошибками тяжело разбираться будет, когда менять начну

Не учитываете Stoplevel, так что если у вас не ECN/NDD, то можете попасть на ошибку "неправильные стопы"

И вообще после OrderModify лучше все ошибки обрабатывать, на всякий случай.

 
alsu:
Лисичка, как насчет кода функции ArraySearchDouble, есть он? Без него разбираться, что делает программа, будет гораздо сложнее)


Это все функции от КimIV, в них я пытаюсь разобраться. Вот код:


Эта функция выполняет поиск элемента массива по значению типа double и возвращает индекс найденного элемента или -1. Функция находит только один элемент и при положительном результате прекращает поиск.

  • m - Массив, в котором выполняется поиск элемента.
  • e - Значение типа double, которое нужно найти в массиве m.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Выполняет поиск элемента массива по значению                   |
//|             и возвращает индекс найденного элемента или -1.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов                                                    |
//|    e - значение элемента                                                   |
//+----------------------------------------------------------------------------+
int ArraySearchDouble(double& m[], double e) {
  for (int i=0; i<ArraySize(m); i++) {
    if (m[i]==e) return(i);
  }
  return(-1);
}
 
Профи, подскажите что делаю не так? Требуется перерисовывать окно с индикатором при появлении нового бара. if (Bars != Prebars) WindowRedraw();
ничего не дает. PreBars равен кол-ву баров на предыдущем тике. Может не туда вставляю или не та функция?
 
kon12:
Профи, подскажите что делаю не так? Требуется перерисовывать окно с индикатором при появлении нового бара. if (Bars != Prebars) WindowRedraw();
ничего не дает. Может не туда вставляю или не правильно чего?

чтоб что то перерисовать, надо сначала это нарисовать. а чем и как вы рисуете?
 
sergeev:

чтоб что то перерисовать, надо сначала это нарисовать. а чем и как вы рисуете?


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

int init() {
SetIndexBuffer(0,ZZ);
SetIndexStyle(0,DRAW_SECTION);
SetIndexEmptyValue(0,0.0);

 
kon12:


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

int init() {
SetIndexBuffer(0,ZZ);
SetIndexStyle(0,DRAW_SECTION);
SetIndexEmptyValue(0,0.0);

WindowRedraw() перерисовывает графические объекты. К буферам не имеет отношения.
 
Zhunko:
WindowRedraw() перерисовывает графические объекты. К буферам не имеет отношения.

Понял... Если другой путь с перерисовкой?
Причина обращения: