Oxy
..ιllιlι.lι.ιllι.ιlι..

 
Уровень 27

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Советник на основе Slope_Direction_Line

Приветствую!
Есть одна стратегия. Проверить надо. Буду очень признательна, если по ней напишите советник mql4.
В ней используется индикатор Slope_Direction_Line_ Я его немного доработала, поэтому сам индикатор прилагаю:
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue

extern int period = 60; // период
extern double FilterNumber = 2.0; // фильтр
extern int ma_method = 3; // период усреднения 0-3
extern int applied_price = 0; // цена 0-6

double MA_Buffer[];
double Dntrend[];
double Uptrend[];

int init() {
   int startDraw = MathSqrt(period) + period + 1.0; // от куда рисуем линию - с 89 бара при периоде 80
   IndicatorShortName("Slope_Direction_Line_(" + period + ")"); // название при наведении
   IndicatorBuffers(3);
   SetIndexBuffer(2, MA_Buffer);
   SetIndexBuffer(0, Dntrend);
   SetIndexBuffer(1, Uptrend);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexDrawBegin(0, startDraw);
   SetIndexDrawBegin(1, startDraw);
   return (0);
}	   		 				     							  		 	 	    
int deinit() {
   return (0);
}	   		   	 	 		  		 	 		 	    			   		
int start() {
   int counted_bars = IndicatorCounted(); // количество баров, не измененных после последнего вызова индикатора
   if (counted_bars<0) return (-1);
   //---- последний посчитанный бар будет пересчитан
   if (counted_bars>0) counted_bars--;   
   int limit = Bars - counted_bars; 
   
   int shift_MA = limit;
   for (shift_MA = limit; shift_MA >= 0; shift_MA--) MA_Buffer[shift_MA] = 2.0 * f_iMA(shift_MA, period / FilterNumber) - f_iMA(shift_MA, period);
   for (shift_MA = limit; shift_MA >= 0; shift_MA--) Dntrend[shift_MA] = iMAOnArray(MA_Buffer, 0, MathSqrt(period), 0, ma_method, shift_MA);
   for (shift_MA = limit; shift_MA >= 0; shift_MA--)
      if (Dntrend[shift_MA] > Dntrend[shift_MA + 1]) Uptrend[shift_MA] = Dntrend[shift_MA];
      else Uptrend[shift_MA]=EMPTY_VALUE;
   return (0);
}	 	  		    		 		  		  											  			 	  	
double f_iMA(int shift, int ma_period) {
   return (iMA(Symbol(), 0, ma_period, 0, ma_method, applied_price, shift));
}

Параметры:
double indSlope1  = iCustom(NULL, 0, "Slope_Direction_Line_", 60, 2, 3, 0, 0, 0);

— значение индикатора (и синей линии и красной), переменная есть всегда

double indSlope2  = iCustom(NULL, 0, "Slope_Direction_Line_", 60, 2, 3, 0, 1, 0); 

— если значение равно EMPTY_VALUE (indSlope2==EMPTY_VALUE), то значит тренд вниз, линия красная; если значение есть (indSlope2==indSlope1), то линия синяя, тренд вверх.

//+------------------------------------------------------------------+

Сама стратегия.
Для любого тайм-фрейма значение индикатора будет неизменным. Планирую тестировать на парах eur/usd, gbp/usd. 5 знаков.
1)
Тренд вниз — у индикатора красная линия. Цена пересекает красную линию снизу вверх. Образуя над ней вершину (А). 3-7 свечей над линией. Потом цена возвращается к линии индикатора (В). Расстояние от А до В не менее 30 пунктов (на 5 знаках). В тот момент, когда цена касается линии индикатора в точке B (+-5 пунктов на 5 знаках), выставляется buy-stop на уровне линии A, учитывающий спрэд.
Если цена закрылась ниже линии индикатора — buy-stop убираем.
Если на линии осталась только тень свечи, и цена пошла вверх, отработав наш buy-stop, то выставляются stop-loss и take-profit.
stop-loss ставим ниже точки В, учитывая спрэд.
take-profit = (АВ) * 2, плюс учитывая спрэд. Цифру 2, просьба, вынести в отдельную переменную. Планируется с ней поэкспериментировать.

2)
Тренд вверх — у индикатора синяя линия. Цена пересекает синюю линию сверху вниз. Образуя под ней впадину (А). 3-7 свечей под линией. Потом цена возвращается к линии индикатора (В). Расстояние от А до В не менее 30 пунктов (на 5 знаках). В тот момент, когда цена касается линии индикатора в точке B (+-5 пунктов на 5 знаках), выставляется sell-stop на уровне линии A, учитывающий спрэд.
Если цена закрылась выше линии индикатора — sell-stop убираем.
Если на линии осталась только тень свечи, и цена пошла вниз, отработав наш sell-stop, то выставляются stop-loss и take-profit.
stop-loss ставим выше точки В, учитывая спрэд.
take-profit = (ВА) * 2, плюс учитывая спрэд.

Вот и вся стратегия.
  • +5
  • Просмотров: 8217
  • 19 ноября 2014, 20:07
  • Oxy
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Кому нужен советник по стратегии Кипятка?
19 ноября 2014
19 ноября 2014

Брокер для ваших роботов, 15 лет на рынке

Комментарии (30)

+
+1
сделаю. вынесу во входные переменные расстояние АВ, цифру 2, касание точки В, 3-7 свечей и др. :) 
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 19 ноября 2014, 20:18
+
0
спасибо!
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 19 ноября 2014, 20:47
+
0
т.к. индикатор не возвращает значения красной линии советник не открывает позиции.



вот то что пока удалось сделать:


//+------------------------------------------------------------------+
//|                                                          Oxy.mq4 |
//|                                            Copyright © 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Slope Directional Line expert advisor"


//--- Inputs
extern int StopLoss     = 500; // стоп лосс ордера
extern int TakeProfit   = 500; // тейк профит ордера
extern int CountCandle  = 7;   // тейк профит ордера
extern int Delta        = 100; // расстояние AB
extern double Lots      = 0.1; // объем позиции

//----
extern int period       = 90;  // период средней Slope Directional Line
extern int method       = 2;   // метод средней(SMA=0,EMA=1,SMMA=2,LWMA=3)
extern int price        = 0;   // цена по которой строится средняя
//----
extern int MAGIC        = 333; // магик
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int    res,pos;
//--- get Moving Average 
   double SlopeBlue=iCustom(Symbol(),0,"Slope",period,method,price,1,1);
   double SlopeRed=iCustom(Symbol(),0,"Slope",period,method,price,0,1);
   double SlopeBlueShift=iCustom(Symbol(),0,"Slope",period,method,price,1,CountCandle);
   double SlopeRedShift=iCustom(Symbol(),0,"Slope",period,method,price,0,CountCandle);
   double up=iHigh(Symbol(),0,iHighest(NULL,0,MODE_HIGH,CountCandle,1));
   double dn=iLow(Symbol(),0,iLowest(NULL,0,MODE_LOW,CountCandle,1));
   Comment("\nSlope Blue ",SlopeBlue,"\nSlope Red ",SlopeRed);   
      
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
       {
        if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
         {
          if(OrderType()==OP_BUY) pos++;
          if(OrderType()==OP_SELL)pos++;
         }
       }  
     }         

    
   //--- sell conditions
   if(SlopeBlueShift==SlopeRedShift)                //линия синяя CountCandle свечей назад
     if(Close[0]<SlopeBlueShift)                    //цена ниже синей линии CountCandle свечей назад 
       if(Close[CountCandle]>SlopeBlueShift)        //цена CountCandle свечей назад была выше синей линии
         if(Bid-dn>=Delta*Point                     //цена касается линии
            && OrdersTotal()<1)
             {
              res=OrderSend(Symbol(),OP_SELLSTOP,Lots,dn,3,dn+StopLoss*Point,dn-TakeProfit*Point,"",MAGIC,0,Red);
              return;
             }
      //--- buy conditions
   if(SlopeBlueShift!=SlopeRedShift)                //линия красная CountCandle свечей назад  
      if(Close[0]>SlopeRedShift)                    //цена выше красной линии CountCandle свечей назад 
         if(Close[CountCandle]<SlopeRedShift)       //цена CountCandle свечей назад была ниже красной линии
           if(up-Ask>=Delta*Point                   //цена касается линии
              && OrdersTotal()<1)
               {
                res=OrderSend(Symbol(),OP_BUYSTOP,Lots,up,3,up-StopLoss*Point,up+TakeProfit*Point,"",MAGIC,0,Blue);      
                return;
               }
         
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());       
    }    
  }
