Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй статью. Мы сами переведем ее на другие языки!
Сергей
11
Сергей 2011.10.28 07:25 
У меня проблема в том что открывается повторно ордер, т.е. сигналы остались все правильными и он должен открываться, сигналов на разворот тоже нет, поэтому он открывается - но мне так не надо. Мне нужно чтобы он открылся только когда сбудутся сигналы на разворот. Как это реализовать? Чтобы в один тренд была только одна сделка и после нее запрет на любые сделки, потом по сигналам разворота опять разрешить торговать - причем разрешить в обе стороны?? чуваки плиз просвятите - а то на спор делаю)))
Владимир Тезис
4271
Владимир Тезис 2011.10.28 07:29  

Пишем счётчик бай-ордеров и счётчик селл-ордеров. Так же объявляем флаги, разрешающие бай и селл ордера. В теле советника проверяем, если бай-ордеров более нуля, то устанавливаем флаг, запрещающий бай-ордера (ну это чтоб по селл-сигналу можно было развернуться). И наоборот для селл-ордеров.

вот коды счётчиков:

//=========== SchBuy()  ===============================
//  Функция возвращает количество Buy-ордеров
//   SchBuy      - счётчик Buy ордеров
//-----------------------------------------------------------
int SchBuy(int MAGIC){
  string SMB=Symbol();
  int SchBuy=0;
  int i;
  for (i=OrdersTotal()-1;i>=0;i--) {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {WriteError(i);}
    else {
      if(OrderSymbol()!= SMB || OrderMagicNumber()!= MAGIC){ continue;}
      if(OrderType()==OP_BUY){ 
        SchBuy++;
      }  
    }
  }
  return(SchBuy);
}                  
//==================================================================================================


//=========== SchSell()  ===============================
//  Функция возвращает количество Sell-ордеров
//  SchSell  - счётчик Sell ордеров
//-----------------------------------------------------------
int SchSell(int MAGIC){
  string SMB=Symbol();
  int SchSell=0;
  int i;
  for (i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {WriteError(i);}
    else {
      if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;} 
      if(OrderType()==OP_SELL){
        SchSell++;
      }
    }
  }
 return(SchSell);     
}                  
//==================================================================================================
Avals
3158
Avals 2011.10.28 07:31  

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

  int total=OrdersTotal();           
    for(int i=0;i<total;i++){
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()==mymagic){        
       if (OrderType()==OP_BUY) int countBuy++;
       if (OrderType()==OP_SELL) int countSell++;
      }//if 
    }//for 

а потом проверяете

if (countBuy==0) OrderSend(..,OP_BUY,..)

if (countSell==0) OrderSend(..,OP_SELL,..)

Виктор
Модератор
6560
Виктор 2011.10.28 07:34  
Недостаточно. Если закроется позиция по стопу/профиту, то возможно повторное открытие одноименной позиции до сигнала на переворот. А автор этого не хотел. Флаги придется добавлять.
Владимир Тезис
4271
Владимир Тезис 2011.10.28 07:39  

Ну да. Условие открытия позы: Если ордера Бай нету и при этом есть сигнал на открытие бай-ордера, то устанавливаем флаг, разрешающий открытие бай-ордеров.

Сергей
11
Сергей 2011.10.28 08:30  

ща попробую прикрутить - отпишу как получилось!

только один вопрос - если после бая который закрылся то профиту будет мудота и потом опять сигналы на бай - как стоит обнулить счетчик?

Виктор
Модератор
6560
Виктор 2011.10.28 13:17  

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

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий