Стратегия High Low. CTrade.BuyStop. CTrade.SellStop. - страница 4

 
Karputov Vladimir:

Да. Точно, никаких стопов и тейк профитов. Сейчас добавлю.

 

Добавлено.

С кодом пока извините - занят. Но обязательно будет mql5 код. 


Я. Всегда делаю так:

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

Нам торопится некуда  , 

Чем яйца дольше варятся тем они круче 

 покажите как Вы модуль пишите?

 
Alexander Antoshkin:

Нам торопится некуда  , 

Чем яйца дольше варятся тем они круче 

 покажите как Вы модуль пишите?

Да, могу и показать. Только в данном случае индикатора нет, а сам алгоритм есть в статье 

Создай торгового робота за 6 шагов!
Создай торгового робота за 6 шагов!Вы не знаете, как устроены торговые классы, и пугаетесь слов 'Объектно-ориентированное программирование '? На самом деле вовсе не обязательно всё это знать, чтобы написать свой собственный модуль торговых сигналов - достаточно следовать простым правилам. Всё остальное сделает Мастер MQL5, и вы получите готовый торговый робот!

Статьи | 2012.06.01 09:43 | MetaQuotes Software Corp. | Примеры | MetaTrader 5 

 
Karputov Vladimir:

Да. Точно, никаких стопов и тейк профитов. Сейчас добавлю. 

Добавлено.

С кодом пока извините - занят. Но обязательно будет mql5 код. 

Делов-то на 30 минут:

//+------------------------------------------------------------------+
//|                                             BreakoutExtremum.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Strategy\Strategy.mqh>
#include <Strategy\StrategiesList.mqh>
input uint Magic = 232918;
//+------------------------------------------------------------------+
//| Определяет действие, которое необходимо совершать с отложенным   |
//| ордером.                                                         |
//+------------------------------------------------------------------+
enum ENUM_ORDER_TASK
{
   ORDER_TASK_DELETE,   // Удалить отложенный ордер
   ORDER_TASK_MODIFY    // Модифицировать отложенный ордер
};
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
class BreakoutExp : public CStrategy
{
public:
   virtual void      InitBuy(const MarketEvent &event);
   virtual void      InitSell(const MarketEvent &event);
   virtual void      SupportBuy(const MarketEvent &event,CPosition *pos);
   virtual void      SupportSell(const MarketEvent &event,CPosition *pos);
};

//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::InitBuy(const MarketEvent &event)
{
   if(!IsTrackEvents(event))return;                      
   if(positions.open_buy > 0) return;
   int buy_stop_total = 0;
   ENUM_ORDER_TASK task;
   // Прикрываем длинные отложки при существовании короткой позиции
   if(positions.open_sell > 0 || Ask() >= (High[1] - PriceStep(3)))
      task = ORDER_TASK_DELETE;
   else
      task = ORDER_TASK_MODIFY;
   for(int i = PendingOrders.Total()-1; i >= 0; i--)
   {
      CPendingOrder* Order = PendingOrders.GetOrder(i);
      if(Order == NULL || !Order.IsMain(ExpertSymbol(), ExpertMagic()))
         continue;
      if(Order.Type() == ORDER_TYPE_BUY_STOP)
      {
         if(task == ORDER_TASK_MODIFY)
         {
            buy_stop_total++;
            Order.Modify(High[1]);
         }
         else
            Order.Delete();
      }
   }
   if(buy_stop_total == 0 && task == ORDER_TASK_MODIFY)
      Trade.BuyStop(MM.GetLotFixed(), High[1], ExpertSymbol(), 0, 0, NULL);
}
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::InitSell(const MarketEvent &event)
{
   if(!IsTrackEvents(event))return;                      
   if(positions.open_sell > 0) return;                    
   int sell_stop_total = 0;
   ENUM_ORDER_TASK task;
   // Прикрываем короткие отложки при существовании короткой позиции
   if(positions.open_buy > 0|| Bid() >= (High[1] + PriceStep(3)))
      task = ORDER_TASK_DELETE;
   else
      task = ORDER_TASK_MODIFY;
   for(int i = PendingOrders.Total()-1; i >= 0; i--)
   {
      CPendingOrder* Order = PendingOrders.GetOrder(i);
      if(Order == NULL || !Order.IsMain(ExpertSymbol(), ExpertMagic()))
         continue;
      if(Order.Type() == ORDER_TYPE_SELL_STOP)
      {
         if(task == ORDER_TASK_MODIFY)
         {
            sell_stop_total++;
            Order.Modify(Low[1]);
         }
         else
            Order.Delete();
      }
   }
   if(sell_stop_total == 0 && task == ORDER_TASK_MODIFY)
      Trade.SellStop(MM.GetLotFixed(), Low[1], ExpertSymbol(), 0, 0, NULL);
}
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::SupportBuy(const MarketEvent &event,CPosition *pos)
{
   if(pos.StopLossValue() != Low[1])
      pos.StopLossValue(Low[1]);
}
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::SupportSell(const MarketEvent &event,CPosition *pos)
{
   if(pos.StopLossValue() != High[1])
      pos.StopLossValue(High[1]);
}
CStrategyList Manager;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   BreakoutExp* expert = new BreakoutExp();
   expert.ExpertMagic(Magic);
   expert.ExpertName("Breakout Extremums");
   expert.ExpertSymbol(Symbol());
   expert.Timeframe(Period());
   Manager.AddStrategy(expert);
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   Manager.OnTick();
}
//+------------------------------------------------------------------+

