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

 
7Konstantin7:

Спасибо, мне не осилить, просто думал может кто черкнет пару строк в той функций или мог бы сова скинуть, конечная версия. Вроде не сложно, но все равно вряд ли кто то поможет.

Есть 4 кредита на сайте mql5 мог бы отдать) если там можно перечислять между участниками. 

1. Найти самую раннюю открытую позицию можете в цикле и вернуть её тикет?

 
artmedia70:

1. Найти самую раннюю открытую позицию можете в цикле и вернуть её тикет?

Не представляю как это будет в коде) но каким то чудом я смог добавить в советник удаление отложенных ордеров, я в кодах не силен, только немного.
 
7Konstantin7:
Не представляю как это будет в коде) но каким то чудом я смог добавить в советник удаление отложенных ордеров, я в кодах не силен, только немного.

Да просто возьми и проверь как будет закрывать в цикле

1:

int i, total = OrdersTotal(); bool rez;

for(i = total-1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS) && другие нужные условия)
{
if(OrderType() < 2)
rez = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 40);
if(OrderType() > 1)
rez = OrderDelete(OrderTicket());
}
}

2:

//Всё тоже самое только поменяй направление цикла
for(i = 0; i < total; i++)
тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.
 
AlexeyVik:

Да просто возьми и проверь как будет закрывать в цикле

1:

2:

тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.
Да уже вродь в личке порешили проблему...
 
artmedia70:
Да уже вродь в личке порешили проблему...
Ну так я-то не читаю вашу личку... и не в курсе происходящего.
 
AlexeyVik:
Ну так я-то не читаю вашу личку... и не в курсе происходящего.
Ага, не читает он... А тапочки мои куда пропали???!!! ;)
 
artmedia70:
Ага, не читает он... А тапочки мои куда пропали???!!! ;)

Помнишь что перечислял Иоан Васильевич что брал, а Шпака не брал... Так и я твои тапочки.


пока. Спать пойду.

 
AlexeyVik:

Помнишь что перечислял Иоан Васильевич что брал, а Шпака не брал... Так и я твои тапочки.


пока. Спать пойду.

Пойду тогда у других спрошу про тапки... Спокойной...
 
AlexeyVik:

Да просто возьми и проверь как будет закрывать в цикле

1:

2:

тогда поймёшь в какой последовательности ордера закрываются. Сказать не могу, потому как не проверял. Без надобности. Но есть причины чтобы цикл организовывать как в первом варианте. но это другая тема, она здесь неоднократно обсуждалась и повторять всё это у меня нет желания.

Спасибо, уже решили проблему.

artmedia70:

Я думал пошлют в жобу) Благодарю за помощь.

 

Всем привет! Уже задавал подобный вопрос на стр 711, к сожалению, никто не откликнулся, может сейчас кто...

Столкнулся с проблемой по закрытию встречных ордеров на пятизнаке. Суть в следующем мне нужно закрыть при достижении суммарного профита, скажем  20 ордеров в бай и 33 ордера в сел. При этом 20 ордеров в бай и 20 ордеров в селл я хочу закрыть через функцию OrderCloseBy(), остальные 13 ордеров в селл закрываю через функцию OrderClose(). 

Если на 4-х знаке у нас спред фиксированный, то проблем по закрытию не возникает и при использовании функции OrderCloseBy() мы экономим спред. На пятизнаке же спред плавающий, именно поэтому,я думаю, при достижении суммарного профита ордера не закрываются, а в журнале ругается на OrderCloseBy(). При этом, если прогнать в тестере, то все закрывается нормально.

Ордера в одном направлении при достижении суммарного профита закрывает без проблем.

Кто сталкивался с такой проблемой, каковы варианты ее решения.

Привожу функции закрытия ордеров.

Да и еще, работает ли вообще функция OrderCloseBy() на пятизнаке.

  //-----------------------------------------------------------------------
  // функция подсчета открытых ордеров
  //-----------------------------------------------------------------------

  void OrderOpen()
   {
     Orders_BUY=0; Orders_SELL=0;
     for(int a=0; a<=OrdersTotal(); a++)
     {
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+1;
      if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+1;

      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
      //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
  //-----------------------------------------------------------------------
  // функция закрытия ордеров сначала разнонаправленных
  //-----------------------------------------------------------------------
  void ClosePos()
   {
   int ticket_1=0, ticket_2=0;
    
     for (int a=0; a<=OrdersTotal(); a++)
       {
         if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) == true) 
            {
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                if(OrderType() == OP_BUY) ticket_1 = OrderTicket();
                if(OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
      if(ticket_1 != 0 && ticket_2 != 0) {          // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2,clrRed); }   // закроем их
       
      if(ticket_1 == 0 && ticket_2 != 0) {  CloseOrder_by_type(OP_SELL,Symbol());  }
      if(ticket_1 != 0 && ticket_2 == 0) {  CloseOrder_by_type(OP_BUY,Symbol());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type(int type, string sym)
{
   for(int k= OrdersTotal()-1;k>=0;k--)
   {
    
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
       {
           
      if(type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if(OrderType()<=1){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),350);}
         else { res = OrderDelete(OrderTicket());}
         if(!res)
               Print("Ошибка закрытия ордера. Код ошибки=",GetLastError());
            else
               Print("ордер успешно закрыт.");   
           
       }
   }
}