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

 
hoz:

Повторю вопрос, который задавал вчера. Не хочется выносить отдельной веткой. Если что не понятно, отвечу на все вопросы.

У меня тут продолжается стопор с закрытием требуемых позиций. Суть такая:

1. Отслеживается закрытие позиций.

2. Как только закрылась последняя позиция по тейку... требуется закрыть все открытые и отложенные позиции сразу. Закрывается всё отсортировано по лотам т.е. сразу большие лоты, а дальше меньшие. Ситуация сугубо для набраться опыта работы с ордерами.

Реализация такая:

в start() на каждом тике:

На интересует закрытие рыночных ордеров, т.к. отложенный удаляется как требуется. Вот что имеем:

Почему-то не закрывается часть ордеров. Принтую некоторые сегменты когда, не чего не понятно. Вот например:

В коменте видно, что lastOOTHist = 01:30:00, хотя, на самом деле, это не есть верно. Ведь последние закрытые ордера, если прогортать в окне результы увидим вот что:

их время закрытия другие...

Что здесь не так?

Что-то всё в кучу свалили...

вот тут:

for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES)) // выделенное красным лишнее, тут pool не имеет значения
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }

Распринтуйте перед циклом значение всех ячеек массива - мож там собачка роется?

 
Forexman77:
Подскажите, как узнать размер спреда, в момент открытия сделки, а лучше, чтобы он отображался в журнале?

Сразу после открытия сделки:

ticket=OrderSend(......);
if(ticket>=0)Print("ticket #",ticket," Spread=",doubleToStr(Ask-Bid,Digits)); 
Ваш спрэд в журнале.
 
Sepulca:

Сразу после открытия сделки:

Ваш спрэд в журнале.



Спасибо, Вам огромное! Сделал советника, на тестере он зарабатывает, на демо хуже. На реале, наверное, еще хуже будет. Система импульсная ловит быстрые скачки, но большой спред ее убивает.

Сколько не следил визуально за спредом, больше трех пипсов не видел. Есть предположение, что в моменты сильных движений, он вообще не отображается, или расширяется, что не успеваешь заметить.

В Альпари низкий спред, но предполагаю, что он значительно увеличивается при сильных движениях. В ДукасКопи спред еще меньше, но большие коммисионные, они становятся меньше, если счет несколько миллионов долларов.

Проводили ли Вы, какие исследования по размеру спреда, при движениях свыше 50 пунктов за минуту? До какой величины среднестатистически возрастает спред при данных движениях?

В Альпари спрашивал, не сказали.

 
FAQ:


При передаче переменной (массива) в функцию по значению, внутри функции создается локальная переменная, которую вы и объявляете в заголовке : MyFunct(int my_var). Таким образом изменения этой переменной не могут быть видны вне функции. А в случае с массивом вам об этом напомнит компилятор.

Если вы хотите что бы изменения значения переменной были видны снаружи (вне функции), то передавайте переменные по ссылке : MyFunct(int & my_var)


Хотя да. Ведь массив тока объявлен глобально. Но изменение внутри функции - локально.. Потому и есть функции, как микроструктуры. Чтобы локально реализовывать микрозадачи.
 

Всем доброго профита! Подскажите пожалуйста - не могу разобраться как сделать чтоб OrderOpenPrice() возвращал цену с пятью знаками после запятой. Если в терминале 4 знака возвращает четко, если 5, то все равно возвращает 4, округляя пятый.

 
ivan180976:

Всем доброго профита! Подскажите пожалуйста - не могу разобраться как сделать чтоб OrderOpenPrice() возвращал цену с пятью знаками после запятой. Если в терминале 4 знака возвращает четко, если 5, то все равно возвращает 4, округляя пятый.


DoubleToStr(число, точность)
 

Forexman77:
Forexman77:



Спасибо, Вам огромное! Сделал советника, на тестере он зарабатывает, на демо хуже. На реале, наверное, еще хуже будет. Система импульсная ловит быстрые скачки, но большой спред ее убивает.

Сколько не следил визуально за спредом, больше трех пипсов не видел. Есть предположение, что в моменты сильных движений, он вообще не отображается, или расширяется, что не успеваешь заметить.

В Альпари низкий спред, но предполагаю, что он значительно увеличивается при сильных движениях. В ДукасКопи спред еще меньше, но большие коммисионные, они становятся меньше, если счет несколько миллионов долларов.

Проводили ли Вы, какие исследования по размеру спреда, при движениях свыше 50 пунктов за минуту? До какой величины среднестатистически возрастает спред при данных движениях?

В Альпари спрашивал, не сказали.


По поводу спреда как раз в пятницу анализировал, кстати как раз на Альпари:

Тонкие желтые - максимальный спред за бар (использовал минутки). Жирные красные- минимальный спред за бар. Как видно что в течении дня спред колеблится от 5 до 14 пунктов пятизнака. Но после 21:00 серверного времени спред не опускается ниже 10 пунктов, а в конце дня вообще подымается до 52 пунктов. Поймал интересный момент перед резким изменением цены спрэд резко возрастает:

 
artmedia70:

Что-то всё в кучу свалили...

вот тут:

for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES)) // выделенное красным лишнее, тут pool не имеет значения
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }

Это я просто для удобства восприятие указал. Когда писал, а так да, не обязательно указывать. Но мешать то тоже не будет.

Так вообще не выводит никаких значений массива:

artmedia70:

Распринтуйте перед циклом значение всех ячеек массива - мож там собачка роется?



//+-------------------------------------------------------------------------------------+
//| Закрытие ордеров, отсортированных по размеру лотов                                  |
//+-------------------------------------------------------------------------------------+
void ClosePosBySortLots()
{
   double a[][2];
   int p = 0;
   
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderType() < 2)
      {
         p++;
         ArrayResize(a, p);
         a[p-1][0] = OrderLots();
         a[p-1][1] = OrderTicket();
      }
   }
//   pr ("ClosePosBySortLots(): " + "p = " + p);
   if (p > 0)
   {
      ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
      
      for(i=0; i<=p; i++)
      {
          pr("a[i][1] = " + a[i][1]);
          i++;
      }
      
      for(i=0; i<p; i++)
      {
         if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
         {
             if (OrderCloseTime() == 0) ClosePosBySelect();
         }
      }
   }
}

На выводе пусто вообще..

 
hoz:

Так вообще не выводит никаких значений массива:


На выводе пусто вообще..

Ну как пусто? Вообще ничего не выводит, или всё-таки в ячейках массива нули?
 

А зачем i увеличиваете в теле цикла?

 for(i=0; i<=p; i++)
      {
          pr("a[i][1] = " + a[i][1]);
          i++;    // ??????????????????????????????????????
      }

и вот это: i<=p, зачем "или равно" ?

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