Помогите начинающему кодеру.

 

Добрый день форумчане.

Пробую себя в експертописательстве.

Не могу сделать проверку при открытии сделки, на существование сделки с такой же ценой открытия. На сколько понял для меня ключевым является openeorderprice() И ordertype().

Нашел на форуме такой код:

//+------------------------------------------------------------------+
//| подготавливает масссив наших ордеров                             |
//+------------------------------------------------------------------+
void PrepareTickets(double & arrayTickets[][9], string & comm[][2],int MN)
   {
   int count=0;   // счетчик заполнения
   
   // сделаем размер массива побольше, чтобы не выделять память каждый раз
   ArrayResize(arrayTickets,20);
//----
   int total=OrdersTotal();
   for (int i=0;i<total;i++)
      {
      bool ourTicket=false;
      if (OrderSelect(i,SELECT_BY_POS))
         {
         if (isOurOrder(!OrderTicket()))
            {// если специальная функция не опознала ордер
            // то устроим обычные проверки

            // проверка на Symbol
            if (OrderSymbol()!= Symbol()) continue;
         
            //  еще проверки...
            // ....
         
            // последняя проверка MagicNumber
            if (OrderMagicNumber()!=ExpertMagicNumber) continue;
         
            }
         // нас нигде не остановили, значит это наш ордер
         //  заполняем массив
         arrayTickets[count][0] = OrderTicket();
         arrayTickets[count][1] = OrderType();
         arrayTickets[count][2] = OrderLots();
         arrayTickets[count][3] = OrderOpenPrice();
         arrayTickets[count][4] = OrderStopLoss();
         arrayTickets[count][5] = OrderTakeProfit();
         arrayTickets[count][6] = OrderMagicNumber();
         arrayTickets[count][7] = OrderExpiration();
         arrayTickets[count][8] = OrderOpenTime();

         comm[count][0] = OrderSymbol();
         comm[count][1] = OrderComment();
         // увеличим счетчик наших заполненных ордеров
         count++;
         }
      }
   
   // а теперь усечем размер массивов до миним. необходимого 
   ArrayResize(arrayTickets,count);
   //ArrayResize(comm,count);

//----
   return;   
   }

Вроде бы с ним разобрался. Но как перед заключением сделки обращаться к массиву данных?

Я вижу логику исполнения программы так:

1) получен торговый сигнал

2) проверка на отсутвие таких же позиций

а) нет таких. заключение сделки.

б) есть такие. обнуление сигнала.

3) добваление новой информации с массив.



Работать будет только с рынком. Никакх отложенных ордеров. Одновременное количество сделок может быть весьма большим...

 

Как начинающему кодеру советую внимательно прочесть вот эту ветку: https://www.mql5.com/ru/forum/107476.

На многие вопросы найдете ответы, в том числе и на тот, который здесь задали.

 
choleric >>:

Не могу сделать проверку при открытии сделки, на существование сделки с такой же ценой открытия. На сколько понял для меня ключевым является openeorderprice() И ordertype(). 

Нашел на форуме такой код:

Вроде бы с ним разобрался. Но как перед заключением сделки обращаться к массиву данных?

Я вижу логику исполнения программы так:

1) получен торговый сигнал

2) проверка на отсутвие таких же позиций

а) нет таких. заключение сделки.

б) есть такие. обнуление сигнала.

3) добваление новой информации с массив.



Работать будет только с рынком. Никакх отложенных ордеров. Одновременное количество сделок может быть весьма большим...


  А зачем вы проверяете на существование позиций с такой же ценой открытия? И стоит ли при "первой пробе" сразу связываться с массивами?

А если уже открытые есть позиции, но их цена открытия отличается от заданной на 1-2 пипса? Да ещё и ваша тож откроется рядышком...

Наверное, логичнее проверить "на отсутвие таких же позиций" проще, используя готовую ф-ю (по ссылке выше):

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                  |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++)                                    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()==sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op)                   {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }}}}}  return(kp); }

 Иначе говоря, задаем условие: 

if ( NumberOfPositions(NULL, OP_BUY, MagicNumber ) <1 ) { 

//если нет открытых бай-позиций с заданным магиком, то продолжаем ..

//-----------------------

Но если вам важна именно цена открытия, то могу рекомендовать ф-и:

Функция PriceOpenLastPos(). Стр.24

Эта функция возвращает цену открытия последней открытой позиций.

 

Функция DistMarketAndPos(). Стр.15

 которая возвращает расстояние в пунктах между рынком и ближайшей позицей

 

 

Функция ExistOPNearMarket(). Стр.16 

Данная функция возвращает флаг существования ордера или позиции около рынка (на заданном расстоянии в пунктах от рынка).

 

Используя эти функции, - достаточно легко построить простейший гридер. 

 

 

 

 

спасибо огромное. понял что и как работает теперь.

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