Новая версия платформы MetaTrader 5 build 4260: общие улучшения - страница 17

 
Ihor Herasko #:

Много ненужных действий в коде, которые дублируют друг друга. Скорее всего, раньше (когда "работало"), использовался счет типа Netting, а теперь перешли на Hedge. 

Делайте следующим образом:

Проблемой в Вашем коде является строка:

Эта функция не только получает имя символа, но и выбирает новую позицию. В случае с Hedge-счетом будет выбрана вовсе не та позиция, на которую Вы рассчитываете.

В оригинале она была без переменных. Это я в оптимзаторе искал проблему. А так все просто было. Сейчас попробую ваш вариант.

void CountOrders() // функция подсчета рыночных ордеров
  {
   NmbBuy=0;
   NmbSell=0;
   int total=PositionsTotal();
   for(int i=total; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
         if(PositionGetString(POSITION_SYMBOL)==Symbol())
            if(PositionGetInteger(POSITION_MAGIC)==Magic)
              {
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
                  NmbBuy++;
               if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
                  NmbSell++;
              }
     }
  }
 }
 
Ihor Herasko #:

Много ненужных действий в коде, которые дублируют друг друга. Скорее всего, раньше (когда "работало") использовался счет типа Netting, а теперь перешли на Hedge. 

Делайте следующим образом:

Проблемой в Вашем коде является строка:

Эта функция не только получает имя символа, но и выбирает новую позицию. В случае с Hedge-счетом будет выбрана вовсе не та позиция, на которую Вы рассчитываете.

Супер. Спасибо. Ваш вариант заработал. Честно говоря я так и не понял почему перестал мой вариант работать?...

 
Robert Sadamon #:

В оригинале она была без переменных. Это я в оптимзаторе искал проблему. А так все просто было. Сейчас попробую ваш вариант.

 for(int i=total - 1; i>=0; i--)

Исправьте

 
Robert Sadamon #:

Супер. Спасибо. Ваш вариант заработал. Честно говоря я так и не понял почему перестал мой вариант работать?...

Потому что на одной итерации цикла дважды выбиралась позиция (лишняя функция - PositionGetSymbol). В некоторых случаях это будут разные позиции.

 
Robert Sadamon #:

Масло масляное.

if(PositionSelectByTicket(PositionGetTicket(i)))

PositionSelectByTicket здесь лишняя

 
Aleksey Vyazmikin #:

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

Ваш вариант работает, спасибо! чудеса.

 
Robert Sadamon #:
PositionGetSymbol(POSITION_SYMBOL)
string  PositionGetSymbol(
   int  index      // номер в списке позиций
   );
 
Очень неудобно, что в tst-файле нет мс и минимальная градация для всех ордеров секунда. Просьба исправить. Спасибо.
 
Если переключаться между вкладками История, Эксперты и Журнал, то Эксперты и Журнал сохраняют свои позиции (переключился на другую вкладку, вернулся обратно, выделена та же самая строка), а История всё забывает и прокручивается в конец. Просьба исправить. Спасибо.
 
traveller00 #:
Очень неудобно, что в tst-файле нет мс и минимальная градация для всех ордеров секунда. Просьба исправить. Спасибо.

Мне вот хотелось бы, чтоб время открытия/закрытия позиций в tst-файле соответствовало времени открытия/закрытия позиций на торгуемом инструменте.

Разница бывает больше пол минуты, а вам  миллисекунды-с подавай)))

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