Лимитки в 2 стороны

 
Здравствуйте. Интересует вопрос по выставлению лимиток в 2 стороны. Условие торговли - начало дня, тогда, когда новый бар только появляется. Я выставляю лимитки на 20 пунктов выше и ниже. И когда срабатывает 1 из условий, я закрываю другую лимитку. Но почему-то при отладке лимитки срабатывают не  всегда по тем ценам ( проскальзывания нету ), и не получается закрывать 1, при срабатывании другой. В итоге они закрываются друг о друга. Можете подсказать пожалуйста, как это реализовать? Сделал с помощью события OnTrade
void OnTrade()
   {
      if(isBuy && isSell)
         {
            if(PositionSelect(_Symbol) == true)
             {
               if (m_position.PositionType() == POSITION_TYPE_BUY)
                  {
                     isSell = false;
                     mytrade.OrderDelete(SellTicket);
                  }
                  if(m_position.PositionType() == POSITION_TYPE_SELL)
                  {
                     isBuy = false;
                     mytrade.OrderDelete(BuyTicket);
                  }
             }
         }
      
   }
Файлы:
TwoSides.mq5  21 kb
 

1. чтобы работать с позицией, её нужно выбрать:

   for(int i=PositionsTotal()-1;i>=0;i--)
      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name()() && m_position.Magic()==m_magic)
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY)
              {

              }

            if(m_position.PositionType()==POSITION_TYPE_SELL)
              {

              }
           }

2. Что значит "срабатывают не по тем ценам, но при этом проскальзывания нету"? Приведите, пожалуйста логи тестера.

 
Vladimir Karputov:

1. чтобы работать с позицией, её нужно выбрать:

2. Что значит "срабатывают не по тем ценам, но при этом проскальзывания нету"? Приведите, пожалуйста логи тестера.


На счет второго, я исправил там, забываю умножать на _Point. А вот на счет выбора позиций, ведь у нас на 1 инструменте может быть только 1 позиция в какую-то сторону. А закрыть ордер я могу по тикету в функции OrderDelete();
 
Fresto:

На счет второго, я исправил там, забываю умножать на _Point. А вот на счет выбора позиций, ведь у нас на 1 инструменте может быть только 1 позиция в какую-то сторону. А закрыть ордер я могу по тикету в функции OrderDelete();


На одном инструменте может быть:

  1. м‌ного позиция, причём разнонаправленных - это на торговых счетах с хеджингом
  2. одна позиция - на счетах с неттингом.

Поэтому нужно сразу говорить, на каком типе счёта работаете.

О‌рдер (отложенный) Вы можете УДАЛИТЬ, а не ЗАКРЫТЬ.

 
Vladimir Karputov:


На одном инструменте может быть:

  1. м‌ного позиция, причём разнонаправленных - это на торговых счетах с хеджингом
  2. одна позиция - на счетах с неттингом.

Поэтому нужно сразу говорить, на каком типе счёта работаете.

О‌рдер (отложенный) Вы можете УДАЛИТЬ, а не ЗАКРЫТЬ.


Удалить, да. Некорректные выражения у меня бывают.
 

Fresto:
Здравствуйте. Интересует вопрос по выставлению лимиток в 2 стороны. Условие торговли - начало дня, тогда, когда новый бар только появляется. Я выставляю лимитки на 20 пунктов выше и ниже. И когда срабатывает 1 из условий, я закрываю другую лимитку. Но почему-то при отладке лимитки срабатывают не  всегда по тем ценам ( проскальзывания нету ), и не получается закрывать 1, при срабатывании другой. В итоге они закрываются друг о друга. Можете подсказать пожалуйста, как это реализовать? Сделал с помощью события OnTrade

void OnTrade()
   {
      if(isBuy && isSell)
         {
            if(PositionSelect(_Symbol) == true)
             {
               if (m_position.PositionType() == POSITION_TYPE_BUY)
                  {
                     isSell = false;
                     mytrade.OrderDelete(SellTicket);
                  }
                  if(m_position.PositionType() == POSITION_TYPE_SELL)
                  {
                     isBuy = false;
                     mytrade.OrderDelete(BuyTicket);
                  }
             }
         }
      
   }

Поскольку речь о двух разнонаправленных позициях, значит счёт hadge и соответственно выбирать позицию для обращения к её свойствам надо не по символу, а по индексу в списке позиций.

ps; Стоп. Я чуток тоже попутал. Два ордера, потом один стал позицией, имеем один ордер и одну позицию.‌

 

Кстати, момент срабатывания ордера лучше отлавливать в TradeTransaction:

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void CNewMartin::TradeTransaction(const MqlTradeTransaction &trans,
                                  const MqlTradeRequest &request,
                                  const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value 
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if(type==TRADE_TRANSACTION_DEAL_ADD)
     {
      long     deal_entry        =0;
      long     deal_type         =0;
      string   deal_symbol       ="";
      long     deal_magic        =0;
      if(HistoryDealSelect(trans.deal))
        {
         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
         deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
         deal_symbol=HistoryDealGetString(trans.deal,DEAL_SYMBOL);
         deal_magic=HistoryDealGetInteger(trans.deal,DEAL_MAGIC);
        }
      else
         return;
      if(deal_symbol==Symbol() && deal_magic==m_magic)
         if(deal_entry==DEAL_ENTRY_IN)
           {
            //--- если словили открытие BUY
            if(deal_type==DEAL_TYPE_BUY)
              {

              }
            //--- если словили открытие SELL
            if(deal_type==DEAL_TYPE_SELL)
              {

              }
           }
     }
  }
 
Alexey Viktorov:
Поскольку речь о двух разнонаправленных позициях, значит счёт hadge и соответственно выбирать позицию для обращения к её свойствам надо не по символу, а по индексу в списке позиций.

Я говорю о двух разнонаправленных лимитках, но при срабатывании одного, вторая должна удаляться, поскольку на счете может быть позиция только в 1 сторону.
 
Fresto:

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


На счёте может одновременно:

  • на одном символе много позиций, причём они могут быть противоположными - на счетах с хеджингом
  • на одном символе в одну строну может быть только одна позиция - на счетах с неттингом.
Поэтому Вам следует точно говорить, на каком типе счёта Вы торгуете.

 
Vladimir Karputov:


На счёте может одновременно:

  • на одном символе много позиций, причём они могут быть противоположными - на счетах с хеджингом
  • на одном символе в одну строну может быть только одна позиция - на счетах с неттингом.
Поэтому Вам следует точно говорить, на каком типе счёта Вы торгуете.


Я всё пытаюсь вывести это в журнал из библиотеки AccountInfo) Сложно разбираться с mql5.
 
Fresto:

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

Я понял это сразу, но пока писал о том что я не прав, ты уже это тоже заметил.

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

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