Ошибки, баги, вопросы - страница 662

 

Доброго времени суток!

Проверьте, пожалуйста, корректность функции, которая должна определять: находится ли открытая позиция в "заморозке".

В особенности, не перемудрил ли я с Ask/Bid?

bool IsPositionFrozen(const string Symbol) {
  if (!PositionSelect(Symbol)) return false;
  bool FreezTP = true, FreezSL = true;
  double FreezLevel = SymbolInfoInteger(Symbol, SYMBOL_TRADE_FREEZE_LEVEL) * SymbolInfoDouble(Symbol, SYMBOL_POINT);
  switch (PositionGetInteger(POSITION_TYPE)) {
    case POSITION_TYPE_BUY:
        if ((NormalizeDouble(PositionGetDouble(POSITION_TP), (int)SymbolInfoInteger(Symbol, SYMBOL_DIGITS)) == 0) ||
            (PositionGetDouble(POSITION_TP) - SymbolInfoDouble(Symbol, SYMBOL_BID) > FreezLevel))
          FreezTP = false;
        if ((NormalizeDouble(PositionGetDouble(POSITION_SL), (int)SymbolInfoInteger(Symbol, SYMBOL_DIGITS)) == 0) ||
            (SymbolInfoDouble(Symbol, SYMBOL_BID) - PositionGetDouble(POSITION_SL) > FreezLevel))
          FreezSL = false;
        break;
      case POSITION_TYPE_SELL:
        if ((NormalizeDouble(PositionGetDouble(POSITION_TP), (int)SymbolInfoInteger(Symbol, SYMBOL_DIGITS)) == 0) ||
            (SymbolInfoDouble(Symbol, SYMBOL_ASK) - PositionGetDouble(POSITION_TP) > FreezLevel))
          FreezTP = false;
        if ((NormalizeDouble(PositionGetDouble(POSITION_SL), (int)SymbolInfoInteger(Symbol, SYMBOL_DIGITS)) == 0) ||
            (PositionGetDouble(POSITION_SL) - SymbolInfoDouble(Symbol, SYMBOL_ASK) > FreezLevel))
          FreezSL = false;
      break;
    default: return false;
  }
  if (FreezTP || FreezSL) return true;
  else return false;
}
 
tol64:

Да нет, там всё правильно отработалось на сервере (демо-счёт MQ). То есть, стопы сработали в момент моего отсутствия связи. Но, когда я подключился, рынок был уже закрыт. В окне Обзор Рынка было зафиксировано время последнего тика перед тем, как связь у меня была отключена. Запрашивая историю сделок указывая в качестве второго значения TimeCurrent(), я получал не всю историю. Хотя в Справке для TimeCurrent() сказано, что:

 То есть, я так понимаю, что эта функция при наличии связи должна вернуть значение последнего прихода котировки одного из находящихся в окне Обзор Рынка инструмента с сервера даже, если был обрыв связи и соединение произошло, когда рынок был уже закрыт. В моём случае это не произошло и я получал соответственно не всю историю. Вот должна ли происходить синхронизация времени в Обзор Рынка с сервером при закрытом рынке или нет я не знаю, об этом в Справке не написано.

 В таком случае, если нужна вся история можно просто приплюсовывать число побольше, на сутки вперёд и это будет гарантом, что все сделки будут выбраны. :)

А в тестере баг с функцией HistoryDealsTotal() и проявляется он в режиме Визуализации. Время там правильно моделируется. Просто в некоторых случаях помогает костыль.


    Да, вспомнил суть, что был обрыв связи. Похоже на то, что терминал начинает сверку и докачку истории только при поступлении тика по инструменту, а выходные их нет. Можно, конечно, обновить графики вручную, тогда и последнее время сервера обновится. А если в автомате, то фиксировать обрыв связи и, если она восстановилась в уикэнд, запускать функцию проверки и загрузки истории, CheckLoadHistory(). Использовать таймер.

   Вообще, с терминалом иногда происходят "удивительные" вещи. Вот вчера, ноут работал через телефон в качестве модема. Мультивалютный эксперт работал в режиме слежения (автоторговля отключена). Отошёл на 15 минут вместе с телефоном, вернулся, подключил связь. Терминал восстановил связь с сервером. Казалось бы, докачать пропущенные котировки - раз плюнуть. Но терминал начал яростно докачивать историю - что же ещё? При этом всё замерло: обзор рынка, вкладка торговля, графики. Телефон 3G не поддерживает, а работает по EDGE, так что процедура затянулась. Когда подошло в 20 MB, решил проверить, а можно ли в таком состоянии чего-нибудь торгануть вручную? Попробовал закрыть позицию, получил отказ из-за отсутствия связи и на этом закачка прекратилась. После восстановления связи всё заработало нормально. Вот выдержка из лога терминала:

