Подсчет ордеров - страница 2

 
berezhnuy:

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

У меня в советнике выставляются отложеные ордера Sell & Buy

Следующими функциями я контролирую количество ордеров отдельно для се и для бай (замысел)

но сравнивается с общим количеством ордеров ( k=OrdersTotal())

как получить количество ордеров, отдельно для селл и бай

Не нужно для этого иметь 2 функции. Для этого достаточно при вызове функции подсчёта количества ордеров указать тип операции. Я имею ввиду если используется функция KimIV.
 
Мне нужно чтобы и бай и сел могли существовать одновременно, но чтоб небыло более одного бая и более одного села, если можете помоч, подскажите кодом плиз, я так не сильно понимаю.
 
berezhnuy:
Мне нужно чтобы и бай и сел могли существовать одновременно, но чтоб небыло более одного бая и более одного села, если можете помоч, подскажите кодом плиз, я так не сильно понимаю.

При открытии ордеров используйте условие:

if(!ExistOrders("0", OP_BUYSTOP, MagicNumber,0))
  {
   if(условия по наличию сигналов и прочие)
     {
      открытие OP_BUYSTOP;
     }
  }
if(!ExistOrders("0", OP_SELLSTOP, MagicNumber,0))
  {
    if(условия по наличию сигналов и прочие)
     {
      открытие OP_SELLSTOP;
     }
  }

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

 

Благодарю, ща попробую разобраться.

p.s. мой советник в основном построен на его функциях, просто не во всех еще разобрался. 

 

Не помогло(( ордера контролит, но одновременно не выставляет бай и сел стопы, ставит либо тот либо тот(

Есть соображения? 

 
berezhnuy:

Не помогло(( ордера контролит, но одновременно не выставляет бай и сел стопы, ставит либо тот либо тот(

Есть соображения?

Выложите полный код - тогда появятся соображения.
 

extern int     Magic=5675;
extern int     Orders =1;
extern int     StopLoss=0;
extern int     TakeProfit=0;
extern string     ______= "Параметры блока MoneyManagement";
extern double    Lots = 0.1;
extern bool      MoneyManagement=false;
extern int       MarginPercent=3;
extern int       TrailingStop=50;

//----------------------------------
double SL,TP;
int ticket;
double lots;
static int prevtime = 0;
//-- Подключаемые модули --
#include <stderror.mqh>
#include <stdlib.mqh>
//+=================================================================================+
//| expert initialization function                                                  |
//+=================================================================================+
int init()
  {
//----
   
//----
   return(0);
  }
//+=================================================================================+
//| expert deinitialization function                                                |
//+=================================================================================+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+=================================================================================+
//| expert start function                                                           |
//+=================================================================================+
int start()
  { 
if (Time[0] == prevtime) return(0); // Бар прежний, а следовательно выходим
   prevtime = Time[0]; // Свежий бар, запоминаем время
//+=================================================================================+
// Объявляем переменные
int total, cnt;
int err;
  total=OrdersTotal();
Comment( LotsCounting() );
//+=================================================================================+
  // Проверка средств
  if(AccountFreeMargin()<(1000*Lots))
     {
       Print("We have no money. Free Margin = ", AccountFreeMargin());   
       return(0);  
     }
//===========================  Открытие позиций  ===================================+  
if(!ExistOrders("0", OP_SELLSTOP, Magic,0))
  {
//+=================================================================================+
// Проверка условий для совершения сделки селл 
if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELLSTOP, Magic)  ==0) //запрет неск. поз на одном баре 
{
if( Условие )
       {
     SL=0;TP=0;
      if(StopLoss>0)   SL=Bid+Point*StopLoss;
      if(TakeProfit>0) TP=Bid-Point*TakeProfit;
      lots=LotsCounting(); 
   ticket=OrderSend(Symbol(),OP_SELLSTOP,lots,p2,3,SL,TP,"Продаем- тра-ля-ля",Magic,0,Red);
   if(ticket < 0)
   {
            Print("Ошибка открытия ордера SELL #", GetLastError()); 
            Sleep(10000);  
            prevtime = Time[1]; 
            return (0); 
         } 
       }
     }
   }
//+=================================================================================+
if(!ExistOrders("0", OP_BUYSTOP, Magic,0))
  {

//+=================================================================================+
  // Проверка условий для совершения сделки бай
if (! NumberOfBarOpenLastPos(NULL, 0,OP_BUYSTOP, Magic)  ==0) 
{ //запрет неск. поз на одном баре
if( Условие )
       {
      SL=0;TP=0;
      if(StopLoss>0)   SL=Ask-Point*StopLoss;
      if(TakeProfit>0) TP=Ask+Point*TakeProfit;
      lots=LotsCounting();    
   ticket=OrderSend(Symbol(),OP_BUYSTOP,lots,p2,3,SL,TP,"Покупаем- хи-хи ",Magic,0,Green);
   if(ticket < 0) 
   {
            Print("Ошибка открытия ордера BUY #", GetLastError()); 
            Sleep(10000); 
            prevtime = Time[1]; 
            return (0);
         } 
       }
     }
//+=================================================================================+
 }    //если  открытых позиций менее Orders 
//======================== конец блока открытия позиций ============================+
 
//+=================================================================================+
//+================================= TrailingStop ==================================+
if(OrderType() == OP_SELL)
   {
if((OrderOpenPrice()-Ask) > (Point*TrailingStop))///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
      { 
if((OrderStopLoss() > (Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
         {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
         }
      }
   }
//+=================================================================================+
if(OrderType() == OP_BUY)
   {
if((Bid-OrderOpenPrice()) > (Point*TrailingStop))///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
      { ///ПОСЛЕ ЭТОГО УСЛОВИЯ НЕ ПРОХОДИТ!!!
if(OrderStopLoss() < Bid-Point*TrailingStop || (OrderStopLoss()==0))
         {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);  
         }
      }
   }
  return(0);
  }
double LotsCounting() 
{ 
double lots=Lots;
   if (MoneyManagement)      
   {
      double lotsize=MarketInfo(Symbol(),MODE_LOTSIZE);
      double freemargin=AccountFreeMargin();
      lots=0; if (lotsize>0) lots=NormalizeDouble((MarginPercent*freemargin/lotsize),2);
      Comment(NormalizeDouble((MarginPercent*freemargin/lotsize),2));    
      }
   if (lots>5) lots=4.9; if (lots<0.1) lots=0.1;return (lots);   
   }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.03.2008                                                     |
//|  Описание : Возвращает флаг существования ордеров.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время установки)          |
//+----------------------------------------------------------------------------+
bool ExistOrders(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal(), ty;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ty=OrderType();
      if (ty>1 && ty<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ty==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (ot<=OrderOpenTime()) return(True);
          }
        }
      }
    }
  }
  return(False);
}
//+=================================================================================+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1)
 {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++) 
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
    {
      if (OrderSymbol()==sy)
       {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL)
         {
          if (op<0 || OrderType()==op)
           {
            if (mn<0 || OrderMagicNumber()==mn)
             {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(iBarShift(sy, tf, t, True));
}
 
berezhnuy:

Сомневаюсь в такой конструкции:

if (! NumberOfBarOpenLastPos(NULL, 0,OP_BUYSTOP, Magic)  ==0)

Правильно так:
if (NumberOfBarOpenLastPos(NULL, 0,OP_BUYSTOP, Magic) !=0)
    
 

Это условие работает коректно.

Мне нужно чтобы все что касается Бай происходило независимо от всего что касается селл.

 
berezhnuy:

Это условие работает коректно.

Мне нужно чтобы все что касается Бай происходило независимо от всего что касается селл.

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

if (! NumberOfBarOpenLastPos(NULL, 0,OP_SELLSTOP, Magic)  ==0) //запрет неск. поз на одном баре 

if (! NumberOfBarOpenLastPos(NULL, 0,OP_BUYSTOP, Magic)  ==0) 
Причина обращения: