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

 

Помогите найти минимальный отступ в пунктах от цены открытия позиции до уровней стоп-лосс и тейк-профит, чтоб не поставить их через чур близко от цены открытия и не нарваться на ошибку 10016 (TRADE_RETCODE_INVALID_STOPS). Пробовал с помощью SymbolInfoInteger (см. код ниже), но такой расчёт возвращает 0. Если кто может подкиньте идею как правильно рассчитать.

void OnStart()
  {
   long stopLevel;
   if(SymbolInfoInteger("EURUSD",SYMBOL_TRADE_STOPS_LEVEL,stopLevel))
      Print("stopLevel = ",stopLevel);
  }
 
Maxim Khrolenko:

Помогите найти минимальный отступ в пунктах от цены открытия позиции до уровней стоп-лосс и тейк-профит, чтоб не поставить их через чур близко от цены открытия и не нарваться на ошибку 10016 (TRADE_RETCODE_INVALID_STOPS). Пробовал с помощью SymbolInfoInteger (см. код ниже), но такой расчёт возвращает 0. Если кто может подкиньте идею как правильно рассчитать.


0 - нет ограничения. Но есть еще SYMBOL_SESSION_PRICE_LIMIT_MIN и SYMBOL_SESSION_PRICE_LIMIT_MAX.
 
fxsaber:

0 - нет ограничения. Но есть еще SYMBOL_SESSION_PRICE_LIMIT_MIN и SYMBOL_SESSION_PRICE_LIMIT_MAX.
Хмм, в таком случае хотелось бы чтоб SYMBOL_TRADE_STOPS_LEVEL как-то работал по другому. Если 0 - без ограничений, то теоретически при отправке .PositionOpen(...) на сервер можно было бы поставить стопы на 1 пункт (по 5-знаку) от цены открытия, но тут 100% выскочит ошибка TRADE_RETCODE_INVALID_STOPS. Пока я в тупике.
 
Maxim Khrolenko:
Хмм, в таком случае хотелось бы чтоб SYMBOL_TRADE_STOPS_LEVEL как-то работал по другому. Если 0 - без ограничений, то теоретически при отправке .PositionOpen(...) на сервер можно было бы поставить стопы на 1 пункт (по 5-знаку) от цены открытия, но тут 100% выскочит ошибка TRADE_RETCODE_INVALID_STOPS. Пока я в тупике.

А так?

 if(stoplevel==0) stoplevel=SymbolInfoInteger(symb,SYMBOL_SPREAD);
 
Что-то снова сотворили с тестером - 1586. Советник для воспроизведения
#include <MT4Orders.mqh>

// Metaquotes-Demo, RTS-6.17, 2017.04.07 - 2017.04.08, на основе реальных тиков, начальный баланс 100000
void OnTick()
{  
  static int Type = OP_BUY;

  MqlTick Tick;    
  
  if (OrderSelect(0, SELECT_BY_POS) && (OrderType() <= OP_SELL))
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);    
  else if ((OrdersTotal() == 0) && SymbolInfoTick(_Symbol, Tick) && (Tick.bid != 0) && (Tick.ask != 0))
  {
    OrderSend(_Symbol, Type + OP_BUYLIMIT, 1, (Type == OP_BUY) ? Tick.ask : Tick.bid, 0, 0, 0);
    
    Type = OP_SELL - Type;
  }    
}

На каждом тике либо ставит лимитник по текущей цене (чтобы сразу исполниться), либо закрывает позицию. Т.е. позиций должно быть очень много. Но это не так, т.к. лимитники перестали исполняться. Вот конец лога, это показывающий

2017.04.20 12:47:41.885 2017.04.07 10:00:00   sell limit 1.00 RTS-6.17 at 114060 (114060 / 114180 / 113770)
2017.04.20 12:47:41.885 2017.04.07 23:44:59   order canceled due end of test [#140 sell limit 1.00 RTS-6.17 at 114060]
2017.04.20 12:47:41.885 final balance 91195.12 RUR
2017.04.20 12:47:41.885 RTS-6.17,M1: 327182 ticks, 788 bars generated. Test passed in 0:00:00.218.

SellLimit был выставлен по Bid, но так и не исполнился.

В 1585 все с этим было в норме.

 
fxsaber:
Что-то снова сотворили с тестером - 1586.

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

 

В СД не могу отправить ответ. На минуту задумывается и выдает

 
fxsaber:

В СД не могу отправить ответ. На минуту задумывается и выдает

Это новая разновидность бана)))
 
stringo:

Да, отсортированы по времени. Начальная запись ищется двоичным поиском.

Медленный двоичный поиск получается
#include <MT4Orders.mqh>

// Metaquotes-Demo, Netting, RTS-6.17, 2017.04.06 - 2017.04.07, на основе реальных тиков, начальный баланс 10000000 RUR
void OnTick()
{  
  static bool Error = false;  
  static int Type = OP_BUY;
  
  if (Error)
    return;
  
  MqlTick Tick;    

  if (OrderSelect(0, SELECT_BY_POS) && (OrderType() <= OP_SELL))
  {
    const datetime PosTime = (datetime)::PositionGetInteger(POSITION_TIME);      
    HistorySelect(PosTime, PosTime);

    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);   
  }
  else if ((OrdersTotal() == 0) && SymbolInfoTick(_Symbol, Tick) && (Tick.bid != 0) && (Tick.ask != 0))
  {
    Error = (OrderSend(_Symbol, Type + OP_BUYLIMIT, 1, (Type == OP_BUY) ? Tick.ask : Tick.bid, 0, 0, 0, "", 0, 0, INT_MAX) == -1);        
    
    if (!Error)
    {
      OrderSend(_Symbol, Type + OP_BUYLIMIT, 1, (Type == OP_BUY) ? Tick.ask : Tick.bid, 0, 0, 0);
      
      Type = OP_SELL - Type;
    }    
  }
}

Без розовых строк работает быстро. С ними - очень медленно (на несколько порядков). Каждый HistorySelect(PosTime, PosTime) выбирает не больше нескольких десятков записей из истории. Но на что тогда расходуются все вычислительные ресурсы? Неужели просто на копирование этих десятков записей на каждом тике?

 

И снова я столкнулся с проблемой расхождения в работе одного и того же советника в тестере и в риалтайм. Сначала думал что из за того что индикаторы сложные. Потом подключил встроенный Bands. Та же фигня.

Схема работы простая.

OnInit - получаю хэндл индикатора

OnTick - анализ (копирование в буфер показателей) и торговля

OnDeinit - освобождаю хэндл.

Для проверки сделал следующее. Изменил алгоритм в риалтайм по схеме:

OnTick - получаю хэндл индикатора, анализ (копирование в буфер показателей) и торговля, освобождаю хэндл.

И о чудо ! Все стало совпадать с тестером !

Вот что это ? Баг ? Или еще что то.....