Помощь с роботом МТ5 на мос бирже

 

Добрый день, есть рабочая торговая система для торговли на мос бирже. Захотелось автоматизировать и был написан робот №1. Робот имел функции стоп/профит/трал/БУ/реверс. Как результат робот в тестере открывает правильно по сигналу и правильно работает и отдельно с тралом и отдельно с БУ и в связке.

Но при торговле на реале возникает ошибка трала:

К примеру уровень срабатывания трала=50п. а шаг=20п. трал может сработать если цена дошла до 50п и перенести стоп на 0п, а может и нет и  перенести на 20п стоп когда цена дойдёт до 70п. Или может сработать и перенести на 0, но если цена пройдёт ещё 20п, может и не сработать и сработать только когда цена пройдёт сразу 40п(то есть 2 шага). А может и правильно сработать полностью. И каждый раз это по разному и нет закономерности на разных фьючерсах такая ситуация. Спред колеблется не более 5 п. Так что вряд ли он тут виноват.

В результате в тестере работает в реале нет. Так как эту проблему решить не удалось было принято решение делать робота №2.

У которого эти функции будут виртуальными, но тут получилось ещё хуже. Робот №2 и в реале и в тестере так же как и первый открывается правильно по сигналу. Но в тестере он работает только при моделировании"цены открытия" , на других вариантах выдаёт полную чушь.

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

уже думал что дело в брокере но на брокере ОТКРЫТИЕ и БКС один и тот же результат. ПРОШУ ПОМОГИТЕ!!! дело в коде или всё таки в брокере. Готов ответить на любые вопросы!



 
snithez:

КОД робота №1

КОД робота №2

Пожалуйста, вставляйте код правильно: СНАЧАЛА нажимаете кнопку  Code, И ТОЛЬКО ПОТОМ вставляете код в окно.

Но так как Ваше сообщение получится сильно большим, Вам нужно не вставлять код, а прикрепить свой код при помощи кнопки  Прикрепить файл

 
Vladimir Karputov:

Пожалуйста, вставляйте код правильно: СНАЧАЛА нажимаете кнопку  , И ТОЛЬКО ПОТОМ вставляете код в окно.

Но так как Ваше сообщение получится сильно большим, Вам нужно не вставлять код, а прикрепить свой код при помощи кнопки 

Исправил, очень прошу помочь разобраться 

Файлы:
01.mq5  30 kb
r2_8tha.mq5  34 kb
 
snithez:

Исправил, очень прошу помочь разобраться 

На всякий случай: учитывается, что на ФОРТС неттинг? Т.е., по факту, по каждому символу есть только одна позиция, равная сумме позиций, открытых всеми роботами и вручную. И, в частности, Magic и Ticket позиции будут соответствовать тому роботу, который первым её открыл, до тех пор, пока она не будет закрыта (==0).

 
JRandomTrader:

На всякий случай: учитывается, что на ФОРТС неттинг? Т.е., по факту, по каждому символу есть только одна позиция, равная сумме позиций, открытых всеми роботами и вручную. И, в частности, Magic и Ticket позиции будут соответствовать тому роботу, который первым её открыл, до тех пор, пока она не будет закрыта (==0).

не совсем понял если честно про что было это уточнение. у меня на 1 фьючерсе работатет 1 робот со своим Magic. Или вы не об этом? и как это может влиять на трал?

 
snithez:

не совсем понял если честно про что было это уточнение. у меня на 1 фьючерсе работатет 1 робот со своим Magic. Или вы не об этом? и как это может влиять на трал?

Если один и нет параллельной торговли руками, то никак. Я же написал - на всякий случай, потому как это не очевидно.

Ещё одно "на всякий случай": проверялось ли, что функция trade.PositionModify() на реальной торговле действительно каждый раз выставляет те TP/SL, которые запрашивались?

 
JRandomTrader:

Если один и нет параллельной торговли руками, то никак. Я же написал - на всякий случай, потому как это не очевидно.

Ещё одно "на всякий случай": проверялось ли, что функция trade.PositionModify() на реальной торговле действительно каждый раз выставляет те TP/SL, которые запрашивались?

TP/SL выставляются без проблем, был нюанс при неправильном выставлении sl в момент перехода сессий в течении дня , но он решён и проблем с этим нет. если без БУ и трала всё работает отлично в роботе №1 , но нужен и БУ и трал так как нет возможности автоматизировать SL и TP под волотильность.

 
snithez:




1. Выкидываем Ваши функции:

//+------------------------------------------------------------------+
int Hour()
  {
   MqlDateTime tm;
   TimeToStruct(TimeCurrent(),tm);
   return(tm.hour);
  }
//+------------------------------------------------------------------+
int Minute()
  {
   MqlDateTime tm;
   TimeToStruct(TimeCurrent(),tm);
   return(tm.min);
  }
//+------------------------------------------------------------------+
int DayOfWeek()
  {
   MqlDateTime tm;
   TimeCurrent(tm);
   return(tm.day_of_week);
  }
//+------------------------------------------------------------------+
int Day()
  {
   MqlDateTime tm;
   TimeToStruct(TimeCurrent(),tm);
   return(tm.day);
  }

вставляем одну:

bool GetTime(int &d_o_week, int &hour, int &min, int &sec)
{
  MqlDateTime tm;
  tm.year = 0;
  TimeToStruct(TimeCurrent(),tm);
  if(tm.year > 0)
  {
    d_o_week = tm.day_of_week;
    hour = tm.hour;
    min = tm.min;
    sec = tm.sec; 
    return(true);
  }
  return(false);
}

2. Выкидываем (отмеченное желтым)

int MyMarkets()
  {
   BuyCount=0;
   SellCount=0;

   for(int i=0; i<PositionsTotal(); i++)
      if(PositionGetSymbol(i)==_Symbol)
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
               BuyCount++;
            if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
               SellCount++;
           }

   return(BuyCount+SellCount);
  }

Используем

if(PositionSelect(Symbol()) == true)
  {
    //Извлекаем данные
  }

Далее посмотрю в дебагере как Ваш код будет работать на демо (завтра)

 
snithez:

TP/SL выставляются без проблем, был нюанс при неправильном выставлении sl в момент перехода сессий в течении дня , но он решён и проблем с этим нет. если без БУ и трала всё работает отлично в роботе №1 , но нужен и БУ и трал так как нет возможности автоматизировать SL и TP под волотильность.

Вот и надо для начала понять - это трал/БУ выставляют неправильные TP/SL, или они выставляют(пытаются) правильные, но те почему-то не выставляются (ещё вариант - выставляются правильные, но не срабатывают - это отдельная история).

И уже от этого плясать дальше.

 

Ещё не помешало бы везде где к цене применяется 

NormalizeDouble(prise);

поменять на 

//+------------------------------------------------------------------+
double IsNormalizePrice(double price)
  {
   double tick_size = 0;
   SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE, tick_size);
   return(NormalizeDouble(MathRound(price / tick_size) * tick_size, _Digits));
  }
//+------------------------------------------------------------------+

Возможно с ценой, что то не так, вот он и не срабатывает вовремя.

И нормализовать цену лучше когда сравниваем со стоплосом, а не когда отправляем торговый запрос на модификацию.

тип так

               if(pp-op>=TrailingStart*_Point)
                 {
                  double newStoploss = IsNormalizePrice(pp-(TrailingStart+TrailingStep-1)*_Point);             
                  if(sl<newStoploss || sl==0)
                     trade.PositionModify(ticket,newStoploss,tp);
                 }