Видео работы стратегии:

 

А вот собственно результат:


Вердикт: слив со скоростью спреда (1.7 пункта на сделку).

 
Vasiliy Sokolov:

Делов-то на 30 минут:


 Отлично , будет не один пример реализации кода

попозже я постараюсь  в этой стратегии  из примеров форума  составить свой 

 
Alexander Antoshkin:

 Отлично , будет не один пример реализации кода

попозже я постараюсь  в этой стратегии  из примеров форума  составить свой 

А может, завести рубрику Слив?

Тут ведь есть идеалисты, верящие, что слив можно перевернуть в грааль))

 
Vasiliy Sokolov:

Делов-то на 30 минут:

Видео работы стратегии:

 

А вот собственно результат:


Вердикт: слив со скоростью спреда (1.7 пункта на сделку).

С таким опытом и предполагать, что цена пойдет... так нет же - она обязательно пойдет в другую сторону... и если бай-стоповый, то хотя бы снизу какого не то канала... или хотя бы по стохастику предполагать, а если лимитник то наоборот сверху на отскок... еще мне нравится с истечением времени отложки убираются... не сработали и слава богу... своего рода засада с целью 15 мин и 20пп...
 
Перевел на лимитники... крутил вертел - ничего без канала не получается... хотел  RSI - CCI приспособить, но тоже не получается... зря только время потратил...
//+------------------------------------------------------------------+
//|                                             BreakoutExtremum.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include <Strategy\Strategy.mqh>
#include <Strategy\StrategiesList.mqh>
#include <Strategy\Samples\Signal_CCI_AC.mqh>
#include <Strategy\Samples\Signal_RSI_AC.mqh>

input uint Magic = 232918;

//+------------------------------------------------------------------+
//| Определяет действие, которое необходимо совершать с отложенным   |
//| ордером.                                                         |
//+------------------------------------------------------------------+
enum ENUM_ORDER_TASK
{
   ORDER_TASK_DELETE,   // Удалить отложенный ордер
   ORDER_TASK_MODIFY    // Модифицировать отложенный ордер
};
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
class BreakoutExp : public CStrategy
{
public:
   virtual void      InitBuy(const MarketEvent &event);
   virtual void      InitSell(const MarketEvent &event);
   virtual void      SupportBuy(const MarketEvent &event,CPosition *pos);
   virtual void      SupportSell(const MarketEvent &event,CPosition *pos);
};

//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::InitSell(const MarketEvent &event)
{
   if(positions.open_sell > 2) return;
   int sell_limit_total = 0;
   ENUM_ORDER_TASK task;
   // Прикрываем длинные отложки при существовании короткой позиции
   if(positions.open_sell > 0 || Ask() >= (High[1] ))
      task = ORDER_TASK_DELETE;
   else
      task = ORDER_TASK_MODIFY;
   for(int i = PendingOrders.Total()-1; i >= 0; i--)
   {
      CPendingOrder* Order = PendingOrders.GetOrder(i);
      if(Order == NULL || !Order.IsMain(ExpertSymbol(), ExpertMagic()))
         continue;
      if(Order.Type() == ORDER_TYPE_SELL_LIMIT)
      {
         if(task == ORDER_TASK_MODIFY)
         {
            sell_limit_total++;
            Order.Modify(High[1]);
         }
         else
            Order.Delete();
            
      }
   }
   if(sell_limit_total == 0 && task == ORDER_TASK_MODIFY)
      Trade.SellLimit(MM.GetLotFixed(), High[1], ExpertSymbol(), 0, 0, NULL);
}
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::InitBuy(const MarketEvent &event)
{
   if(positions.open_buy > 0) return;                    
   int buy_limit_total = 0;
   ENUM_ORDER_TASK task;
   // Прикрываем короткие отложки при существовании короткой позиции
   if(positions.open_buy > 0 || Bid() >= (Low[1]))
      task = ORDER_TASK_DELETE;
   else
      task = ORDER_TASK_MODIFY;
   for(int i = PendingOrders.Total()-1; i >= 0; i--)
   {
      CPendingOrder* Order = PendingOrders.GetOrder(i);
      if(Order == NULL || !Order.IsMain(ExpertSymbol(), ExpertMagic()))
         continue;
      if(Order.Type() == ORDER_TYPE_BUY_LIMIT)
      {
         if(task == ORDER_TASK_MODIFY)
         {
            buy_limit_total++;
            Order.Modify(Low[1]);
         }
         else
            Order.Delete();
      }
   }
   if(buy_limit_total == 0 && task == ORDER_TASK_MODIFY)
      Trade.BuyLimit(MM.GetLotFixed(), Low[1], ExpertSymbol(), 0, 0, NULL);
}
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::SupportBuy(const MarketEvent &event,CPosition *pos)
{
   if(pos.StopLossValue() != Low[1])
      pos.StopLossValue(Low[1]);
}
//+------------------------------------------------------------------+
//| Стратегия на основе пробоя экстремума предыдущего бара           |
//+------------------------------------------------------------------+
void BreakoutExp::SupportSell(const MarketEvent &event,CPosition *pos)
{
   if(pos.StopLossValue() != High[1])
      pos.StopLossValue(High[1]);
}
CStrategyList Manager;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   BreakoutExp* expert = new BreakoutExp();
   expert.ExpertMagic(Magic);
   expert.ExpertName("Breakout Extremums");
   expert.ExpertSymbol(Symbol());
   expert.Timeframe(Period());
   Manager.AddStrategy(expert);
   //COnSignalMACD* signal = new COnSignalMACD();
   //CAdapterMACD* signal = new CAdapterMACD();
   COnSignal_CCI_AC* signal = new COnSignal_CCI_AC();
   COnSignal_RSI_AC* signall = new COnSignal_RSI_AC();

   signal.ExpertMagic(2918);
   signal.ExpertName("MQL Signal Samples");
   signal.Timeframe(Period());
   if(!Manager.AddStrategy(signal)|| Manager.AddStrategy(expert))
      delete signal;
   signall.ExpertMagic(2918);
   signall.ExpertName("MQL Signal Samples");
   signall.Timeframe(Period());
   if(!Manager.AddStrategy(signall))
      delete signall;
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   Manager.OnTick();
}
//+------------------------------------------------------------------+
 

Добавьте МАшку и фильтруйте входы - цена ниже MA продажа - выше - покупка.

И флэт надо фильтровать, к примеру той же МАшкой определять её изменение по сравнению с N баров.

Ещё ZigZag можно взять для фильтрации баров близко расположенных к изгибу последнего колена.

В общем, логика ТС применима в определенных условиях и их надо выявлять, а не тупо применять на всех барах. 

 
Сергей Криушин:
Перевел на лимитники... крутил вертел - ничего без канала не получается... хотел  RSI - CCI приспособить, но тоже не получается... зря только время потратил...

Естественно не получилось. Реверс ТС сливающей со скоростью спреда даст другую ТС сливающую со скоростью спреда.

-Aleks-:

Добавьте МАшку и фильтруйте входы - цена ниже MA продажа - выше - покупка.

И флэт надо фильтровать, к примеру той же МАшкой определять её изменение по сравнению с N баров.

Ещё ZigZag можно взять для фильтрации баров близко расположенных к изгибу последнего колена.

В общем, логика ТС применима в определенных условиях и их надо выявлять, а не тупо применять на всех барах. 

Неработающей ТС делать фильтры это как мертвому припарки.

 
-Aleks-:

Добавьте МАшку и фильтруйте входы - цена ниже MA продажа - выше - покупка.

И флэт надо фильтровать, к примеру той же МАшкой определять её изменение по сравнению с N баров.

Ещё ZigZag можно взять для фильтрации баров близко расположенных к изгибу последнего колена.

В общем, логика ТС применима в определенных условиях и их надо выявлять, а не тупо применять на всех барах. 

Можно бы сделать сов с ордерами чисто BUY_STOP и BUY_LIMIT и параллельный в другую сторону и выставлять отложки подальше - хотя бы на величину этого же бара... или по более надежному патерну, чтобы отсечь случайное срабатывание...
Причина обращения: