Напишу советник бесплатно - страница 149

 
DDM77:
После проверки работоспособности бота возможен официальный заказ

Красиво сказано :)

 
Александр:

пара изменений

а что конкретно изменено? 

 

Здравствуйте, коллеги.

Тема еще актуальна? Есть меценаты, кто готов дописать робота бесплатно?

Нужен помощник, кто хорошо кодит в .mq4

Сам я тоже программирую, но вот с mq4 пока дела не оч. Есть некоторые задачи, которые я либо не знаю как описать, либо они не отрабатывают.

Есть простая скальпинг стратегия (М15-М30) и начально написанный робот. Его надо довести до ума.

Стратегия (не моя, ссылку на сайт приводить не буду, чтоб не посчитали за рекламу):

RVI 50

EMA 9

EMA 100

Условия входа для длинной позиции:

EMA9 пересекает EMA100 снизу вверх, при этом индикатор RVI должен пересекать нулевую линию также снизу вверх или быть выше нулевой линии. При выполнении этих условий открываем позицию на покупку. Стоп-лосс размещаем на 2-3 пункта ниже ближайшего минимума. Тейк-профит в 1,5-2 раза больше, чем стоп лосс.

Условия входа для короткой позиции:

EMA9 пересекает EMA100 сверху вниз, при этом индикатор RVI должен пересекать нулевую линию также сверху вниз или быть ниже нулевой линии. При выполнении этих условий открываем позицию на продажу. Стоп-лосс размещаем чуть выше ближайшего максимума. Тейк-профит в 1,5-2 раза больше, чем стоп лосс.


Примитивного робота написал, но он сливает, т.к. надо допиливать то, что не работает, плюс, возможно, у кого-то есть наметки как фильтровать ложные сигналы? (они естественно есть)...

Что не работает и надо допилить:

1. Стоп-лосс и тейк-профит установлены фикс 100 и 200 соответственно, этих уровней не хватает. Надо сделать калькуляцию расчета минимума/максимума стоп-лосс из набора свечей за последние Х баров (количество баров Х устанавливаем как входной параметр), от него рассчитать тейк, сам не знаю как это реализовать. Самый важный пункт, т.к. робот сливает именно из-за закрытия по стопу, хотя сигнал был верный и дальше пошел бы профит.

2. Робот почему-то открывает (на тестере) в некоторых тиках несколько ордеров на одном баре, хотя проверка открытия ордера на одном баре стоит (заимствована с данного форума), но не работает. Доработать проверку, разобраться почему не отрабатывает.

3. Дописать трейлинг стоп (входящие параметры робота) при достижении БУ определенного уровня, например 1/2 от рассчитанного ТП (возможно тоже указывать коэф БУ в параметрах, например от 0,3 до 0,7). Отдельно трейлинг описан в роботе (код взят с данного форума), но не учитывает БУ. К тому же почему-то на тестере не отрабатывает, надо разобраться почему.

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

5. Мартингейл. Фильтрация сигналов... (факультатив)


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

 

С пунктом 1 разобрался. нашел как считать цену по истории баров через iLowest/iHighest )) за крайние пол года истории показатель прибыльности чуть вырос) на всей истории сливает (

С пунктом 2 все еще непонятки.

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

 

по второму пункту:

datetime current, last=0;
int shift=1;

void OnTick()
   {
   current=iTime(symbol,frame,shift);
   //ограничение на торговлю вне начала бара
   if(last==current) return;
   last=current;

   }

по третьему пункту:

//трейлинг рыночных ордеров, стоплосс держится на расстоянии Distance от самой экстремальной тени из последних History баров 
int DoTrailOrder(int ePosition, int eMagicNumber, double eDistance, int eHistory, string eSymbol, int eTimeFrame)
   {
   if(!OrderSelect(ePosition,SELECT_BY_POS,MODE_TRADES)) return(1);
   int eType=OrderType();
   if(eType!=OP_BUY && eType!=OP_SELL) return(0);
   if(OrderMagicNumber()!=eMagicNumber) return(0);
   if(OrderSymbol()!=eSymbol) return(0);
   //наблюдаем начиная с бара следующим за баром открытия
   if(iBarShift(eSymbol,eTimeFrame,OrderOpenTime())==0) return(0);
   int eDigits=(int)MarketInfo(eSymbol,MODE_DIGITS);
   double ePoint=MarketInfo(eSymbol,MODE_POINT);
   double eSpread=MarketInfo(eSymbol,MODE_SPREAD);
   double eExtremum;
   if(eType==OP_BUY)
      {
      //стоп устанавливается на расстоянии eDistance от самой низкой тени бара из истории eHistory
      eExtremum=iLow(eSymbol,eTimeFrame,iLowest(eSymbol,eTimeFrame,MODE_LOW,eHistory,1));
      //расстояние от минимума до StopLoss должно превысить TrailingLevel
      if(NormalizeDouble(eExtremum-OrderStopLoss(),eDigits)<=eDistance*ePoint) return(0);
      //расстояние от минимума до цены открытия должно превысить TrailingLevel
      if(NormalizeDouble(eExtremum-OrderOpenPrice(),eDigits)<=eDistance*ePoint) return(0);
      //новый стоп должен быть не ближе к текущей цене, чем на два спреда
      if(NormalizeDouble(MarketInfo(eSymbol,MODE_BID)+eDistance*ePoint-eExtremum,eDigits)<=2*eSpread*ePoint) return(0);
      if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(eExtremum-eDistance*ePoint,eDigits),OrderTakeProfit(),OrderExpiration(),clrBlue)) return(-1);
      }
   if(eType==OP_SELL)
      {
      //стоп устанавливается на расстоянии eDistance от самой высокой тени бара из истории eHistory
      eExtremum=iHigh(eSymbol,eTimeFrame,iHighest(eSymbol,eTimeFrame,MODE_HIGH,eHistory,1));
      if(NormalizeDouble(OrderStopLoss()-eExtremum,eDigits)<=(eDistance+eSpread)*ePoint && OrderStopLoss()!=0) return(0);
      if(NormalizeDouble(OrderOpenPrice()-eExtremum,eDigits)<=(eDistance+eSpread)*ePoint) return(0);
      //один спред между Ask и Bid сократился
      if(NormalizeDouble(eExtremum+eDistance*ePoint-MarketInfo(eSymbol,MODE_ASK),eDigits)<=eSpread*ePoint) return(0);
      if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(eExtremum+(eDistance+eSpread)*ePoint,eDigits),OrderTakeProfit(),OrderExpiration(),clrRed)) return(-1);
      }
   return(0);
   }
 

Трейлинг стоп может повысить матожидание, но не улучшает прибыльность. Будет недобор прибыли на шумном рынке, где цена выбивает вновь притраленный стоп, когда без него прибыль могла быть и больше.

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

благодарю за подсказки по 2,3 пункту. буду тестить.

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

по поводу недобора прибыли на шумном рынке, ну дык и трейлить хочу не просто так, а при достижении определенного уровня. недобор будет, но и не будет больших просадок. в общем тут надо тоже подумать))

спасибо

 

Дмитрий, по трейлингу - это информация уже оттестированная множеством людей не раз. Наверху код трейлинга, пожалуй лучший из всех. Но и он не лишён этого недостатка.

Пробуйте, всё надо попробовать.

 
Ivan:

а что конкретно изменено? 

Где-то уже давал. Вот еще.

Файлы:
 
Дмитрий Хлыстов:

благодарю за подсказки по 2,3 пункту. буду тестить.

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

по поводу недобора прибыли на шумном рынке, ну дык и трейлить хочу не просто так, а при достижении определенного уровня. недобор будет, но и не будет больших просадок. в общем тут надо тоже подумать))

спасибо

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

Причина обращения: