По одному ордеру на каждую пару

 

Кто знает, какой код написать, чтобы советник открывал по одному ордеру на каждую пару?


У меня написан код

if (OrdersTotal()==0)

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


Пробовал писать другие коды и открывает вообще куча ордеров.


Сам советник прикреплен.


Заранее Спасибо.

Файлы:
 

Вот сюда посмотрите.

'Полезные функции от KimIV'

 

Посмотрел и что-то кода не нашел...

Может я не там смотрел.

 
Dharma писал (а) >>

Кто знает, какой код написать, чтобы советник открывал только один ордер по одному символу?

У меня написан код

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

Пробовал писать другие коды и открывает вообще куча ордеров.

Заранее Спасибо.

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

Вам же для начала нужно предусмотреть в вашем коде магик-номер при открытии позиции.

После чего, берёте подходящую функцию, например

//+----------------------------------------------------------------------------+
//|  Возвращает количество позиций.                                            |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();

  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);

Располагаете её вне функции int start(). В глобальных переменных предусматриваете

extern int   MagicNumber =112233;

В функцию OrderSend( также вставить MagicNumber . Т.е. функции открытия будут выглядеть примерно так:

ticket=OrderSend(Symbol(),1,lots,Bid,Slippage,Bid+SL_sell*Point,
                             Bid-TP_sell*Point,"EXPERT",MagicNumber,0,CLR_NONE);

Далее вместо вашего

if (OrdersTotal()==0) {

вставляете данную функцию. К примеру, вот так -

if (NumberOfPositions(NULL,-1, MagicNumber )<1) { //если нет открытых позиций

И тогда ваш эксперт будет открывать только ОДНУ - "свою" позицию с магиком, кот. вы сами зададите в СВОЙСТВАХ

Надеюсь, понятно изложил...

 
Dharma писал (а) >>

Кто знает, какой код написать, чтобы советник открывал только один ордер по одному символу?

У меня написан код

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

Пробовал писать другие коды и открывает вообще куча ордеров.

Заранее Спасибо.

//+------------------------------------------------------------------+
//| Работа функций эксперта                                          |
//+------------------------------------------------------------------+
int start()
  {
//+------------------------------------------------------------------+
// Обьявляем переменные и присваиваем им значения
    total=OrdersTotal();                  // Присваиваем total число открытых ордеров
//+------------------------------------------------------------------+
//| Закрытие ордеров                                                 |
//+------------------------------------------------------------------+
// Проверяем есть ли ордер?
    if (total>0)
// Если есть ордера.
    {
// Выполнение цикла, если есть один или более открытых ордеров и перебираем их.
      for(i=total; i>=0; i--)
      {
// Проверяем среди открытых ордеров кроме отложенных, закрытых или удаленных
        if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
        {
// Проверяем это орбер BUY
          if (OrderType()==OP_BUY && SignalBuyClose && AllowBuyClose) // можно тут вписать свое сравнение :)
          {
// Закрываем ордер BUY
            OrderClose(OrderTicket(),OrderLots(),Bid,0,White);
            continue;
          }   
// Проверяем это орбер SELL
          if (OrderType()==OP_SELL && SignalSellClose && AllowSellClose) // можно тут вписать свое сравнение :)
          {
// Закрываем ордер SELL
            OrderClose(OrderTicket(),OrderLots(),Ask,0,White);
            continue;
          } 
        }
      }
    }
//+------------------------------------------------------------------+
//| Открытие ордеров                                                 |
//+------------------------------------------------------------------+
    else
// Если нет ордера.
    {
//+------------------------------------------------------------------+
// Проверяем образован ли сигнал на покупку Buy
      if (SignalBuyOpen && AllowBuyOpen)
      {
// Открываем ордер Buy
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-TrailingStop*Point,Ask+TakeProfit*Point,WindowExpertName(),order_id,0,Blue);
// Проверяем принять ли ордер
        if(ticket>0)
        {
// Ордер принят, печатаем его в журнале
          if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
// Ордер отклонен, печатаем причину в журнале
        }
        else Print("Error opening SELL order : ",GetLastError());
// Все удачно открыто ждем некоторое время и выходим
        return(0);
      }
//+------------------------------------------------------------------+
// Проверяем образован ли сигнал на покупку Buy
      if (SignalSellOpen && AllowSellClose)
      {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+TrailingStop*Point,Ask-TakeProfit*Point,WindowExpertName(),order_id,0,Red);
// Проверяем принять ли ордер
        if(ticket>0)
        {
// Ордер принят, печатаем его в журнале
          if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
// Ордер отклонен, печатаем причину в журнале
        }
        else Print("Error opening SELL order : ",GetLastError());
// Все удачно открыто ждем некоторое время и выходим
        return(0);
      }
//+------------------------------------------------------------------+
    }
  }
return(0);
//+------------------------------------------------------------------+

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

if(OrderType()>OP_SELL || OrderSymbol()!=Symbol()) continue;

вобщем поработайте с опператором Symbol(), кстати он есть в русском мануале в MQL4 наммбираеш с троке любой Symbol(), затем становишся курсивом в середину слова и нажимаеш на клавиатуре кнопку "F1" - "справка" и будет тебе счастье с примерами

 
Dharma писал (а) >>

Кто знает, какой код написать, чтобы советник открывал только один ордер по одному символу?

У меня написан код

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

Пробовал писать другие коды и открывает вообще куча ордеров.

Заранее Спасибо.

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

if (OrdersTotal()==0)

ты делаеш прямую проверку без подстановки временных переменных это не есть хорошо..

лутчше бы написал примерно бы так

total=OrdersTotal();                  // Присваиваем total число открытых ордеров
if (total>0)                          // Прверяем есть ли у нас ордера (если есть то будет результат больше нуля)
{
                                      // если есть ордера выполняем этот код
}
else                                  // иначе
{
                                      // выполняем этот код если нет ордеров
}

тоесть теперь с переменной total() мы можем делать что хотим отнять, прибавить. вобщем все.. но с переменной OrdersTotal() ты такого не сможеш. прийдется всегда косвенно к ней относится.

также не забудь что есть магическое число.. каждому советнику даеш его и пусть себе шарахает ордера.. он их из всех определит что его а что нет..

 

С вашим вариантом, Nadejnie, эксперт не будет работать, если в терминале мт4 будут присутствовать другие открытые позиции. Открытые вручную, либо другим экспертом.

Поэтому, я думаю, лучше всё таки задействовать отбор по MagicNumber, А не по total=OrdersTotal();

Тогда и символ можно лишний раз не проверять...

 
Спасибо rid и Nadejnie за ответы сейчас попробую...
 
Что-то не получается первый способ с магиком там при компиляции пишет: 'NumberOfPositions' - function is not defined (функция не определена).
Второй способ сделал, посмотрим, будет он ставить все ордера...
 
Вот весь советник.
Это советник по системе ДиНаполи и уже со вторым способом.
Файлы:
 
Dharma писал (а) >>
Вот весь советник.
Это советник по системе ДиНаполи и уже со вторым способом.

Перед обращением к параметрам ордера необходимо его предварительно выбрать используя OrderSelect(.......)

А сейчас идет сразу же проверка типа ордера (в функции старт). Дальше не смотрел

Причина обращения: