Как реализовать ограничение количества открываемых ордеров?

 

Здравствуйте! Если не трудно, помогите реализовать ограничение количества открываемых ордеров в следующем коде:


  
         if (AccountMargin()<AccountBalance()*0.1)
         {Lots=AccountBalance()*0.0001;
         if (Lots>5) Lots=5;
         if (Lots>=1 && Lots<=5) Lots=NormalizeDouble(Lots,0);
         if (Lots>=0.5 && Lots<1) Lots=0.5;
         if (Lots>=0.3 && Lots<0.5) Lots=0.3;
         if (Lots>=0.2 && Lots<0.3) Lots=0.2;
         if (Lots<0.2) Lots=0.1;}
 
 
   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-a*Point,Ask+b*Point,NULL,0,0,Red);

и еще, копался на сайте, но так и не нашел. Стратегия торговли, которую пытаюсь перенести в код эксперта, требует, чтобы ордера открывались при открытии нового бара.Тестер пишет, что нужен советник с явным контролем открытия нового бара. Как это реализовать программно? Заранее всем благодарен.

 
 
         if (AccountMargin()<AccountBalance()*0.1)
         {Lots=AccountBalance()*0.0001;
         if (Lots>5) Lots=5;
         if (Lots>=1 && Lots<=5) Lots=NormalizeDouble(Lots,0);
         if (Lots>=0.5 && Lots<1) Lots=0.5;
         if (Lots>=0.3 && Lots<0.5) Lots=0.3;
         if (Lots>=0.2 && Lots<0.3) Lots=0.2;
         if (Lots<0.2) Lots=0.1;}
 
 if (OrdersTotal()<1)
{
   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-a*Point,Ask+b*Point,NULL,0,0,Red);
}
 
Чтобы быльсоветник с контролем открытия  баров нужно написать код в советнике:
static int prevtime = 0;
 
 
 
start()
{
 if(Time[0] == prevtime) 
       return(0);
 prevtime = Time[0];
 
.................
 
}
 
meta-trader2007 писал (а):
Чтобы быльсоветник с контролем открытия баров нужно написать код в советнике:
static int prevtime = 0;
 
 
 
start()
{
 if(Time[0] == prevtime) 
       return(0);
 prevtime = Time[0];
 
.................
 
}



Спасибо огромное!
 

Вот так вроде лучше

//+------------------------------------------------------------------+
//| возвращает true если появлися новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (isNewBar()) EveryBar();
  EveryTick();
//----
   return(0);
  }
//+------------------------------------------------------------------+
я это гдето у Rosha это подсмотрел 
 
Prival:

Вот так вроде лучше

//+------------------------------------------------------------------+
//| возвращает true если появлися новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (isNewBar()) EveryBar();
  EveryTick();
//----
   return(0);
  }
//+------------------------------------------------------------------+
я это гдето у Rosha это подсмотрел 

Чем этот код лучше?
 
Prival:

Вот так вроде лучше

//+------------------------------------------------------------------+
//| возвращает true если появлися новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (isNewBar()) EveryBar();
  EveryTick();
//----
   return(0);
  }
//+------------------------------------------------------------------+
я это гдето у Rosha это подсмотрел 
Здесь условие может сработать еще и из-за подкачки истории, а предыдущий метод точно сработает при открытии нового бара, вне зависимости от изменения истории.
 

Пока не нашел на форуме, может подскажете, как ограничить просто количество ордеров buy и sell. Попробовал поковыряться используя функцию int Terminal (из учебника), но она даже в первоначальном виде не компилируется, не говоря уже о том, как я с ней поковыряюсь...

 
Slim_ekb:

Пока не нашел на форуме, может подскажете, как ограничить просто количество ордеров buy и sell. Попробовал поковыряться используя функцию int Terminal (из учебника), но она даже в первоначальном виде не компилируется, не говоря уже о том, как я с ней поковыряюсь...

extern    int BuyMaxTrades = 10;    // Максимальное количество открытых ордеров Buy
extern    int SellMaxTrades= 10;    // Максимальное количество открытых ордеров Sell

.....

int CountBuy() Находим кол-во ордеров Buy
{
 int count_buy=0;
 for (int i = OrdersTotal()-1; i >=0; i--)   
    {                                                  
     OrderSelect(i,SELECT_BY_POS, MODE_TRADES);       
     if (OrderSymbol()!=Symbol()) continue;   
     if (OrderSymbol()==Symbol() && OrderType()==OP_BUY) 
     if (OrderMagicNumber()==MagicNumber) count_buy++;
    } 
 return(count_buy);
}
.....

 if (CountBuy() < BuyMaxTrades) .... проверяем действительно ли кол-во открытых Buy меньше максимального...
.......

 
TEXX:
Возможно идет речь об ограничении количества ордеров за день (такие ограничения часто у ДЦ встречал), тогда нужно еще проверять количество ордеров по истории.
 
TEXX:


Спасибо огромное, попробую


VladislavVG:
Возможно идет речь об ограничении количества ордеров за день (такие ограничения часто у ДЦ встречал), тогда нужно еще проверять количество ордеров по истории.


Дело в том, что мои познания в программировании, мягко говоря, ничтожны, читаю учебник и пробую сразу на практике... Поэтому, такую тривиальную задачу и не смог осилить, а в учебнике не нашел решения :-( Речь шла именно об ограничении количества одновременно открытых ордеров