Переворот позиции на одном баре в тестере

 
Задача следующая нужно чтобы тестер переворачивал позу на одном баре.
пробывал реализовать циклом не получилось.
int start()
 {
  for(iter=2;iter>0;iter--)
   {
    "тело эксмерта"
    }
  }

реализовал идею по тупому, после проверки на закрытие, в случаи закрытия, OrderSend.

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


 
1. Убелиться,что есть открытая позиция
2. Убедиться, что требуется переворот и поставить флаг переворота
3. Запомнить первоначальную позицию и поставить флаг наличия допереворотной позиции
4. Попытаться закрыть допереворотную позицию и в случае успеха снять флаг наличия допереворотной позиции.
5. Если открытой позиции нет и есть флаг переворота -попытаться открыть новую позицию, если позиция открылась - снять флаг переворота.
6. В случая сбоя выйти и на следующем тике заново пройти все шаги.
 

Это не совсем то что я хочу реализовать, уточняю.
В коде должно присутствовать только один модуль на открытие позиции (buy/sell), и только один модуль на закрытие позиции (buy/sell).
Переворот должен осуществляется посредством повторной итерации STARTa. Т.Е. при поступлении нового тика либо при формировании нового бара, в случаи тестирования, если первая итерация закрывает позу то вторая итерация открывает противоположную, т.к. флаг на закрытие buy есть флаг на открытие sell и наоборот.

 
Трудно понять что требуется, вот кусрк из моего кода:

int start()
  {
  int ticket;
//----
   //Print("Tick");
   if (isNewBar())
      {
      //Print("Bid=",DoubleToStr(Bid,8));
      if (SignalExist(OP_BUY)&&AllowedOpenOrder(OP_BUY)) 
         {
         if (OrdersTotalByType(OP_SELL)>0) CloseOrders(OP_SELL);
         GetOrder(OP_BUY);
         //Print("Buy");
         }
      if (SignalExist(OP_SELL)&&AllowedOpenOrder(OP_SELL)) 
         {
         if (OrdersTotalByType(OP_BUY)>0) CloseOrders(OP_BUY);
         GetOrder(OP_SELL);
         //Print("Sell");
         }
      //ParabolTrailingStop();
      TrailingStop();
      }
   //EveryTick();   
//----
   return(0);
  }
 

Уточняю окончательоно.

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

Спасибо, как я понял у меня пробел по функциям не описанным в справке MetaEditor (например isNewBar()), и мне непонятно почему они не подсвечиваются, а также необходимо научиться использовать собственные функции.
Если можно, предоставите весь код, дабы на его примере ликвидировать пробелы в знаниях и ответьте на вопрос почему isNewBar не подсвечивается и отсутствует в справке.

 
Теперь и я понял . Все эти функции пользовательские , они не являются стандартными.

//+------------------------------------------------------------------+
//| возвращает true если появлися новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
 
 
//+------------------------------------------------------------------+
//| возвращает true, если появился сигнал на открытие ордера         |
//+------------------------------------------------------------------+
bool SignalExist(int _OrderType)
  {
//----
   bool res=false; 
   //Print("Проверяем возможность открытия ",_OrderType);
 
//----
   return(res);
  }
 
 
//+------------------------------------------------------------------+
//| возвращает тикет , при удачном открытиии ордера                  |
//+------------------------------------------------------------------+
int GetOrder(int _OrderType)
  {
//----
   int ticket;
   double StopLoss,TakeProfit,indicator,range;
   string Comm;
   int MagicNumber;
   range=(Close[0]-Open[3])/Point;// вычислим движение за 3 последних бара в пунктах 
   Comm=DoubleToStr(range,0); // запомним его с комментарии к ордеру
 
   // код открытия   
   return(ticket);
  }
 
//+------------------------------------------------------------------+
//| возвращает количество ордеров этого типа                         |
//+------------------------------------------------------------------+
int OrdersTotalByType(int _OrderType)
  {
//----
   int res;
   for (int i=0;i<OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderType()!=_OrderType) continue; // не наш тип ордера
                                                // берем следующий 
         res++;
         }
      }
//----
   return(res);
  }
 
//+------------------------------------------------------------------+
//| закрывает все ордера указанного типа                             |
//+------------------------------------------------------------------+
void CloseOrders(int _OrderType)
  {
  double ClosePrice;
  int ticket;
  bool res;
//----
   for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
      {
      if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderType()!=_OrderType) continue;
         RefreshRates();
         if (_OrderType==OP_BUY) ClosePrice=NormalizeDouble(Bid,Digits);
         if (_OrderType==OP_SELL) ClosePrice=NormalizeDouble(Ask,Digits);
         ticket=OrderTicket();
         res=OrderClose(ticket,OrderLots(),Slippage,Black);
         if (!res) Print("Не удалось закрыть ордер типа ",_OrderType);
         }
      }
//----
   return;
  }
 
//+------------------------------------------------------------------+
//| возвращает true, если разрешается открыть ордер этого типа       |
//+------------------------------------------------------------------+
bool AllowedOpenOrder(int _OrderType)
  {
//----
   bool res=false;
   if (MaxOpenOrder<=0) res=true;
   else
      {
      res=(OrdersTotalByType(_OrderType)<MaxOpenOrder);
      }
//----
   return(res);
  }
 
//+------------------------------------------------------------------+
//|подтягивает стоп на расстояние TS пунктов от текущей цены закрытия|
//+------------------------------------------------------------------+
void TrailingStop()
  {
  int type,i;
  double NewStop;
//----
 
 // ваш код трейлинга
 
//----
   return;
  }
Причина обращения: