Нужна Ваша помощь

 

Здравствуйте! Столкнулся с одной проблемой при написании советника.

Суть в том, что советник открывает ордера по индикатору. Сигналы частые, и в рынке появляется много ордеров.

Например, при открытии ордера Buy ранее открытые Buy если они в плюсе должны закрыться. Если в минусе, то нет. Такие же условия и для Sell .

Но проблема в том, что код закрывает только что открытый ордер, как только он войдет в плюс

Вот код.

void CloseBuy()
  {
     {
      for(int i=OrdersTotal(); i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol()==Symbol())
               if(OrderMagicNumber()==Magic)
                  if(OrderProfit()+OrderSwap()+OrderCommission()>0)
                     if(OrderType()==OP_BUY)
                       {
                        if(CountOrdep(OP_BUY)>1 && i!=0)//Колличество ордеров Buy
                           CloseOrders(OP_BUY,true,Magic,clrGreen);//Функция закрытия ордеров
                       }
        }
     }

  }

Когда один два ордера, все работает, когда много ордеров Buy и Sell тогда начинает гнать!

Подскажите, где ошибка?

Заранее спасибо за ответы

 
Vadim Kazakevich:

Здравствуйте! Столкнулся с одной проблемой при написании советника.

Суть в том, что советник открывает ордера по индикатору. Сигналы частые, и в рынке появляется много ордеров.

Например, при открытии ордера Buy ранее открытые Buy если они в плюсе должны закрыться. Если в минусе, то нет. Такие же условия и для Sell .

Но проблема в том, что код закрывает только что открытый ордер, как только он войдет в плюс

Вот код.

Когда один два ордера, все работает, когда много ордеров Buy и Sell тогда начинает гнать!

Подскажите, где ошибка?

Заранее спасибо за ответы


Я так понял, вам надо закрывать самый "старый" ордер. Тогда вам нужно анализировать время открытия ордера и закрывать тот у которого дата открытия меньше чем у других.

 
Vitalii Ananev:

Я так понял, вам надо закрывать самый "старый" ордер. Тогда вам нужно анализировать время открытия ордера и закрывать тот у которого дата открытия меньше чем у других.

Спасибо! А как это в коде выразить?
 

Еще вопрос! Я не пойму, почему этот код закрывает все ордера, и бай, и селл. Даже в минусе?

void CloseBuy()
  {
   for(int i=OrdersTotal(); i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==Magic)
              {
               if(OrderType()==OP_BUY)
                 {
                  if(OrderProfit()+OrderSwap()+OrderCommission()>0)
                    {
                     if(CountOrdep(OP_BUY)>1 && i!=0)
                       {
                        OrderClose(OrderTicket(),OrderLots(),Bid,Slip,clrGray);
                       }
                    }
                 }
              }
           }
        }
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseSell()
  {
   for(int i=OrdersTotal(); i>=0; i--)
     {
      if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==Magic)
              {
               if(OrderType()==OP_SELL)
                 {
                  if(OrderProfit()+OrderSwap()+OrderCommission()>0)
                    {
                     if(CountOrdep(OP_SELL)>1 && i!=0)
                       {
                        OrderClose(OrderTicket(),OrderLots(),Ask,Slip,clrGray);
                       }
                    }
                 }
              }
           }
        }
     }
  }
 
Vadim Kazakevich:

Еще вопрос! Я не пойму, почему этот код закрывает все ордера, и бай, и селл. Даже в минусе?

Здесь возможно ошибка:
if(OrderProfit()+OrderSwap()+OrderCommission()>0)

Попробуйте так:

if((OrderProfit()+OrderSwap()+OrderCommission())>0)
 
Maksim Neimerik:
Здесь возможно ошибка:

Попробуйте так:

Не помогает!
 
Vadim Kazakevich:
Спасибо! А как это в коде выразить?

Тут есть два варианта.

1 Тикет ордеру присваивается в порядке возрастания чем больше OrderTicet() то значит он открыт позже. Можно запихнуть тикет всех ордеров в массив и отсортировать его в порядке возрастания (функция ArraySort()) , таким образом в массиве самым первыми ордерами будут те у кого тикет меньше всех соответственно они были открыты раньше.

2. Сравнивать OrderOpenTime(). Ордер с самым маленьким значением OrderOpenTime() будет открыт самым первым. 

 
Vadim Kazakevich:

Еще вопрос! Я не пойму, почему этот код закрывает все ордера, и бай, и селл. Даже в минусе?


void Close(int cmd)
{
  if(CountOrdep(cmd)>1)
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) coutinue;      
      if(OrderSymbol()!=Symbol()) continue;      
      if(OrderMagicNumber()!=Magic) continue;      
      if(OrderType()==cmd)
      {
         if(OrderProfit()+OrderSwap()+OrderCommission()>0)
         {
            if (cmd==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,Slip,clrGray);
            if (cmd==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,Slip,clrGray);
         }
      }                 
    }
  }
}

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