[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 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);
}

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

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