Советник + несколько пар

 

С прошедшими всех!

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


Евра 06.2008 - 01.2009

Но как известно рынок изменчив. На моем советнике это отражается "затуханием" сигналов и "усилением". Поэтому хочу торговать им на разных парах.

Как правильно можно(нужно) использовать НЕ мультисоветник (без привязки к валюте) на нескольких графиках?

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

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

 
ALex2008 писал(а) >>

С прошедшими всех!

Подскажите... Написал советник, торгует, сигналы есть.. Но как известно рынок изменчив. На моем советнике это отражается "затуханием" сигналов и "усилением". Поэтому хочу торговать им на разных парах.

Как правильно можно(нужно) использовать НЕ мультисоветник (без привязки к валюте) на нескольких графиках?

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

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

Если не использовать советник на разных таймфреймах одного инструмента, то достаточен контроль торгуемого инструмента. То есть работа советника разрешена по тем позициям, у которых OrderSymbol()==Symbol(). Если нужна работа по разным таймфреймам, то для каждого таймфрейма свое магическое число MagicNumber и соответсвенно контроль по магическому числу OrderMagicNumber()==MagicNumber, не забывая про контроль символа.

 

Почти понял, но не до конца...

Как связать проверку инструмента OrderSymbol()==Symbol() с проверкой открытого ордера именно по этому инструменту OrdersTotal()>0 ?

Чтобы проверка была открытого ордера по текущему инструменту...

 
ALex2008 писал(а) >>

Почти понял, но не до конца...

Как связать проверку инструмента OrderSymbol()==Symbol() с проверкой открытого ордера именно по этому инструменту OrdersTotal()>0 ?

Чтобы проверка была открытого ордера по текущему инструменту...

int start() 
  {
  int i;
  for (i=OrdersTotal()-1;i>=0;i--)
    {
    if (CheckOrder(i, Symbol(), MagicNumber))
    {
    
    // Ваши действия по обработке вашего ордера
    
    }
  }


bool CheckOrder(int lnPos,string lsSymbol="", int lnMagicNumber=0)
  {
  if (!OrderSelect(lnPos,SELECT_BY_POS))           return(false);
  if (!(OrderSymbol()==lsSymbol || lsSymbol==""))  return(false);
  if (!(OrderMagicNumber()==lnMagicNumber || lnMagicNumber==0))   return(false);
  return(true);
  }
Что-то примерно эдакое. Хотя могут быть и варианты
 

А такой вариант возможен?

Пример закрытия открытого ордера:

void ClosePos()   //поступил новый сигнал, скорее закрываем всё..!
   {
      if (OrderSelect(0,SELECT_BY_POS)==true) && (OrderSymbol()==Symbol()) // Если есть открытый ордер и он относится к текущему инструменту
         {
            if (OrderType()==OP_BUY)
               {

               }  
              else
               {
   
               }
         }   
   }
 
ALex2008 писал(а) >>

А такой вариант возможен?

Пример закрытия открытого ордера:

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

Хотя, если хранить тикеты открытых позиций в массиве и постоянно проверять их (позиций) наличие. То код может быть очень простым.

Каждый советник работает со своим массивом и другие позиции ему неизвестны. Но при загрузке советника все равно надо будет делать загрузку ранее открытых позиций, а тут нужен будет опять же контроль по символу и магику.

 
т.е. нужен перебор ордеров как у вас в примере через "for" ? Без этого никак не узнать про ордера именно текущего инструмента...
 
ALex2008 писал(а) >>
т.е. нужен перебор ордеров как у вас в примере через "for" ? Без этого никак не узнать про ордера именно текущего инструмента...

Да. Нужно в списке ордеров найти нужный. Иначе никак.

 

Примерно так?)...

for (int i=1; i<=OrdersTotal(); i++)          //Цикл по всем ордерам,..
  {                                           //отражённым в терминале
      if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий         
        {
          if(OrderSymbol()==Symbol())
            {
              if (OrderType()==OP_BUY)
               {
                 ... 
               }  
              else
               {
                 ...
               }

            }
        } 
  }                                         //Конец тела цикла
 
ALex2008 писал(а) >>

Примерно так?)...

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

 

Я обычно использую такие проверки:

   int _OrdersTotal=OrdersTotal();
   for (int i=_OrdersTotal-1; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber() == Magic) {                                       
            if (OrderSymbol() == Symbol()) {
               if (OrderType() == OP_BUY) {
         
               }
            }
         }
      } 
   }