Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1097

 
Vladimir Karputov:

После исполнения торгового приказа появляется ПОЗИЦИЯ! Не ОРДЕР!

Есть сервера, где можно воспроизвести такую ситуацию

PositionGetTicket(0) = 73401069 
PositionSelect(_Symbol) = true 
OrderGetTicket(0) = 73401069 
PositionsTotal() = 1
OrdersTotal() = 1, ORDER_STATE_STARTED


Т.е. имеем одновременно в Терминале вот такой ордер

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0


и такую же позицию от него

#73401069 2019.06.08 21:42:42 buy 1.00 BO Volatility 100 Index 0.5150 0.0000 0.0000 0.5150 0.00 0.00 0.00 Hello! 0
 
Vladimir Karputov:

Поэтому сначала словами опишите, что делаете и что хотите получить. Вместо ОРДЕР применяйте "торговый приказ BUY" и "торговый приказ SELL". В результате получаем "позиция BUY" или "позиция SELL".

ОК, упростим нашу беседу до примеров в коде, вот на MQL4 код написал - интересует версия для тестрера, т.е минимум проверок и т.п.:

//+------------------------------------------------------------------+
//|                                                        tst__.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

int ticket1=-1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticket1=-1;
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,NormalizeDouble(Ask-100*_Point,_Digits),NormalizeDouble(Ask+100*_Point,_Digits));

   if(OrderSelect(ticket1,SELECT_BY_TICKET))
     {
      if(OrderCloseTime()>0)
        {
         int cmd=OrderType()==OP_BUY ? OP_SELL : OP_BUY;
         double tp = cmd==OP_BUY ? NormalizeDouble(Ask+100*_Point,_Digits) : NormalizeDouble(Bid-100*_Point,_Digits);
         double sl = cmd==OP_BUY ? NormalizeDouble(Ask-100*_Point,_Digits) : NormalizeDouble(Bid+100*_Point,_Digits);
         ticket1=OrderSend(_Symbol,cmd,0.1,Ask,30,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+

смысл ТС: открываем при первом запуске ордер Buy и запоминаем тикет ордера (работаем по тикету) , затем проверяем закрыт ли ордер - смотрим какого типа был ордер и выставляем противоположный ордер и запоминаем тикет и так по кругу

мне нужен аналогичный пример для воспроизведения на MQL5 с использованием СБ CTrade

 
Igor Makanu:

ОК, упростим нашу беседу до примеров в коде, вот на MQL4 код написал - интересует версия для тестрера, т.е минимум проверок и т.п.:

смысл ТС: открываем при первом запуске ордер Buy и запоминаем тикет ордера (работаем по тикету) , затем проверяем закрыт ли ордер - смотрим какого типа был ордер и выставляем противоположный ордер и запоминаем тикет и так по кругу

мне нужен аналогичный пример для воспроизведения на MQL5 с использованием СБ CTrade

Сейчас барабашка скажет всё что о вас думает))))
 
Alexey Viktorov:
Сейчас барабашка скажет всё что о вас думает))))

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

(жирным - все равно это ордер! - ибо на хэдж счете ТС)

 
Igor Makanu:

ОК, упростим нашу беседу до примеров в коде, вот на MQL4 код написал - интересует версия для тестрера, т.е минимум проверок и т.п.:

Второй OrderSend содержит ошибку. И нормализация не нужна. На форуме (и не только) код легче читается, когда он короче.
void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }

мне нужен аналогичный пример для воспроизведения на MQL5 с использованием СБ CTrade

Тут уже надо будет постараться.

 

Итак, основа основ - Идентификатор позиции (POSITION_IDENTIFIER), но ни как не тикет позиции. Это важно, как раз из-за неттинга:

POSITION_IDENTIFIER

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

 

Идентификатор позиции указывается в каждом ордере (ORDER_POSITION_ID) и сделке (DEAL_POSITION_ID), которая ее открыла, изменила или закрыла. Используйте это свойство для поиска ордеров и сделок, связанных с позицией.

 

При развороте позиции в режиме неттинга (единой сделкой in/out) идентификатор позиции POSITION_IDENTIFIER не изменяется. Однако при этом POSITION_TICKET изменяется на тикет ордера, в результате которого произошел разворот. В режиме хеджинга разворот позиции не предусмотрен.

long


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


Теперь уточнённая задача: при первом запуске открываем ПОЗИЦИЮ BUY и запоминаем её (ВНИМАНИЕ: запоминать нужно идентификатор позиции, но не тикет). Если позиция была закрыта - открываем противоположную позицию: например жила-была позиция BUY, затем она была закрыта, а значит открывается сразу позиция SELL.


Теперь решить задачу станет намного легче.

 
Vladimir Karputov:

Теперь решить задачу станет намного легче.

При написании примера загляните немного вперед.

 
fxsaber:
Второй OrderSend содержит ошибку. И нормализация не нужна. На форуме (и не только) код легче читается, когда он короче. 

да, вижу, писал код на лету - запустил в тестере - работает, скопировал на форум


fxsaber:

Тут уже надо будет постараться.

вот поэтому я и обратился за помощью на форум! - решил оценить возможности СБ CTrade - взял в качестве примера элементарную задачу и пока результат отрицательный!


Vladimir Karputov:

Теперь решить задачу станет намного легче.

знаю Вас как активного участника форума, Вы не могли бы мой, вернее правленый код fxsaber , воспроизвести с помощью СБ CTrade под MQL5

 
Igor Makanu:

да, вижу, писал код на лету - запустил в тестере - работает, скопировал на форум

Когда начинаю писать советник, то стартую всегда с голого листа (рекомендую). Наверное, чаще всего стартуют с шапки с On-функциями.

 
Igor Makanu:

вот поэтому я и обратился за помощью на форум! - решил оценить возможности СБ CTrade - взял в качестве примера элементарную задачу и пока результат отрицательный!

Есть еще более короткий пример.

С ним тяжко в MT5, если не в тестере.

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