OK    0    Network    09:45:09    '709704': authorized on MetaQuotes-Demo through Access Point Singapore
IR    0    Network    09:45:09    '709704': previous successful authorization performed from 77.35.11.181 on 2012.03.04 06:10:12
KP    0    Network    09:45:12    '709704': terminal synchronized with MetaQuotes Software Corp.
GI    0    Experts    09:45:12    expert Fractals_ (EURUSD,H1) loaded successfully
OI    0    Trades    10:43:29    '709704' : deal #8671794 sell 0.10 GBPJPY at 129.268 done (based on order #9494984)                    // Эту сделку совершил эксперт, работающий на другом компьютере
RM   0    Trades    10:51:22    '709704' : deal #8671842 sell 0.10 USDJPY at 81.586 done (based on order #9495037)                     //  Аналогично
KL    1    Network    12:00:38    '709704': connection to MetaQuotes-Demo lost                                                                              // Ушёл
IE    0    Network    12:16:15    '709704': authorized on MetaQuotes-Demo through Access Point Hong Kong                                     // Пришёл
IS    0    Network    12:16:15    '709704': previous successful authorization performed from 80.83.239.67 on 2012.03.04 23:45:03
OS   0    Network    12:16:18    '709704': terminal synchronized with MetaQuotes Software Corp.                                                  // Связь восстановлена
IQ    0    Trades    12:18:12    '709704' : deal #8672388 sell 0.10 GBPCHF at 1.44540 done (based on order #9495596)                   // Эту сделку совершил эксперт, работающий на другом компьютере
DF    0    Trades    12:35:37    '709704' : instant buy 0.10 EURGBP at 0.83422                                                                               // Пробую закрыть позицию вручную, до этого шла закачка истории
IN    2    Trades    12:35:44    '709704' : failed instant buy 0.10 EURGBP at 0.83422 [Request rejected due to absence of network connection] // Отказ
JP    1    Network    12:35:44    '709704': connection to MetaQuotes-Demo lost
EI    0    Network    12:36:00    '709704': authorized on MetaQuotes-Demo through Access Point Hong Kong
IG    0    Network    12:36:00    '709704': previous successful authorization performed from 80.83.239.67 on 2012.03.05 02:16:12
PG    0    Network    12:36:08    '709704': terminal synchronized with MetaQuotes Software Corp.                                                  // Связь восстановлена, далее нормальная работа
MS   

 
Из лога видно, что до перерыва терминал работал с одним сервером, а после перерыва соединился с другим и стал закачивать историю. Можно сделать вывод, что история между разными серверами - не синхронизирована.
 
Valmars:

    Да, вспомнил суть, что был обрыв связи. Похоже на то, что терминал начинает сверку и докачку истории только при поступлении тика по инструменту, а выходные их нет. Можно, конечно, обновить графики вручную, тогда и последнее время сервера обновится. А если в автомате, то фиксировать обрыв связи и, если она восстановилась в уикэнд, запускать функцию проверки и загрузки истории, CheckLoadHistory(). Использовать таймер.

...

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

Подключился к серверу AlpariFS-MT5 для тестирования эксперта в других условиях. Тип исполнения изначально был EXECUTION_MARKET - Исполнение ордеров по рынку. Посредством своих торговых панелей открывал/закрывал позиции успешно. Затем обнаружил, что Стакан цен доступен в контекстном меню графика. Открыл его и обнаружил, что операции Buy/Sell можно произвести. В качестве теста произвёл покупку и там же в Стакане цен закрыл позицию. После этого тип исполнения счёта изменился на EXECUTION_EXCHANGE - Биржевое исполнение. Это выясняется с помощью MQL5 и также в выпадающем списке окна Ордер (F9) есть только два варианта: Биржевое исполнение и Отложенный ордер. Попытка авторизоваться заново или перезагрузить терминал не исправило проблему. И сейчас тип исполнения на демо-счёте так и остался  EXECUTION_EXCHANGE.

Я связался со службой поддержки Альпари, описал проблему и уточнил:

//---

Анатолий | 17:55
Я правильно понимаю, что на демо-счетах для MT5 на текущий момент, должен быть вариант EXECUTION_MARKET?

Sergey | 17:56
Да, верно.

//--- 

Похоже, что это баг.

 

 

В справке нет описания некоторых идентификаторов:

 

ORDER_FILLING_FOK, ORDER_FILLING_IOC и ORDER_FILLING_RETURN есть, а  ORDER_FILLING_AON и ORDER_FILLING_CANCEL нет, хотя ведут они все к одному и тому же списку с описанием.

 
tol64: а  ORDER_FILLING_AON и ORDER_FILLING_CANCEL нет, хотя ведут они все к одному и тому же списку с описанием.
Они уже упразднены, из индексов удалим тоже.
 
Rosh:
Они уже упразднены, из индексов удалим тоже.

Спасибо.

//---

Такой вопрос возник. Доступен ли сейчас конкурсный сервер для тестов с теми же ограничениями, как на конкурсе (Volume Limit 15 lot / Volume Max 5 lot)? Попробовал подключиться к старому счёту, но соединение с сервером не производится. Пробежался по всем серверам, где доступен Metatrader 5 для торговли, но нигде не нашёл ограничение на совокупный объём (Volume Limit), а нужно протестировать. Или достаточно в принципе будет ответа на вопрос, на примере с конкурсными значениями:

Есть открытая позиция и её объём 14 lot. Если я попытаюсь выставить отложенный ордер объёмом 2 lot, запрос будет отклонён? Или ордер будет установлен в указанном объёме, но исполнится в итоге частично, то есть 1 lot при условии, что позиция останется в том же объёме (14 lot).

И наоборот. Есть установленный отложенный ордер 14 lot. При попытке открыть позицию объёмом 2 lot запрос будет отклонён? 

 

 Попытаю здесь счастье, а то на "Чайниках" молчание...

 Будьте добры, разъясните, пожалуйста: https://www.mql5.com/ru/forum/3775/page113#comment_160125. Интересует также программное вычисление нужных расчётов.

 

Доброго дня.

Как обратиться к значению встроенного индикатора iADX ? А именно, к его значению заданное кол-во баров назад ? В mql4 это осуществлялось при помощи задания параметра shift.

Уже спасибо. 

Документация по MQL5: Технические индикаторы / iADX
Документация по MQL5: Технические индикаторы / iADX
  • www.mql5.com
Технические индикаторы / iADX - Документация по MQL5
Причина обращения: