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

Vladimir Karputov:

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

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

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

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


fxsaber:

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

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


Vladimir Karputov:

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

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

Igor Makanu:

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

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

Igor Makanu:

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

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

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

хм, странная ситуация, вроде активность  в топике я поднял,  вопрос у меня был, с моей точки зрения конкретный, а вместо ответа пока получил "а зачем тебе это?"

ОК, мне нужно в тестере промасштабировать ТС сразу на несколько ТФ, хочу это реализовать с помощью СБ CTrade, вот пример (собранный из 2-х моих примеров): открываем каждый новый бар на 9-ти ТФ по одному ордеру, тикет запоминаем и по номеру тикета определяем закрылся ли ордер? и какое направление было у закрытого ордера?

в 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
input int TP = 100;
input int SL = 100;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CNewbar
  {
private:
   datetime          mnewtime;
   ENUM_TIMEFRAMES   mperiod;
public:
                     CNewbar()                        { mperiod=PERIOD_CURRENT;  mnewtime=TimeCurrent(); }
                     CNewbar(ENUM_TIMEFRAMES period)  { mperiod=period;          mnewtime=TimeCurrent(); }
   bool              NewBar(){ datetime t=iTime(NULL,mperiod,0); if(mnewtime<t){ mnewtime=t; return(true); } return(false);  }
  };

ENUM_TIMEFRAMES  TF[9]={PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1};
CNewbar *BAR[9];
int ticket[9];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0;i<9;i++) BAR[i]=new CNewbar(TF[i]);
   ArrayInitialize(ticket,-1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for(int i=0;i<9;i++) delete BAR[i];
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0;i<9;i++)
      if(BAR[i].NewBar())
        {
         if(ticket[i]<0) ticket[i]=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-SL*_Point,Ask+TP*_Point);
         if(OrderSelect(ticket[i],SELECT_BY_TICKET) && OrderCloseTime()>0)
           {
            int cmd=1-OrderType();
            double open=cmd ? Bid : Ask;
            double tp = open - (cmd ? 1 : -1) * TP * _Point;
            double sl = open + (cmd ? 1 : -1) * SL * _Point;
            ticket[i]=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
           }
        }
  }

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

как написать этот код в MQL5 с помощью СБ CTrade ???!!!

Igor Makanu:

хм, странная ситуация, вроде активность  в топике я поднял,  вопрос у меня был, с моей точки зрения конкретный, а вместо ответа пока получил "а зачем тебе это?"

ОК, мне нужно в тестере промасштабировать ТС сразу на несколько ТФ, хочу это реализовать с помощью СБ CTrade, вот пример (собранный из 2-х моих примеров): открываем каждый новый бар на 9-ти ТФ по одному ордеру, тикет запоминаем и по номеру тикета определяем закрылся ли ордер? и какое направление было у закрытого ордера?

в MQL4 код для тестера будет выглядеть так:

как написать этот код в MQL5 с помощью СБ CTrade ???!!!

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Vladimir Karputov, 2019.07.21 12:56

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

POSITION_IDENTIFIER

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

 

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

 

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

long


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


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


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


Vladimir Karputov:

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

какую библиотеку нужно использовать для этой цели?

Igor Makanu:

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

какую библиотеку нужно использовать для этой цели?

Ну я уже сто раз говорил - выкиньте из лексикона слово "ордер". Пока Вы этого не сделаете - Вы не сможете идти дальше. В общем я вероятно Вам не смогу помочь. Печаль.

[Удален]
Vladimir Karputov:

Ну я уже сто раз говорил - выкиньте из лексикона слово "ордер". Пока Вы этого не сделаете - Вы не сможете идти дальше. В общем я вероятно Вам не смогу помочь. Печаль.

А подскажите, как понимать это:

