Функция на покупку - страница 2

 
Sergey Gritsay:
да верно

Если я на правильном пути то я должен добавить еще одну функцию:

if ( CountTrades () < 11)
{

OrderSend ()
}

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

я понимаю что моя функция состоит из нескольких функций, вначале я должен подсчитать ордера на продажу, потом ордера на покупку, и если чего-то окажется меньше чем в моем условии тогда будут открываться ордера либо на покупку либо на продажу. Если я правильно понимаю значение функции  CountTrades (), то она отвечает за общее количество открытых в данный момент ордеров как Buy так и Sell ордеров, а мне нужно отдельно для Buy и отдельно для Sell ордеров

предположу что для ордеров на покупку это будет выглядеть примерно так:

  int CountBuyLimit(int otype = OP_BUYLIMIT)
{
   int count =0;     // обнуляем переменную
  
  
   for(int i = OrdersTotal() - 1; i <= 0; i++)          //    перебор открытых и отложеных ордеров
   {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)   // если получилось выбрать ордер
       {
           if(OrderSymbol() == Symbol() && OrderType() == otype && OrderMagicNumber() == Magic)  // проверяем наш ли ордер
           {
          
            
             count++; // плюсуем наши ордера
            
           }
       }
   }
   return(count);
}

а для ордеров на продажу вот так:

 
 

 
Fizkulitprivet:

Если я на правильном пути то я должен добавить еще одну функцию:

if ( CountTrades () < 11)
{

OrderSend ()
}

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

я понимаю что моя функция состоит из нескольких функций, вначале я должен подсчитать ордера на продажу, потом ордера на покупку, и если чего-то окажется меньше чем в моем условии тогда будут открываться ордера либо на покупку либо на продажу. Если я правильно понимаю значение функции  CountTrades (), то она отвечает за общее количество открытых в данный момент ордеров как Buy так и Sell ордеров, а мне нужно отдельно для Buy и отдельно для Sell ордеров

Передавайте в функцию при запросе тип нужного ордера.

CountTrades(OP_BUY)
CountTrades(OP_SELL)
 
Vladimir Zubov:

Передавайте в функцию при запросе тип нужного ордера.

CountTrades(OP_BUY)
CountTrades(OP_SELL)

if (CountTrades(OP_BUY)< 10 )
{
OrderSend (на покупку)
}
if (CountTrades(OP_SELL)< 1 )
{
OrderSend (на продажу)
}

а полностью будет выглядеть так:

//*************************************************************

//-----------------------глобальные переменные------------------------------------

extern int Magic =123;
extern
extern
extern

//**************************************************************

void OnTick()


//-----------------------функция ордеров на покупку------------------------------------
if (CountTrades(OP_BUY)< 10 )
{
OrderSend (на покупку)
return (0); 
}


//---------------------------------------------------------
//-----------------------функция ордеров на продажу------------------------------------
if (CountTrades(OP_SELL)< 1 )
{
OrderSend (на продажу)
}

return (0); 


//--------------------------------------------------------- 

}

//*************************************************************** 


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

int CountTrades(int otype,)
{
   int count =0;     // обнуляем переменную
  
   for(int i = OrdersTotal() - 1; i >= 0; i--)          //    перебор открытых и отложеных ордеров
   {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)   // если получилось выбрать ордер
       {
           if(OrderSymbol() == Symbol() && OrderType() == otype && OrderMagicNumber() == Magic)  // проверяем наш ли ордер
           {
             count++; // плюсуем наши ордера
           }
       }
   }
   return(count);
}

//---------------------------------------------------------


 

 
Fizkulitprivet:

Пытаюсь написать первый советник, необходимо написать функцию,  условие такое:

Если ордеров на продажу равно 1, а ордеров на покупку меньше 10 ,

то выставляем один стоповый ордер (buy limit)  на покупку  на (n- пунктов от реальной цены)  

Вы писали что открываете ордер на продажу вручную, тогда ваше условие будет выглядеть так 

 

