Прошу помочь новичку

 

Добрый день!

Прошу помочь знающих в решении вопроса. Я абсолютный новичок, никогда не программировал, поэтому, пожалуйста, камнями не закидывайте. Форум/Гугл шерстил, ответа не нашел.


Нужна помощь в реализации советника, торгующего от горизонтальных уровней цены. Уровни заведомо известны. Советник должен открывать сделки при касании этих уровней.

Уровней много(больше 100), поэтому через оператор if все писать не правильно, как мне кажется.

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

Если сравнивать текущую цену с элементами массива - появляется один нюанс:

Ф-ия ArrayBsearch возвращает индекс первого найденного элемента. Если искомое значение не найдено, то возвращает индекс ближайшего меньшего по значению из элементов, между которыми расположено искомое значение.

double Price = Bid;                                 
     int Index;                                          
     Index = ArrayBsearch(Level,Price,0,0,MODE_ASCEND);

Возможно ли сделать так, чтобы ArrayBsearch не возвращала ни какого значения, если текущая цена не соответствует не одному из уровней цены, что хранятся в массиве?

Если я не там копаю, то прошу указать на недочеты и посоветовать, как можно реализовать открытие ордеров от конкретных заданных уровней цены, так, чтобы каждый уровень не писать через if?

Заранее благодарю всех кто откликнется!

 
ELDAR133:

Добрый день!

Прошу помочь знающих в решении вопроса. Я абсолютный новичок, никогда не программировал, поэтому, пожалуйста, камнями не закидывайте. Форум/Гугл шерстил, ответа не нашел.


Нужна помощь в реализации советника, торгующего от горизонтальных уровней цены. Уровни заведомо известны. Советник должен открывать сделки при касании этих уровней.

Уровней много(больше 100), поэтому через оператор if все писать не правильно, как мне кажется.

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

Если сравнивать текущую цену с элементами массива - появляется один нюанс:

Ф-ия ArrayBsearch возвращает индекс первого найденного элемента. Если искомое значение не найдено, то возвращает индекс ближайшего меньшего по значению из элементов, между которыми расположено искомое значение.

Возможно ли сделать так, чтобы ArrayBsearch не возвращала ни какого значения, если текущая цена не соответствует не одному из уровней цены, что хранятся в массиве?

Если я не там копаю, то прошу указать на недочеты и посоветовать, как можно реализовать открытие ордеров от конкретных заданных уровней цены, так, чтобы каждый уровень не писать через if?

Заранее благодарю всех кто откликнется!

Просто переберите в цикле массив, вот как пример:

int Get_ArrayIndex(double price, double &arr[])
{
   int res = -1;
   int size = ArraySize(arr);
   for(int i = size - 1; i >= 0; i--)
   {
      if(price == arr[i])
      {
         res = i;
         break;
      }
   }
   return(res);
}
 

Да, прикол. Такое поведение ArrayBsearch делает функцию просто бесполезной.

Посмотрите на \MQL4\Include\Arrays\ArrayDouble.mqh, там есть CArrayDouble::Search, она делает бинарный поиск. Сам он реализован в CArrayDouble::QuickSearch.

 
После поиска проверить, равно ли найденное значение тому, которое искали.
 
Dmitry Fedoseev:
После поиска проверить, равно ли найденное значение тому, которое искали.

при поиске использовать разность 2-х вещественных чисел вместо сравнения на равенство  https://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (или типы с плавающей точкой) представляют значения, имеющие дробную часть. В языке MQL5 есть два типа для чисел с плавающей точкой. Способ представления вещественных чисел в машинной памяти определен стандартом IEEE 754 и не зависит от платформ, операционных систем и языков программирования. Константы с плавающей точкой...
 
Dmitry Fedoseev:
После поиска проверить, равно ли найденное значение тому, которое искали.

Блин.

)))))

 

@SeriousRacoon @Igor Makanu @Dmitry Fedoseev @Sergey Kolemanov 

Благодарю всех за ответы!

 

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

DeleteOppositeOrders();

void DeleteOppositeOrders() {

  bool fd, fep1, fep2;


  fep1=ExistPosition(1);

  fep2=ExistPosition(2);


  for (int i=OrdersTotal()-1; i>=0; i--) {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

      if (OrderSymbol()==Symbol()) {

        fd=False;

        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()== Magik) {

          if (fep2) fd=OrderDelete(OrderTicket());

        }

        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()== Magik) {

          if (fep1) fd=OrderDelete(OrderTicket());

        }

        if (fd && UseSound) PlaySound(NameFileSound);

      }

    }

  }

}

bool ExistPosition(int mn) {

  bool Exist=False;

  for (int i=0; i<OrdersTotal(); i++) {

    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

      if (OrderSymbol()==Symbol() && OrderMagicNumber()== Magik) {

        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {

          Exist=True; break;

        }

      }

    }

  }

  return(Exist);

}


 
Sergey Kolemanov:

Просто переберите в цикле массив, вот как пример:

Так сравнивать double нельзя )) 

if(price == arr[i])
 

Просветите пожалуйства что нажимать для сохранения результатов оптимизации советника в МТ5, для вставки его в последующем в советник МТ5 на панели графика терминала МТ5 ?

Ищу его доолго, пока в поисках...

СПАСИБО.