[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 347

 

Здравствуйте, вопрос вот в чем. Как в коде написать, чтоб производилась операция только с зафиксированным фракталом?

Если фрактал зафиксирован, то это ....

мой фрактал

int start()
  {
//----
    double CenBuy = High[isFractalUp()];
     double CenSell = Low[isFractalDn()];

   return(0);
}

int isFractalUp()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
 }
 return(-1);
}
 
int isFractalDn()
{
 for(int i=0; i != 10; i++)
 {
 if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
 }
 return(-1);
}
 
hoz:

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

Тогда определяйте факт срабатывания отложки и удаляйте самую отдалённую противоположную.

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

 
Подскажите кто знает. Почему результат тестера в будний день отличается от результатов в выходные? Alpari
 

berezhnuy из-за спреда, в выходной день он в несколько раз больше.

 

Уважаемые программисты, подскажите такую вещь, внизу дан код по подсчёту ордеров для покупок и продаж, чтобы открывался только один ордер на покупку либо продажу:

int CountBuy()
{
int count = 0;
    for(int trade = OrdersTotal()-1; trade >= 0; trade--)
    {
        OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {
           if(OrderType() == OP_BUY)
           count++;    
        }
   
    }
return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;
    for(int trade = OrdersTotal()-1; trade >= 0; trade--)
    {
        OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
        {
           if(OrderType() == OP_SELL)
           count++;    
        }
   
    }
return(count);
}

 И вроде бы всё работает, но в моём советнике, есть условия покупки и продажи по некоторым свечным моделям с использованием TP и SL. Так вот, когда условие выполнено и TP сработал, то в момент формирования 0 свечи условия открытия ордера продолжают быть истинными и тут же окрываются новые ордера, чего делать уже не надо. Поэтому подскажите пожалуйста каким кодом можно запретить дальнейшее открытие ордеров? Сам советник во вложении.  

Файлы:
expert.mq4  4 kb
 
artmedia70:

Тогда определяйте факт срабатывания отложки и удаляйте самую отдалённую противоположную.

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



А если за тик пройдёт больше? Если, скажем так, шаг между отложками очень мал, тогда может сработать больше одной отложки. Есс-но мы не успеем тогда во время выполнить необходимые действия.
 
hoz:

А если за тик пройдёт больше? Если, скажем так, шаг между отложками очень мал, тогда может сработать больше одной отложки. Есс-но мы не успеем тогда во время выполнить необходимые действия.
Цикл по открытым позициям в поиске сработавших ордеров на текущем баре и удаление отложек в том же цикле
 
artmedia70:
Цикл по открытым позициям в поиске сработавших ордеров на текущем баре и удаление отложек в том же цикле


Ну так получает опять цикл, и опять всё снесётся. У меня ж и в варианте который на данный момент есть условие:

 while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }

 Т.е. удалять должно пока не станет ordersToDelete равно нулю. А сносит всё. Вроде всё ж элементарно, а творится беспредел какой-то. В некчемном учебнике вообще про подобные момент нет ничего. Уже и так и сяк крутил, и переписывал по-разному, не фига не работает как нужно.

 

Переписал иначе:

//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket = -1,                                 // Тикет искомого ордера
       np = -1;                                       // Номер позиции искомого ордера
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу

   double OOP = 20.0;                                 // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);               // Если ничего удалять не нужно, выйдем из функции

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          np = i;
      }
   }
   if (OrderSelect(np,SELECT_BY_POS))
   {
      s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
      OrderDelete(s_ticket,Black);
   }
   
   return (0);
}

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

 
почему бы вам не запоминать тикет ордера а не его позицию. а что будет при прямой передаче если такого ордера нет? будете удалять нулевой ордер ?