//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(
                int otype=-1,// торговая операция, если -1 любая торговая операция
                int magic=-1 // идентификатор, если -1 то любой идентификатор
                )
  {
   int count=0;     // обнуляем переменную

   for(int i=OrdersTotal()-1; i>=0; i--) //    перебор открытых и отложеных ордеров
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
        {
         if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
           {
            if(OrderType()==otype || otype==-1)
              {
               if(OrderMagicNumber()==magic || magic==-1)
                 {
                  count++; // плюсуем наши ордера
                 }
              }
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
if(CountTrades(OP_SELL,0)==1 && CountTrades(OP_BUY,Magic)<10)
  {
   int ticket=OrderSend(OP_BUYSTOP);
  }
//+------------------------------------------------------------------+

 ...

 
Sergey Gritsay:

Вы писали что открываете ордер на продажу вручную, тогда ваше условие будет выглядеть так 

 

//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(
                int otype=-1,// торговая операция, если -1 любая торговая операция
                int magic=-1 // идентификатор, если -1 то любой идентификатор
                )
  {
   int count=0;     // обнуляем переменную

   for(int i=OrdersTotal()-1; i>=0; i--) //    перебор открытых и отложеных ордеров
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
        {
         if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
           {
            if(OrderType()==otype || otype==-1)
              {
               if(OrderMagicNumber()==magic || magic==-1)
                 {
                  count++; // плюсуем наши ордера
                 }
              }
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
if(CountTrades(OP_SELL,0)==1 && CountTrades(OP_BUY,Magic)<10)
  {
   int ticket=OrderSend(OP_BUYSTOP);
  }

 


//+------------------------------------------------------------------+

 Я совсем запутался...int ticket=OrderSend(OP_BUYSTOP); в этой строчке вместо OP_BUYSTOP я должен прописать все условия для открытия ордера?

и второе, если я правильно понимаю код, то для ордера на продажу советником  код дальше должен выглядеть так:

if(CountTrades(OP_SELL,Magic)<1 && CountTrades(OP_BUY,Magic)==10)
  {
  
   int ticket=OrderSend(OP_SELLSTOP)
  }

могу ли я написать условия и на покупку и на продажу одновременно:

if(CountTrades(OP_SELL,Magic)<1 && CountTrades(OP_BUY,Magic)<10)
  {
  
   int ticket=OrderSend(OP_BUYSTOP)
   int ticket=OrderSend(OP_SELLSTOP)
  }

 ?


 

 

 
Fizkulitprivet:
все верно
 
//+------------------------------------------------------------------+
//|                                                      Tester1.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//********************************************************************
//                       Глобальные переменные
//********************************************************************


extern int               Takeprofit  = 5;
extern int               Magic       = 123;
extern double            Lots        = 0.01;

//*******************************************************************
double TP;
int ticket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades(OP_SELL,Magic)==0 && CountTrades(OP_BUY,Magic)<10)
  {
   TP = NormalizeDouble ( Ask+15*Point,4);
   ticket=OrderSend ( Symbol (), OP_BUYLIMIT, Lots, Ask, 0, 0, TP, NULL, Magic, 0, Blue);
   if ( ticket < 0)
    Print ( "Не удалось выставить ордер BUYLIMIT");
  }
  if(CountTrades(OP_SELL,Magic)<1 && CountTrades(OP_BUY,Magic)<10)
  {
   TP = NormalizeDouble ( Bid-15*Point,4);
   ticket=OrderSend ( Symbol (), OP_SELLSTOP, Lots, Bid, 0, 0, TP, NULL, Magic, 0, Red);
    if ( ticket < 0)
    Print ( "Не удалось выставить ордер SELLSTOP");
  }  
}



//********************************************************************
//                       ФУНКЦИИ
//********************************************************************
//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(
                int otype=-1,// торговая операция, если -1 любая торговая операция
                int magic=-1 // идентификатор, если -1 то любой идентификатор
                )
  {
   int count=0;     // обнуляем переменную

   for(int i=OrdersTotal()-1; i>=0; i--) //    перебор открытых и отложеных ордеров
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
        {
         if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
           {
            if(OrderType()==otype || otype==-1)
              {
               if(OrderMagicNumber()==magic || magic==-1)
                 {
                  count++; // плюсуем наши ордера
                 }
              }
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

попробовал запустить на Демосчете,  то что у меня получилось пока без стоплосса. При компиляции ошибок не выдает, но и торговать не хочет...

 
Fizkulitprivet:
//+------------------------------------------------------------------+
//|                                                      Tester1.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//********************************************************************
//                       Глобальные переменные
//********************************************************************


extern int               Takeprofit  = 5;
extern int               Magic       = 123;
extern double            Lots        = 0.01;

//*******************************************************************
double TP;
int ticket;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
if(CountTrades(OP_SELL,Magic)==0 && CountTrades(OP_BUY,Magic)<10)
  {
   TP = NormalizeDouble ( Ask+15*Point,4);
   ticket=OrderSend ( Symbol (), OP_BUYLIMIT, Lots, Ask, 0, 0, TP, NULL, Magic, 0, Blue);
   if ( ticket < 0)
    Print ( "Не удалось выставить ордер BUYLIMIT");
  }
  if(CountTrades(OP_SELL,Magic)<1 && CountTrades(OP_BUY,Magic)<10)
  {
   TP = NormalizeDouble ( Bid-15*Point,4);
   ticket=OrderSend ( Symbol (), OP_SELLSTOP, Lots, Bid, 0, 0, TP, NULL, Magic, 0, Red);
    if ( ticket < 0)
    Print ( "Не удалось выставить ордер SELLSTOP");
  }  
}



//********************************************************************
//                       ФУНКЦИИ
//********************************************************************
//-----------------------функция подсчета ордеров------------------------------------
int CountTrades(
                int otype=-1,// торговая операция, если -1 любая торговая операция
                int magic=-1 // идентификатор, если -1 то любой идентификатор
                )
  {
   int count=0;     // обнуляем переменную

   for(int i=OrdersTotal()-1; i>=0; i--) //    перебор открытых и отложеных ордеров
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) // если получилось выбрать ордер
        {
         if(OrderSymbol()==Symbol()) // проверяем наш ли ордер
           {
            if(OrderType()==otype || otype==-1)
              {
               if(OrderMagicNumber()==magic || magic==-1)
                 {
                  count++; // плюсуем наши ордера
                 }
              }
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+

попробовал запустить на Демосчете,  то что у меня получилось пока без стоплосса. При компиляции ошибок не выдает, но и торговать не хочет...

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

спасибо все получилось.

получилось, но не так как я хотел.

после того как я ввел дополнительную переменную Lots1 у Buy ордеров, объем сделок изменился.

Что нужно сделать чтобы проверялся еще и объем по сделкам?

чтобы было более понятно, торговля ведется по принципу открытия локовых ордеров, где Sell ордер всегда один (два,три) но с большим объемом: 

extern double            Lots        = 0.1;

а количество ордеров Buy  всегда больше но с меньшим объемом:

extern double            Lots1        = 0.01;