//+------------------------------------------------------------------+
bool NewBar()
  {
   static datetime lastbar = 0;
   datetime curbar = Time[0];
   if(lastbar!=curbar)
   {
      lastbar=curbar;
      return (true);
   }
   else
   {
      return(false);
   }
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   double SlopeBlue=iCustom(Symbol(),0,"Slope",period,method,price,1,1);
   double SlopeRed=iCustom(Symbol(),0,"Slope",period,method,price,0,1);  
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
   if(NewBar()==true)
    {
     if(Close[1]<SlopeBlue)DelOrder();
        
     OpenPos();
    }
//---
  }
//+------------------------------------------------------------------+


Редактирован: 20 ноября 2014, 13:29
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 20 ноября 2014, 10:46
+
+1
спасибо! пойду смотреть.
Значение красной линии при indSlope2==EMPTY_VALUE можно узнать у indSlope1. (indSlope1 — возвращает значение линии, в не зависимости, красной или синей)
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 20 ноября 2014, 14:56
+
0
ok. это радует
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 20 ноября 2014, 15:14
+
+1
Я сейчас сижу разбираюсь в вашем коде. Потом скину, что у меня получится.
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 20 ноября 2014, 15:55
+
0
это только предварительный вариант. я чуть позже все поправлю чтобы как можно ближе к ТЗ было.
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 20 ноября 2014, 16:09
+
0
Да мне интересна сама идея, как вы это реализуете. Я сама программирую, но я в тупике, как эту стратегию кодом описать.
Проблема в том, что индикатор Slope_Direction_Line_ тоже считает на каждом тике. Т.е. вот это утверждение не верно:
double SlopeRedShift=iCustom(Symbol(),0,"Slope_Direction_Line_",period,method,price,0,CountCandle);

Посылая CountCandle мы хотим получить значение индикатора столько-то свечей назад. А мы то получим столько-то тиков назад.
Или это я запуталась и всё верно??? Но нам же надо от 3-х до 7-ми свечей назад. Циклом делать?

Я закрыла глаза, что у моего индикатора переменных на одну больше (это я и сама подправлю):
iCustom(NULL, 0, "Slope_Direction_Line_", period, FilterNumber, method, price, 0, CountCandle);

Редактирован: 20 ноября 2014, 16:33
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 20 ноября 2014, 16:23
+
0
Я смотрю, вы сразу посылаете StopLoss и TakeProfit, когда ставите SELLSTOP и BUYSTOP. Я не подумала, что так тоже можно. И так проще даже.
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 20 ноября 2014, 16:40
+
0
я сейчас тоже подключаюсь. посмотрим что у нас получится? :) 
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 20 ноября 2014, 16:44
+
0
Конечно! Я только рада! Будут идеи — скидывайте. Любые. Завтра (в пятницу) буду посвободнее, помедитирую еще над ним.
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 21 ноября 2014, 00:04
+
+1
это граля что ли? *good*  просадка минимальная

avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 21 ноября 2014, 01:10
+
0
Можно посмотреть код измененный? Мы его еще допилим до грааля.
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 21 ноября 2014, 11:12
+
+1
конечно можно. код очень простой.
в базе: www.opentraders.ru/downloads/512/
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 21 ноября 2014, 15:07
+
0
Здорово! Спасибо, что в коде сохранили в комментариях первый код.
Буду над советником мудрить.
Если домудрю что-то дельное — скину.
Мне нравится, что вы нашли простое решение.
А то меня в коде часто заносит… *neo* 
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 21 ноября 2014, 18:04
+
0
Внимательно посмотрела код. Это немножко другая стратегия, чем у меня. Но тоже имеющая право на жизнь <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; 
Доделаю на выходных до своей, если получится
Редактирован: 21 ноября 2014, 21:58
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 21 ноября 2014, 21:52
+
0
Чуть переделала — точнее к своей стратегии.
Но пока результаты вашего сова мне нравятся больше :D 
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 22 ноября 2014, 01:06
+
0
У меня вопрос. Советник открывает сделки в реале? Пробовал в тестере — всё отлично! Поковырялся с параметрами, выходит весьма не плохо. Решил погонять на демке, поставил в пятницу, а он как не живой. Хотя, по результатам тестера, в пятницу сделки были. Я уж думал, может ему другой советник мешает, который на терминале стоит. Хотя, магики разные… В чём может быть проблема?
avatar

  16  Krokus377 Сообщений: 226 - Андрей

  • 29 ноября 2014, 21:09
+
0
поставлю на демо посмотрю в чем дело.
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 29 ноября 2014, 21:17
+
0
Ну а я, попробую поставить на отдельный терминал, где других советников нет.
avatar

  16  Krokus377 Сообщений: 226 - Андрей

  • 29 ноября 2014, 21:22
+
0
Всё работает. Видимо, мешал ему другой советник, но так быть не должно, магики ведь, разные.
avatar

  16  Krokus377 Сообщений: 226 - Андрей

  • 1 декабря 2014, 01:15
+
0
Появилась другая проблема. Советник удаляет не только свои отложки, но и те, которые я выставлял руками.
avatar

  16  Krokus377 Сообщений: 226 - Андрей

  • 1 декабря 2014, 03:45
+
0
в коде нет проверки на магик. замените код:

//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
     if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
     if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
     if (OrderType()==OP_BUY)  del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
     if (OrderType()==OP_SELL) del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);                
    }    
  }
//+------------------------------------------------------------------+



на


//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
       {
        if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;
         {    
          if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
          if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
          if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
          if (OrderType()==OP_BUY)  del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
          if (OrderType()==OP_SELL) del=OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         }
       }                
    }    
  }
//+------------------------------------------------------------------+
avatar

  35  AM2 Сообщений: 16264 - Андрей

  • 1 декабря 2014, 21:02
+
0
Спасибо!
avatar

  16  Krokus377 Сообщений: 226 - Андрей

  • 1 декабря 2014, 22:58
+
0
Просит индюк в журнале пишет что не может открыть ....\indicators\slope.ex4. Качал с базы проверь работоспособность ну или добавь индюк к архиву
Редактирован: 5 декабря 2014, 22:39
avatar

  13  Buff Сообщений: 401 - Артем

  • 5 декабря 2014, 22:37
+
+1
Если мой использовать, который в этом топике указан, то надо еще один параметр индикатора указать в коде. А если оригинальный скачать Slope_Direction_Line — в интернете он бесплатно выложен, то его просто переименовать до slope надо и все.
Редактирован: 5 декабря 2014, 23:14
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 5 декабря 2014, 23:14
+
0
Проверьте, пожалуйста, ещё раз код. Там какая-то, ошибка. Если советник стоит на нескольких парах (с разными магиками), то в работе находится, только одна пара. Пока её ордер не закроется, то по другим парам, ордера не выставляются, хотя по тестеру, они должны быть. Т.е. одновременно, работа может вестись, только на одном торговом инструменте.
avatar

  16  Krokus377 Сообщений: 226 - Андрей

  • 10 декабря 2014, 00:48
+
+1
Этот советник создан AM2 по моей просьбе, чтобы я смогла проверить одну из своих торговых стратегий в тестере. AM2 спасибо, он примерно написал то, что мне нужно.
В тестере я его сову погоняла. Не добилась того результата, который бы хотелось. У меня там убыток. При разных настройках.
Я сову его дописала ближе под свою стратегию. Но результат тот же.
Та сова, что в базе — это сырой набросок чисто для тестера.
Чтобы её запускать на демо или реале на несколько счетов, его надо допиливать. Допиливать уже профессионально. Думаю AM2 справился бы с этим. Но просто, думаю, это уже не бесплатная работа.

К примеру, чтобы вы поняли, о чем это я. В этом сове просто стоит функция для установки отложенного ордера OrderSend и всё. Нет проверки, ушел приказ, не ушел приказ, можем ли мы открыть позицию, не можем ли мы открыть позицию. И вообще надо делать возможность, если сейчас не ушел приказ, то повторить его… И таких нюансов море. (сама программирую, знаю)
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 10 декабря 2014, 01:21
+
0
Понятно.
avatar

  16  Krokus377 Сообщений: 226 - Андрей

  • 10 декабря 2014, 02:09
+
0
продолжение, чтобы потом не потерять
avatar

  27  Oxy Автор Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 16 декабря 2014, 23:11

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий