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

 
LBatters:

Всем привет) 

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

Тут советник в котором эта функция должна работать)

138 - "Запрошенная цена устарела, либо перепутаны bid и ask."

Цену открытия/закрытия невозможно пересчитать, т.к. она есть, а тут - беда (нужно цену запросить и присовить ей значение с помощью MarketInfo, а эту переназвать другой переменной):

                 PriceCl    = NormalizeDouble((takeprofit + OrderOpenPrice())/t,Digits);  //примерную цену закрытия
                 order = OrderTicket();    //получили ордер
                 if(Bid>PriceCl) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order,NormalizeDouble(lot*percent/100,2),PriceCl,3);}
 
7Konstantin7:

Всем здравствуйте.

Пытаюсь дополнить простой советник-трал Кима, что бы после закрытия всех рыночных ордеров он удалял отложенные ордера, не выходит(

вставил функцию удаления ордеров:

 Дальше столкнулся с проблемой которую мне вряд ли осилить, в кодах не силен.

полагаю нужно написать условие типа:

это просто пример из другого советника 


 Помогите пожалуйста.

Костя, заделай цикл расчета количества ордеров по необходимым типам, затем удаляй как хочешь, не мудри.
 
_new-rena:
Костя, заделай цикл расчета количества ордеров по необходимым типам, затем удаляй как хочешь, не мудри.

Я в кодах нуб) я туда еще добавил отложки может поможет)

  if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7:

Я в кодах нуб) я туда еще добавил отложки может поможет)

Выделенное не беда. Беда в том, что прежде чем добавить отложки надо было подумать "А что это даст???" А ничего не даст... и есть-ли смысл это добавлять???

А в остальном я не разбирался, я пьян и коды Кима не уважаю... звиняйте...

 
AlexeyVik:

Выделенное не беда. Беда в том, что прежде чем добавить отложки надо было подумать "А что это даст???" А ничего не даст... и есть-ли смысл это добавлять???

А в остальном я не разбирался, я пьян и коды Кима не уважаю... звиняйте...

Ничего не дало) я так и думал, надо писать условие, сижу думаю.

Да коды не для реалов у него) по крайней мере бесплатные, про платные не в курсе.

 
7Konstantin7:

Ничего не дало) я так и думал, надо писать условие, сижу думаю.

Да коды не для реалов у него) по крайней мере бесплатные, про платные не в курсе.

для реала, в каждом отдельном ДЦ свой код, поэтому универсального не придумать.. сначала главно чтобы хоть на демке заработало.

 

Проблему решил) долго думал) всем спасибо.

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
    if (DeleteOrders) DeleteOrders();
  }
 

Всем привет!

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

Если на 4-х знаке у нас спред фиксированный, то проблем по закрытию не возникает и при использовании функции 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("ордер успешно закрыт.");   
           
       }
   }
}  
 

 

Подскажите пожалуйста как закрыть ордера в порядке как они были открыты.

хочу переделать эту функцию:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7:

 

Подскажите пожалуйста как закрыть ордера в порядке как они были открыты.

хочу переделать эту функцию:

Ответ же сам напрашивается. Отсортировать открытые позиции по времени их открытия. И далее закрывать их по списку из отсортированного массива.
Причина обращения: