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

 
hoz:

То что тут массив будет предпочтительнее я уже понял)) А в том варианте, что я выше описал есть неточность?(Сугубо ради интереса. Вроде уже всё чётко же)

Что-то в этом роде я имел ввиду. Так... направление куда мыслить...

int i_magic=123;
int OrdersMassive[7];
//+----------------------------------------------------------------------------+
int start() {
   FindOrders(OrdersMassive);
   int i, num=0;
   for (i=0; i<=7; i++) {
      Print("Количество "+GetNameOP(i)+" = "+OrdersMassive[i]);
      num+=OrdersMassive[i];
      }
   Print("Всего ордеров = "+(num-OrdersMassive[6]));
   return(0);
}
//+----------------------------------------------------------------------------+
void FindOrders(int &mass[]) {
   int i, t, k=OrdersTotal()-1;
   ArrayInitialize(mass,0);
   for (i=k; i>=0; i--) {
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderMagicNumber()!=i_magic)    continue;
      if (OrderSymbol()!=Symbol())        continue;
      t=OrderType();
      mass[t]=mass[t]+1;
      }
}   
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
   switch (op) {
      case OP_BUY      : return("Buy");
      case OP_SELL     : return("Sell");
      case OP_BUYLIMIT : return("Buy Limit");
      case OP_SELLLIMIT: return("Sell Limit");
      case OP_BUYSTOP  : return("Buy Stop");
      case OP_SELLSTOP : return("Sell Stop");
      case 6           : return("Неторговое изменение баланса");
      default          : return("Не знаю, чё за тип такой...");
   }
}
//+----------------------------------------------------------------------------+

А что там у вас я сильно не разглядывал...

 
r772ra:

Может так

В моём варианте ф-ция покороче будет ... :)

//+----------------------------------------------------------------------------+
void FindOrders(int &mass[]) {
   int i, t, k=OrdersTotal()-1;
   ArrayInitialize(mass,0);   
   for (i=k; i>=0; i--) {
      if (!OrderSelect(i,SELECT_BY_POS))  continue;
      if (OrderMagicNumber()!=i_magic)    continue;
      if (OrderSymbol()!=Symbol())        continue;
      t=OrderType();
      mass[t]=mass[t]+1;
      }
}   
//+----------------------------------------------------------------------------+
 
r772ra:

Может так

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders(int& t, int& p)
{
   t = 0;
   p = 0;
 
   for (int i=OrdersTotal() - 1; i>=0; i--)
      {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderType() > 1 && OrderType() < 6)   p++;
      if (OrderType() < 6)  t++;
       }
  pr ("FindOrders(): " + "t = " + t);
  pr ("FindOrders(): " + "p = " + p);
}

Тоже не пашет. У меня там был недочёт. Вот так вот сейчас:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
void FindOrders(int& t, int& p)
{
   t = 0;
   p = 0;
 
   for (int i=OrdersTotal() - 1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderType() > 1 && OrderType() < 6)
      {
          p++;
      }
      if (OrderType() < 6)
          t++;
      else 
      {
         pr("Позиций в рвнке нет!");
      }
      
      pr ("FindOrders(): " + "t = " + t);
      pr ("FindOrders(): " + "p = " + p);
   }
}

Когда в рынке ордеров нет ни каких, счётчики не бывают нулевыми. Хрень полнейшая. Что тут не так хз. Буду смотреть что Артём написал.

 
hoz:

Тоже не пашет. У меня там был недочёт. Вот так вот сейчас:

Когда в рынке ордеров нет ни каких, счётчики не бывают нулевыми. Хрень полнейшая. Что тут не так хз. Буду смотреть что Артём написал.


Выведи из цикла вот это

pr ("FindOrders(): " + "t = " + t);
pr ("FindOrders(): " + "p = " + p);
Я так понимаю это вывод информации.
 
r772ra:


Выведи из цикла вот это

Я так понимаю это вывод информации.


Точно. Что ж со мной стало. Какие-то ошибки глупые. Месяц в С++ капался. Теперь уже в мкл косяки такие глупые бывают. Видать мозг закипел совсем уже :(
 
А вообще, поиск ордеров на каждом тике это нормально? Или лучше на каждом баре выполнять? Я меня до пор не уложилось в голове, что лучше в одном случает, а что в другом.
 
hoz:
А вообще, поиск ордеров на каждом тике это нормально? Или лучше на каждом баре выполнять? Я меня до пор не уложилось в голове, что лучше в одном случает, а что в другом.
А если какая-то позиция закроется внутри бара при отслеживании по открытию бара, то советник до открытия следующего бара об изменении количества позиций не узнает.
 
hoz:


t - это кол-во всех ордеров.

p - кол-во отложек

Если условие:

истинно, то увеличивается и t и p т.к. любой ордер типа от 2 до 5 это как отложка так и вообще ордер. А значит нада увеличить оба счётчика. А если истинно условие:

Тогда отложки уже нет, но есть ордер рыночный. Значит увеличим тока счётчик t т.е. счётчик общего кол-ва ордеров.

Ну а если ничего нет, значит принтуем, что ордеров нет...


t = OrdersTotal();

зачем считать???? посчитанное???

 

Здравствуйте! Ищу ошибки в этой ф-ии.

По идее не открывшиеся отложенные ордера должны удаляться через два дня после их выставления.

min=1440;

if(OrdersTotal()<1)
{return;
 }
  for(int i=OrdersTotal()-1;i>=0;i--)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol())
       {
        if(OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
        {
          if(TimeCurrent()-OrderOpenTime()>min)            
            {
            OrderDelete(OrderTicket());
          return;
          }
        }
      }
    }
return;}
 
pako:



Спасибо, pako.