Не получается сделать усреднение.

 

Добрый день.

Хочу открывать позиции бай каждый раз при уходе цены на N пунктов вниз, но советник открывает все позиции до pos сразу после того как цена отошла на N пунктов  от первой позиции. Вот код.                                                                                                                                                    Подскажите пожалуйста, что тут не так.

if(PositionsTotal()<pos)
        {
          for(int i=PositionsTotal()-1;i>=0;i--) 
          {
          if(m_position.SelectByIndex(i))
           {     
          if(m_position.PositionType()==POSITION_TYPE_BUY) 
           {
            if(last_tick.ask<=(m_position.PriceOpen()-N*_Point))
              {
                   double stopB,takeB;
                   stopB=NormalizeDouble(last_tick.ask-SL*_Point,_Digits);
                   takeB=NormalizeDouble(last_tick.ask+TP*_Point,_Digits);
                   trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,last_tick.ask,stopB,takeB,"");
                   if(trade.ResultDeal()==0)return;
в тестере
 
Georgiy Donskikh:

Добрый день.

Хочу открывать позиции бай каждый раз при уходе цены на N пунктов вниз,***

Для этого нужно сначала обойти все позиции и найти самую низкую BUY. Аналогично для усреднения sell: нужно обойти все позиции и найти самую высокую позицию SELL.

Пример:

   int count_buys  =0;   double price_lowest_buy  =DBL_MAX;
   int count_sells =0;   double price_highest_sell=DBL_MIN;

   CalculateAllPositions(int count_buys,price_lowest_buy,count_sells,price_highest_sell);

   // Теперь можно анализировать текущую цену и сравнивать её с самой низкой BUY или с самой высокой SELL
   // При этом ОБЯЗАТЕЛЬНО учитывать count_buys и count_sells !!!

...
//+------------------------------------------------------------------+
//| Calculate all positions                                          |
//+------------------------------------------------------------------+
void CalculateAllPositions(int &count_buys,double &price_lowest_buy,
                           int &count_sells,double &price_highest_sell)
  {
   count_buys  =0;   price_lowest_buy  =DBL_MAX;
   count_sells =0;   price_highest_sell=DBL_MIN;
   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {
               count_buys++;
               if(m_position.PriceOpen()<price_lowest_buy) // the lowest position of "BUY" is found
                  price_lowest_buy=m_position.PriceOpen();
               continue;
              }
            else if(m_position.PositionType()==POSITION_TYPE_SELL)
              {
               count_sells++;
               if(m_position.PriceOpen()>price_highest_sell) // the highest position of "SELL" is found
                  price_highest_sell=m_position.PriceOpen();
               continue;
              }
           }
  }
 
Vladimir Karputov:

Для этого нужно сначала обойти все позиции и найти самую низкую BUY. Аналогично для усреднения sell: нужно обойти все позиции и найти самую высокую позицию SELL.

Пример:

Большое спасибо за ответ.

Все понял.

 
Georgiy Donskikh:

Большое спасибо за ответ.

Все понял.

Только ОБЯЗАТЕЛЬНО учитывать count_buys и count_sells !!! 

Например, если count_buys=0 - значит позиций BUY нет.