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

 
fxsaber:

ACCOUNT_PROFIT в тестере показывает ерунду.


Добавлю:

1. для биржевых инструментов

Как следствие, неправильно оцениваются эквити, просадка и т.д.

2. а так же неверно работает логика советника при ориентировании на суммарный профит/убыток позиций.

ориентируемся на показания ACCOUNT_PROFIT при закрытии.

2017.04.20 11:30:26.318 Core 1  2017.04.17 18:02:46   Профит = 333.01

при закрытии терминал пересчитывает профит и в итоге имеем

закрываем по убытку

2017.04.20 11:30:26.318 Core 1  2017.04.17 22:02:08   Профит = -338.66

в итоге получаем

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
//--- global variable
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
input     string symb="GOLD-6.17";
input     string symb1="GOLD-9.17";
input     double  ТП  =333;
datetime date1;
double i1,ask1,ask2,bid1,bid2,last1,last2,profit;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  double price1=SymbolInfoDouble(symb,SYMBOL_BID);
  double price2=SymbolInfoDouble(symb1,SYMBOL_BID);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
Comment("");
   }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {
//---
      profit=AccountInfoDouble(ACCOUNT_PROFIT);
      Comment("ПРофит = ",profit);
     if(PositionsTotal()==0 )
     {
      m_trade.Buy(1.00,symb);
      m_trade.Buy(1.00,symb1);    
     }

   if( MathAbs(profit)>=ТП )
     {
      Print("Профит = ",profit);
     CloseAll();
     }

  }  
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         m_trade.PositionClose(m_position.Ticket());
  }
//+------------------------------------------------------------------+

 
kaus_bonus:

Добавлю:

В СД разбираемся...
 
Slawa:
Видимо, я что-то не понимаю в HFT. Насколько я знаю, когда торгуешь "очень быстро", то тебе нет никакого дела до предыдущих сделок.

HFT привел в качестве примера ТС, которая просто совершает много сделок.

Можно запустить прогон за большой период какого-нибудь скальпера. Главное, чтобы было много сделок (десятки тысяч). Тогда проявятся минусы текущей реализации работы с историей.


Ситуация сейчас такая. Если много сделок, не обращайся к истории.

 
fxsaber:
В СД разбираемся...


это здорово.

достаточно убрать использование LAST цены,чтобы получить адекватные результаты

 

Помогите найти минимальный отступ в пунктах от цены открытия позиции до уровней стоп-лосс и тейк-профит, чтоб не поставить их через чур близко от цены открытия и не нарваться на ошибку 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.

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