Скачать MetaTrader 5

Не пойму что не так с OrdersTotal()?!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сотни статей помогут создать торгового робота. Заходи и изучай!
TarasBY
1739
TarasBY 2016.06.20 23:38 

Решил протестировать новые возможности МТ5, а именно хэдж-торговлю.

Есть в MQL5 аналогичная MQL4 функция OrdersTotal(). Почему в тестере она всегда возвращает 0? Часть лога:

2016.06.21 00:32:23.024 2015.01.05 16:08:00   OnTimer: Total = 0
2016.06.21 00:32:23.018 2015.01.05 16:07:00   OnTimer: Total = 0
2016.06.21 00:32:23.015 2015.01.05 16:06:40   OnTradeTransaction:  Status = ORDER_STATE_FILLED
2016.06.21 00:32:23.015 2015.01.05 16:06:40   OnTradeTransaction: Last Ticket[USDJPY]: Position = 4 | Order = 11 | Deal = 0 | Status = ORDER_STATE_FILLED
2016.06.21 00:32:23.015 2015.01.05 16:06:40   done at 1.17826
2016.06.21 00:32:23.015 2015.01.05 16:06:40   market sell 0.05 USDCAD sl: 1.19326 tp: 1.16826
2016.06.21 00:32:23.015 2015.01.05 16:06:40   OnTradeTransaction:  Status = ORDER_STATE_STARTED
2016.06.21 00:32:23.015 2015.01.05 16:06:40   order performed buy 0.07 at 119.645 [#11 buy 0.07 USDJPY at 119.692]
2016.06.21 00:32:23.015 2015.01.05 16:06:40   deal performed [#11 buy 0.07 USDJPY at 119.645]
2016.06.21 00:32:22.489 2015.01.05 15:25:00   OnTimer: Total = 0
2016.06.21 00:32:22.486 2015.01.05 15:24:40   OnTradeTransaction:  Status = ORDER_STATE_FILLED
2016.06.21 00:32:22.486 2015.01.05 15:24:40   OnTradeTransaction: Last Ticket[USDJPY]: Position = 5 | Order = 10 | Deal = 0 | Status = ORDER_STATE_FILLED
2016.06.21 00:32:22.486 2015.01.05 15:24:40   done at 1.17826
2016.06.21 00:32:22.486 2015.01.05 15:24:40   market sell 0.05 USDCAD sl: 1.19326 tp: 1.16826
2016.06.21 00:32:22.485 2015.01.05 15:24:40   OnTradeTransaction:  Status = ORDER_STATE_STARTED
2016.06.21 00:32:22.485 2015.01.05 15:24:40   order performed buy 0.07 at 119.875 [#10 buy 0.07 USDJPY at 119.901]
2016.06.21 00:32:22.485 2015.01.05 15:24:40   deal performed [#10 buy 0.07 USDJPY at 119.875]
2016.06.21 00:32:22.485 2015.01.05 15:24:40   deal #10 buy 0.07 USDJPY at 119.875 done (based on order #10)
2016.06.21 00:32:21.848 2015.01.05 14:36:00   OnTimer: Total = 0
2016.06.21 00:32:21.841 2015.01.05 14:35:00   OnTimer: Total = 0
И в OnTimer() и  в OnTick() один и тот же результат. Что не так?
Alexey Volchanskiy
16675
Alexey Volchanskiy 2016.06.21 01:07  
TarasBY:

Решил протестировать новые возможности МТ5, а именно хэдж-торговлю.

Есть в MQL5 аналогичная MQL4 функция OrdersTotal(). Почему в тестере она всегда возвращает 0? Часть лога:

И в OnTimer() и  в OnTick() один и тот же результат. Что не так?
Код приведите, разберемся
Alexander Bereznyak
21477
Alexander Bereznyak 2016.06.21 01:10  
она только для отложенных ордеров
Alexey Kozitsyn
6421
Alexey Kozitsyn 2016.06.21 08:19  
TarasBY:

Решил протестировать новые возможности МТ5, а именно хэдж-торговлю.

Есть в MQL5 аналогичная MQL4 функция OrdersTotal(). Почему в тестере она всегда возвращает 0? Часть лога:

И в OnTimer() и  в OnTick() один и тот же результат. Что не так?
В MQL5 нужно четко различать позиции, сделки и ордера. Функция OrdersTotal() для MQL4 и MQL5 несут разный смысл.
TarasBY
1739
TarasBY 2016.06.21 11:53  

Из высказанного можно сделать вывод, что данная функция в целях учёта ордеров (рыночных) на хэдж-счетах бесполезна. И всё, что связано с вызовом позиций придётся "майстырить" типа такой конструкции:

bool CMyTrade::MoveSL()
{
    SymbolInfoTick (symbol, LastTick);
    double CurrentSL = 0.;
    double CurrentTP = 0.;
    if (AccountInfoInteger (ACCOUNT_MARGIN_MODE) == ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
    {
        ulong li_Ticket, li_N = 0, li_IND;
        for (int li_ORD = PositionsTotal() - 1; li_ORD >= 0; li_ORD--)
        {
            li_Ticket = PositionGetTicket (li_ORD);
            if (li_Ticket <= 0) continue;
            li_IND = fGet_INDInArray (PositionGetString (POSITION_SYMBOL), bsa_SMB);
            if (li_IND < 0) continue;
            if (li_IND != fGet_INDInArray ((int) PositionGetInteger (POSITION_MAGIC), bia_MG)) continue;
            CurrentSL = PositionGetDouble (POSITION_SL);
            CurrentTP = PositionGetDouble (POSITION_TP);
            if (PositionGetInteger (POSITION_TYPE) == OP_SELL)
            {
                
                cTrade.SetExpertMagicNumber (MagicNr);
                if (NormalizeDouble ((CurrentSL - LastTick.ask) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.)
                if (cTrade.PositionModify (li_Ticket, NormalizeDouble ((CurrentSL - TrailingStopLossStep * Pip), Dig), CurrentTP))
                {
                    li_N++;
                    Comment (__FUNCTION__, ": ", symbol, "[", li_Ticket, "] Sell MoveSL!");
                }
            }
            else if (PositionGetInteger (POSITION_TYPE) == OP_BUY)
            {
                cTrade.SetExpertMagicNumber (MagicNr);
                if (NormalizeDouble ((LastTick.bid - CurrentSL) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.)
                if (cTrade.PositionModify (li_Ticket, NormalizeDouble ((CurrentSL + TrailingStopLossStep * Pip), Dig), CurrentTP))
                {
                    li_N++;
                    Comment (__FUNCTION__, ": ", symbol, "[", li_Ticket, "] Buy MoveSL!");
                }
            }
        }
        if (li_N > 0) return (true);
    }
    else if (PositionSelect (symbol))
    {
        if (PositionGetInteger (POSITION_MAGIC) == MagicNr)
        {
            if (PositionGetInteger (POSITION_TYPE) == OP_BUY)
            {
                CurrentSL = PositionGetDouble (POSITION_SL);
                CurrentTP = PositionGetDouble (POSITION_TP);
                cTrade.SetExpertMagicNumber (MagicNr);
                if (NormalizeDouble ((LastTick.bid - CurrentSL) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.)
                if (cTrade.PositionModify (symbol, (CurrentSL + TrailingStopLossStep * Pip), CurrentTP)) return (true);
            }
            if (PositionGetInteger (POSITION_TYPE) == OP_SELL)
            {
                cTrade.SetExpertMagicNumber (MagicNr);
                CurrentSL=PositionGetDouble(POSITION_SL);
                CurrentTP=PositionGetDouble(POSITION_TP);
                if (NormalizeDouble ((CurrentSL - LastTick.ask) - (StopLoss + TrailingStopLossStep) * Pip, Dig) > 0.)
                if (cTrade.PositionModify (symbol, (CurrentSL - TrailingStopLossStep * Pip), CurrentTP)) return (true);
            }
        }
    }
    return(false);
}

Или есть другие варианты? Повторюсь, что интересует в первую очередь хэдж-торговля.

P.S. Спасибо всем откликнувшимся.

MetaQuotes
Админ
24949
Renat Fatkhullin 2016.06.21 12:05  

Вывод неверный.

Перебор открытых позиций идет через PositionXXX функции, а отложенных ордеров через OrderXXX.

Почитайте раздел документации про торговые функции, пожалуйста.

TarasBY
1739
TarasBY 2016.06.21 15:21  
Renat Fatkhullin:

Вывод неверный.

Перебор открытых позиций идет через PositionXXX функции, а отложенных ордеров через OrderXXX.

Почитайте раздел документации про торговые функции, пожалуйста.

Приказ на открытие отложенного ордера - это ордер [разобрались]. А приказ на открытие рыночной позиции - это не ордер?
Alexey Kozitsyn
6421
Alexey Kozitsyn 2016.06.21 16:26  
TarasBY:
Приказ на открытие отложенного ордера - это ордер [разобрались]. А приказ на открытие рыночной позиции - это не ордер?
Насколько я помню, это последовательно ордер-сделка-позиция.
TarasBY
1739
TarasBY 2016.06.21 20:42  
Alexey Kozitsyn:
Насколько я помню, это последовательно ордер-сделка-позиция.

Для неттинга такая последовательность понятна (с учётом того, что позиция - это результат нескольких сделок\ордеров по одному инструменту, и понятие "торговый ордер" теряет смысл). А для хэджа? Когда каждую позицию можно приравнять к "торговому ордеру"?

Ладно, в философию работы с торговыми приказами в МТ5 я немножко "въехал". :)

Может кто подскажет нормальный класс\библиотеку работы  с торговыми приказами? Чтобы правильно обрабатывались исключения (реквоты, занятость сервера, MODE_STOPLEVEL, MODE_FREEZELEVEL, ERR = 130 [модификация СТОПОВ одним и тем же значением - как в МТ4] и т.д. и т.п.)?

...а ещё, чтобы хэдж учитывала... ;)

Alexey Volchanskiy
16675
Alexey Volchanskiy 2016.06.21 21:01  
Alexey Kozitsyn:
Насколько я помню, это последовательно ордер-сделка-позиция.

Это для неттинга. Для хеджа, как я понимаю в терминологии, позиция (совокупная) не существует. А вообще, надо бы составить Краткий Терминологический Словарь ))

А то и правда имеет место быть  путаница.

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