GN      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Ticket = 20
JF      0       16:24:14.030    Core 1  2018.06.06 08:00:00   Sell market. Identifier = 0
FQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======closePosition======
HG      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD, close #20 (0.73633 / 0.73637 / 0.73633)
PH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #21 buy 0.10 AUDUSD at 0.73637 done (based on order #21)
KJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#21 buy 0.10 AUDUSD at 0.73637]
IL      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#21 buy 0.10 AUDUSD at 0.73637]
RN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 position #20 AUDUSD [done at 0.73637]
HN      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Позиция с магиком 2544113114312914, тикетом 20 и лотом 0.1 успешно закрыта.
LO      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.06.19 16:00:00   ======checkMargin======
OF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   market buy 0.10 AUDUSD (0.73633 / 0.73637 / 0.73633)
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal #22 buy 0.10 AUDUSD at 0.73637 done (based on order #22)
RM      0       16:24:14.030    Core 1  2018.06.19 16:00:00   deal performed [#22 buy 0.10 AUDUSD at 0.73637]
DS      0       16:24:14.030    Core 1  2018.06.19 16:00:00   order performed buy 0.10 at 0.73637 [#22 buy 0.10 AUDUSD at 0.73637]
FF      0       16:24:14.030    Core 1  2018.06.19 16:00:00   CTrade::OrderSend: market buy 0.10 AUDUSD [done at 0.73637]
MJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.06.19 16:00:00   balance = 11308.94
JK      0       16:24:14.030    Core 1  2018.06.19 16:00:00   lot = 0.10
HQ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Ticket = 22
CJ      0       16:24:14.030    Core 1  2018.06.19 16:00:00   Buy market. Identifier = 20
HR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======closePosition======
FI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD, close #22 (0.74021 / 0.74025 / 0.74021)
RF      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #23 sell 0.10 AUDUSD at 0.74021 done (based on order #23)
ID      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#23 sell 0.10 AUDUSD at 0.74021]
GM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#23 sell 0.10 AUDUSD at 0.74021]
NQ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 position #22 AUDUSD [done at 0.74021]
PO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Позиция с магиком 2544113114312914, тикетом 22 и лотом 0.1 успешно закрыта.
FO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Очистка данных произведена.
CH      0       16:24:14.030    Core 1  2018.07.04 08:00:00   ======checkMargin======
OI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   market sell 0.10 AUDUSD (0.74021 / 0.74025 / 0.74021)
JO      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal #24 sell 0.10 AUDUSD at 0.74021 done (based on order #24)
LM      0       16:24:14.030    Core 1  2018.07.04 08:00:00   deal performed [#24 sell 0.10 AUDUSD at 0.74021]
ND      0       16:24:14.030    Core 1  2018.07.04 08:00:00   order performed sell 0.10 at 0.74021 [#24 sell 0.10 AUDUSD at 0.74021]
LI      0       16:24:14.030    Core 1  2018.07.04 08:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.74021]
OJ      0       16:24:14.030    Core 1  2018.07.04 08:00:00   magic = 2544113114312914
RR      0       16:24:14.030    Core 1  2018.07.04 08:00:00   balance = 11335.85
DK      0       16:24:14.030    Core 1  2018.07.04 08:00:00   lot = 0.10
PN      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Ticket = 24
QE      0       16:24:14.030    Core 1  2018.07.04 08:00:00   Sell market. Identifier = 22
NR      0       16:24:14.030    Core 1  2018.07.19 00:00:00   ======closePosition======
NF      0       16:24:14.030    Core 1  2018.07.19 00:00:00   market buy 0.10 AUDUSD, close #24 (0.73968 / 0.73989 / 0.73968)
JI      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal #25 buy 0.10 AUDUSD at 0.73989 done (based on order #25)
QK      0       16:24:14.030    Core 1  2018.07.19 00:00:00   deal performed [#25 buy 0.10 AUDUSD at 0.73989]
MM      0       16:24:14.030    Core 1  2018.07.19 00:00:00   order performed buy 0.10 at 0.73989 [#25 buy 0.10 AUDUSD at 0.73989]
PN      0       16:24:14.030    Core 1  2018.07.19 00:00:00   CTrade::OrderSend: market buy 0.10 position #24 AUDUSD [done at 0.73989]
DO      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Позиция с магиком 2544113114312914, тикетом 24 и лотом 0.1 успешно закрыта.
LP      0       16:24:14.030    Core 1  2018.07.19 00:00:00   Очистка данных произведена.
KK      0       16:24:14.030    Core 1  2018.08.08 16:00:00   ======checkMargin======
RI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   market sell 0.10 AUDUSD (0.73933 / 0.73937 / 0.73933)
GO      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal #26 sell 0.10 AUDUSD at 0.73933 done (based on order #26)
OM      0       16:24:14.030    Core 1  2018.08.08 16:00:00   deal performed [#26 sell 0.10 AUDUSD at 0.73933]
JD      0       16:24:14.030    Core 1  2018.08.08 16:00:00   order performed sell 0.10 at 0.73933 [#26 sell 0.10 AUDUSD at 0.73933]
QI      0       16:24:14.030    Core 1  2018.08.08 16:00:00   CTrade::OrderSend: market sell 0.10 AUDUSD [done at 0.73933]
HN      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Ticket = 26
CF      0       16:24:14.030    Core 1  2018.08.08 16:00:00   Sell market. Identifier = 0
Vladimir Karputov:

Ну я уже сто раз говорил - выкиньте из лексикона слово "ордер". Пока Вы этого не сделаете - Вы не сможете идти дальше. В общем я вероятно Вам не смогу помочь. Печаль.

OK? сформулирую вопрос иначе:

как используя запомненный тикет с помощью CTrade::ResultOrder()

узнать:

1. закрыта ли позиция?

2. какой тип сделки был у закрытой позиции?

3. нужна одновременная работа с 9-ю позициями, ордерами или тикетами или ... НаВашеУсмотрениеЛюбаяТерминология  на счете типа хэдж


в такой формулировке мой вопрос однозначный? (воспроизводимый пример под MQl4 выложен выше)

ЗЫ: я не могу забыть слово ордер, к сожалению это слово используется в справке наряду с другими терминами: https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/ctrade/ctraderequestorder