pacak
варвар Andre

 
Уровень 19


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

Рейтинг 2087



РЕКОМЕНДУЮ



Советник по сеточной стратегии "Пепелац"

Приветствую! Прошу написать сеточного советника на основе индикатора MA_Chanels_FIBO.
Суть: При касании ценой верхнего уровня FIBO продаем, нижнего покупаем (например при касании красной линии 61,8%). Уровень касания должен задаваться в параметре Fibo, т.к. он может быть нестандартным, как 78%, так и 100%.

Условия входа:
Как только цена коснулась нужного уровня Fibo на индикаторе MA_Chanels_FIBO, сразу покупаем (продаем) с рынка с определенным TP и SL в пунктах. Также от этого рыночного ордера сразу выставляется сетка отложенных лимитных ордеров с шагом Step пунктов между ними в количестве равном N штук. SL всей сетки выставляется на уровне стопа первого ордера который уже в рынке, т.е. если касается стопа первого ордера, стопарится вся сетка сразу. TP каждого сеточного ордера равен TP пунктов первого ордера.
Объем каждого ордера одинаковый, задается в параметрах.

Пример:
Коснулись 61,8% fibo. Купили по цене 1.1000, стоп 100 пунктов, тейк 50 пунктов (т.е. стоп получается 1.0000, а тейк 1.1050). Сразу же выставили байлимитные ордера с шагом 20 пунктов в количестве 3 штуки (т.е. по цене 1.0080, 1.0060, 1.0040, с общим стопом на 1.0000 и с тейком каждого в 100 пунктов (соответственно тейк ордера 1.0080 на 1.1030, 1.0060 на 1.1010 и т.п.)).



Также просьба учесть правило: Пока ордера сети в рынке (хоть один), последующие сигналы игнорируются.
Магик обязателен.

Ключевые настройки индикатора тоже желательно вынести в параметры советника: BarsCount и MAPeriod.

MA_Chanels_FIBO.mq4 (5 Kb)

Эпилог: Потом я оформлю тему с данной стратегией и покажу его в работе. Там очень важны настройки как Fibo, так и соотношение стопов и профита и таймфрейм, а также когда брать сигнал, а когда пропускать. Пока этот фильтр только в голове (но я буду думать как его роботизировать). Настройки по умолчанию, сделанные наобум скорее всего будут сливные, также неустойчивый результат если брать все поступающие сигналы. Но здесь нужен костяк, эксплуатирующий саму идею.
Индикатор основан на текущих вычислениях, берутся его текущие показатели на данный момент времени, дальше все перерисовывается, но это уже не важно, важен сам факт первого входа по сигналу.

Важное дополнение: Гонял его вручную тестером на стремном для пары USDCAD периоде чтобы проверить живучесть, а именно октябрь 2014 — февраль 2015: 17 сделок, из них 14 тейков, 3 стопа. Общий итог +1360 пунктов.

Это еще один шаг вперед, приближающий нас к граалю! Ура, товарищи!
Спасибо!
  • +6
  • Просмотров: 7232
  • 15 января 2016, 14:11
  • pacak
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
+1
Так 50 или 100 TP в примере? ;) 
Купили по цене 1.1000, стоп 100 пунктов, тейк 50 пунктов
и следом
и с тейком каждого в 100 пунктов

avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 15 января 2016, 16:13
+
0
Очипятался. Благодарю!
(т.е. по цене 1.0080, 1.0060, 1.0040, с общим стопом на 1.0000 и с тейком каждого в 50 (пятьдесят) пунктов (соответственно тейк ордера 1.0080 на 1.1030, 1.0060 на 1.1010 и т.п.))
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 15 января 2016, 17:01
комментарий был удален 2016-01-15 22:58:56 pacak

+
0
Займусь :) 
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 16 января 2016, 00:23
+
+2
Основа есть. Началось все хорошо :) 




//+------------------------------------------------------------------+
//|                                                     Pepelats.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 50;       // язь
extern int Count        = 5;        // число отложек
extern int Step         = 200;      // спред
extern int Slip         = 30;       // реквот
extern int Expiration   = 30;       // истечение отложек в часах
extern int BarsCount    = 500;      // баров для расчета индикатора
extern int MAPeriod     = 100;      // период МА
extern int Magic        = 123;      // магик

extern string IndName="MA_Chanels_FIBO";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr;
   double sl=0,tp=0;
   datetime expiration=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int i=0;
   double up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
   double dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);

   if(CountTrades()<1)
     {
      if(Ask>up && CountOrders(2)<1)
        {
         PutOrder(0,Ask);
         for(i=0; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid<dn && CountOrders(3)<1)
        {
         PutOrder(1,Bid);
         for(i=0; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }

   Comment("\n ");
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 16 января 2016, 01:50
+
+2
С условием на отбой похуже работает: www.opentraders.ru/downloads/1014/




//+------------------------------------------------------------------+
//|                                                     Pepelats.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 50;       // язь
extern int Count        = 5;        // число отложек
extern int Step         = 200;      // спред
extern int Slip         = 30;       // реквот
extern int Expiration   = 30;       // истечение отложек в часах
extern int BarsCount    = 500;      // баров для расчета индикатора
extern int MAPeriod     = 100;      // период МА
extern int Magic        = 123;      // магик

extern string IndName="MA_Chanels_FIBO";
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr;
   double sl=0,tp=0;
   datetime expiration=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)   sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)   sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int i=0;
   double up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
   double dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);

   if(CountTrades()<1)
     {
      if(Ask<dn && CountOrders(2)<1)
        {
         PutOrder(0,Ask);
         for(i=0; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid>up && CountOrders(3)<1)
        {
         PutOrder(1,Bid);
         for(i=0; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }

   Comment("\n ");
  }
//+------------------------------------------------------------------+


Редактирован: 17 января 2016, 01:30
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 16 января 2016, 03:18
+
0
Я недавно хотел вас попросить написать что то подобное.

Только вот я все думал как избежать убытки в тренде. Есть идея, что если скажем есть открытые позиции на продажу, и закрывать эти позиции только на следующем сигнале на продажи, с условием что есть открытые ордера на покупку. Можно как то это реализовать в этом советнике?

avatar

  14  beton2011 Сообщений: 895

  • 16 января 2016, 10:22
+
0
Только вот я все думал как избежать убытки в тренде. Есть идея, что если скажем есть открытые позиции на продажу, и закрывать эти позиции только на следующем сигнале на продажи, с условием что есть открытые ордера на покупку. Можно как то это реализовать в этом советнике?


Сделать можно только в другом топике. Здесь делаю по стратегии автора.
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 17 января 2016, 01:34
+
+1
Но как раз этот вариант с условием на отбой — БОМБА! *bomb* 

Отличная работа! Пока беглым взглядом открывает как надо.

Улучшения по пунктам:
1. Неправильно ставятся стопы у лимитных ордеров. Стоп у всей сетки должен быть один, на цене стопа первого рыночного ордера. В этом варианте у каждого ордера свой стоп в 500 пунктов от цены их открытия.

Лучше даже оставить два варианта на выбор. Один как сейчас, а другой с единым стопом. Что то типа переменной:
Единый стоп у всех ордеров: true/false
false — нынешний вариант, у каждого отложенника свой стоп
true — стопы всех отложек на цене стопа первого рыночного ордера

2. Настройка уровня отбоя (крайне важная штука). По умолчанию в индикаторе стоит 61,8%, который рисуется красной линией. Я сейчас переделал индикатор в силу своих способностей, там эти уровни задаются переменными: www.opentraders.ru/downloads/1012/
В моем индикаторе есть переменная fibo_red=61.8
Можно ее вынести в советника? Она отвечает как раз за эту отбойную линию.
3. Если по тейку закрывается первый ордер (с которого началась сетка), то все отложенники удаляются. Это очень важное правило!

*lalala*  кажется грааль все таки существует!
Спасибо!
Редактирован: 16 января 2016, 15:11
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 16 января 2016, 15:02
+
+1
Андрей, благодарю!
Потестирую с разными настройками. Главное что есть от чего оттолкнуться, СПАСИБО!!!
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 16 января 2016, 11:27
+
0
Улучшения по пунктам:
1. Неправильно ставятся стопы у лимитных ордеров. Стоп у всей сетки должен быть один, на цене стопа первого рыночного ордера. В этом варианте у каждого ордера свой стоп в 500 пунктов от цены их открытия.

Лучше даже оставить два варианта на выбор. Один как сейчас, а другой с единым стопом. Что то типа переменной:
Единый стоп у всех ордеров: true/false
false — нынешний вариант, у каждого отложенника свой стоп
true — стопы всех отложек на цене стопа первого рыночного ордера

2. Настройка уровня отбоя (крайне важная штука). По умолчанию в индикаторе стоит 61,8%, который рисуется красной линией. Я сейчас переделал индикатор в силу своих способностей, там эти уровни задаются переменными: www.opentraders.ru/downloads/1012/
В моем индикаторе есть переменная fibo_red=61.8
Можно ее вынести в советника? Она отвечает как раз за эту отбойную линию.
3. Если по тейку закрывается первый ордер (с которого началась сетка), то все отложенники удаляются. Это очень важное правило!


В понедельник продолжу.
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 17 января 2016, 01:33
+
0
Я рассматриваю только вариант на отбой, поэтому все свое описание по умолчанию буду повествовать о нем.
Выявил ошибку:
Открывает по 2 одинаковых ордера.



Ордер номер 2.

Значение Count (число отложек) = 3
шаг = 20 пунктов (у меня четырехзнак)
слип = 3
Редактирован: 17 января 2016, 20:18
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 17 января 2016, 20:04
+
+2
Сам нашел и кажется сам решил эту проблему, на первый взгляд вроде так как надо теперь <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; '>&nbsp; 
В коде:

if(CountTrades()<1)
     {
      if(Ask<dn && CountOrders(2)<1)
        {
         PutOrder(0,Ask);
         for(i=0; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid>up && CountOrders(3)<1)
        {
         PutOrder(1,Bid);
         for(i=0; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }


Надо заменить в обеих строках
for(i=0; i<=Count;i++)
на
for(i=1; i<=Count;i++)

Cейчас потестирую поподробнее в разных ситуациях.
Добавлено чуть позже: Да, теперь как надо. Я молодец *bravo* 
Редактирован: 17 января 2016, 20:54
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 17 января 2016, 20:41
комментарий был удален 2016-01-22 23:32:56 pacak

+
+1
Улучшения по пунктам:
1. Неправильно ставятся стопы у лимитных ордеров. Стоп у всей сетки должен быть один, на цене стопа первого рыночного ордера. В этом варианте у каждого ордера свой стоп в 500 пунктов от цены их открытия.

Лучше даже оставить два варианта на выбор. Один как сейчас, а другой с единым стопом. Что то типа переменной:
Единый стоп у всех ордеров: true/false
false — нынешний вариант, у каждого отложенника свой стоп
true — стопы всех отложек на цене стопа первого рыночного ордера

2. Настройка уровня отбоя (крайне важная штука). По умолчанию в индикаторе стоит 61,8%, который рисуется красной линией. Я сейчас переделал индикатор в силу своих способностей, там эти уровни задаются переменными: www.opentraders.ru/downloads/1012/
В моем индикаторе есть переменная fibo_red=61.8
Можно ее вынести в советника? Она отвечает как раз за эту отбойную линию.
3. Если по тейку закрывается первый ордер (с которого началась сетка), то все отложенники удаляются. Это очень важное правило!


Все есть





//+------------------------------------------------------------------+
//|                                                     Pepelats.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int Stops        = 0;        // 0-стоп на одной цене. 1-лось каждому ордеру
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 50;       // язь
extern int Count        = 5;        // число отложек
extern int Step         = 200;      // спред
extern int Buff         = 1;        // 1-61.8, 2-50, 3-38.2, 4-23.5
extern int Slip         = 30;       // реквот
extern int Expiration   = 30;       // истечение отложек в часах
extern int BarsCount    = 500;      // баров для расчета индикатора
extern int MAPeriod     = 100;      // период МА
extern int Magic        = 123;      // магик

extern string IndName="MA_Chanels_FIBO";

int Type=0;
double Price=0,Stop=0,Take=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr;
   double sl=0,tp=0;
   datetime expiration=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Ask+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Bid-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del=true;
   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_BUYLIMIT)  del=OrderDelete(OrderTicket());
            if(OrderType()==OP_SELLLIMIT) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Last()
  {
   int result=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int i=0;
   double up=0,dn=0;
   if(Buff==1)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
     }
     
   if(Buff==2)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
     }
          
   if(Buff==3)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
     }
     
   if(Buff==4)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
     }
                    
   if(CountTrades()<1)
     {
      if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
        {
         PutOrder(0,Ask);
         Price=Ask;
         Type=0;
         for(i=1; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid>up && CountOrders(3)<1)//селл и селл лимит
        {
         PutOrder(1,Bid);
         Price=Bid;
         Type=1;         
         for(i=1; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }

   if(Last()==1 && ((Bid>=Price+TakeProfit*Point && Type==0) || (Ask<=Price-TakeProfit*Point && Type==1))) DelOrder();

   Comment("\n Price: ",Price,
           "\n Type: ",Type);
  }
//+------------------------------------------------------------------+


Редактирован: 18 января 2016, 05:39
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 18 января 2016, 04:45
+
0
Начну с конца:
3. Если по тейку закрывается первый ордер (с которого началась сетка), то все отложенники удаляются. Это очень важное правило!

Не всегда удаляются отложки по этому условию:
if(Last()==1 && ((Bid>=Price+TakeProfit*Point && Type==0) || (Ask<=Price-TakeProfit*Point && Type==1))) DelOrder();


Уже открылась новая сетка в другую сторону, а отложки на продажу еще висят.

Можно изменить это условие?
При первом же тейке любого ордера сетки все отложки удаляются. Неважно какой по счету ордер тейкнулся. Есть один тейк — все отложки удаляются.
2. Настройка уровня отбоя (крайне важная штука). По умолчанию в индикаторе стоит 61,8%, который рисуется красной линией. Я сейчас переделал индикатор в силу своих способностей, там эти уровни задаются переменными: www.opentraders.ru/downloads/1012/
В моем индикаторе есть переменная fibo_red=61.8
Можно ее вынести в советника? Она отвечает как раз за эту отбойную линию.

extern int Buff = 1; // 1-61.8, 2-50, 3-38.2, 4-23.5
Это немного не то что я хотел :) 
В старом индикаторе есть именно эти уровни 1-61.8, 2-50, 3-38.2, 4-23.5. Но они не играют никакой роли. Это просто цифры, которые мы не можем поменять. По большому счету кроме красной линии остальные нам и не нужны.

В моем новом индикаторе мы можем поставить значение fibo_red=61.8 (и красная линия будет как в старом индюке), так и 97, так и 122, т.е. абсолютно независимые фибо-значения, в отличии от старого варианта.
Вот старый индюк fibo_red=61.8:

Вот мой индюк. Я могу менять красную линию — fibo_red=92

Красная линия существенно сдвинулась, и мы будем ловить отскок от нее! Вот поэтому хотелось бы вынести это значение fibo_red в советник. Т.е самому задавать значение от которого будем отскакивать, а не держаться в рамках заданных старым индикатором. Не 1=61.8, 2=50 и т.д., а именно само значение 61.8, 92, 123 и т.п.
В разных валютах эти значения отскока разные, от 61.8 отскакивают единицы и очень очень редко с очень нестабильным результатом, для USDCAD к примеру лучше 95. Для евро другие. Вот поэтому этот уровень очень важен как переменный параметр.
Со старым индикатором такой фокус не пройдет, увы.
1. Неправильно ставятся стопы у лимитных ордеров. Стоп у всей сетки должен быть один, на цене стопа первого рыночного ордера. В этом варианте у каждого ордера свой стоп в 500 пунктов от цены их открытия.

Кажется работает.
Но при выборе «0 — стопы на одной цене» ставит стопы отложек чуть больше стопа первого рыночного ордера на величину спреда.

— Спасибо за работу, прощу прощения за такие придирки, хочу довести реально отличный советник и одну из немногих действительно рабочих идей до конца. Я вижу что это реально алмаз, и с Вашей помощью мы его доведем до бриллианта.
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 18 января 2016, 16:39
+
+1
Также можно работать с неисправленным индикатором: www.opentraders.ru/downloads/1014/

extern int Buff = 1; // 1-61.8, 2-50, 3-38.2, 4-23.5

Редактирован: 18 января 2016, 05:44
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 18 января 2016, 04:59
+
+1
Можно изменить это условие?
При первом же тейке любого ордера сетки все отложки удаляются. Неважно какой по счету ордер тейкнулся. Есть один тейк — все отложки удаляются.


Сейчас буду думать как это сделать.

В моем новом индикаторе мы можем поставить значение fibo_red=61.8 (и красная линия будет как в старом индюке), так и 97, так и 122, т.е. абсолютно независимые фибо-значения, в отличии от старого варианта.


Скидывайте новый индикатор.
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 18 января 2016, 22:43
+
0
Скидывайте новый индикатор

индикатор MA_Chanels_FIBO_Pepelac
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 18 января 2016, 22:47
+
0
Можно изменить это условие?
При первом же тейке любого ордера сетки все отложки удаляются. Неважно какой по счету ордер тейкнулся. Есть один тейк — все отложки удаляются.


Теперь нужен новый алгоритм. Как будем узнавать что закрылся ордер из серии?
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 18 января 2016, 23:12
+
+1
Можно изменить это условие?


Я разработал данный алгоритм, а теперь хочу посмотреть сколько времени и сил уйдет у вас на это, чтобы вы подумали в следующий раз перед тем как изменять ТЗ.

avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 19 января 2016, 00:27
+
0
а теперь хочу посмотреть сколько времени и сил уйдет у вас на это, чтобы вы подумали в следующий раз перед тем как изменять ТЗ.

Прошу извинить, я виноват.
К сожалению моих сил, а главное моих знаний и ума не хватит написать на MQL такой алгоритм. Я индикатор то когда изменял, почти весь день изучал на примерах и потом тестировал чтобы правильно работал, а такой советник мне точно не по зубам. Спасибо Вам, я поступил опрометчиво.
Больше ТЗ изменяться не будет, этот алгоритм самая золотая середина, то что нужно, он просто шикарно выполняет свою функцию *drinks* 

А дополнение к уже имеющимся функциям советника можно озвучить? Алгоритм ТЗ при этом не меняется, просто выставляется определенным образом безубыток. Если будет трудоемко, тогда фиг с ним, просто устойчивость стратегии по нему будет существенно выше за счет очень маленького кол-ва стопов. В любом случае, можно послать меня нафиг в любой момент *stesnitelno* 
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 19 января 2016, 16:48
+
+1
Кажется работает.
Но при выборе «0 — стопы на одной цене» ставит стопы отложек чуть больше стопа первого рыночного ордера на величину спреда.


Сейчас ставит все стопы на один уровень. И огромная просьба не изменять ТЗ в процессе выполнения.




//+------------------------------------------------------------------+
//|                                                     Pepelats.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int Stops        = 0;        // 0-стоп на одной цене. 1-лось каждому ордеру
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 50;       // язь
extern int Count        = 5;        // число отложек
extern int Step         = 200;      // спред
extern int Buff         = 1;        // 1-61.8, 2-50, 3-38.2, 4-23.5
extern int Slip         = 30;       // реквот
extern int Expiration   = 30;       // истечение отложек в часах
extern int BarsCount    = 500;      // баров для расчета индикатора
extern int MAPeriod     = 100;      // период МА
extern int Magic        = 123;      // магик

extern string IndName="MA_Chanels_FIBO";

double Stop=0;
datetime TimeOpen=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr;
   double sl=0,tp=0;
   datetime expiration=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del=true;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Last()
  {
   int result=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
        {
         if(OrderProfit()>0)
           {
            result=1;//tp  
           }
        }
     }
   return(result);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime LastOrderOpenTime()
  {
   datetime t=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
        {
         if(OrderProfit()>0)//tp  
           {
            t=OrderOpenTime();
           }
        }
     }
   return(t);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int i=0;
   double up=0,dn=0;
   if(Buff==1)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
     }

   if(Buff==2)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
     }

   if(Buff==3)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
     }

   if(Buff==4)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
     }

   if(CountTrades()<1)
     {
      if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
        {
         PutOrder(0,Ask);
         TimeOpen=TimeCurrent();
         Stop=Ask-StopLoss*Point;
         
         for(i=1; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid>up && CountOrders(3)<1)//селл и селл лимит
        {
         PutOrder(1,Bid);
         TimeOpen=TimeCurrent();
         Stop=Bid+StopLoss*Point;

         for(i=1; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }

   if(LastOrderOpenTime()>=TimeOpen)
     {
      DelOrder();
     }

   Comment("\n Stop: ",Stop);
  }
//+------------------------------------------------------------------+



avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 19 января 2016, 05:01
+
0
А дополнение к уже имеющимся функциям советника можно озвучить?

Пишите подробнее какие доработки.
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 19 января 2016, 17:28
+
0
Доработка (если она возможна):

Безубыток (true/false)
true:
Если цена прошла в прибыльную сторону Х пунктов от цены первого рыночного ордера, удаляем все отложки, а на открытых ордерах выставляем стопы в бу на едином уровне Y пунктов от цены первого рыночного ордера.
false:
Пропускаем это условие, безубыток не включается.
— Параметры:
Безубыток: true/false
Включение безубытка на уровне (считая от цены первого ордера): X пунктов
Пунктов безубытка (считая от цены первого ордера): Y

Картинка:


Разбирая результаты тестирования, примерно 80% стопов на USDCAD можно было бы избежать, включая такой безубыток на уровне примерно 65-70 пунктов для этой пары.
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 19 января 2016, 17:47
+
+1
Доработка (если она возможна):

Безубыток (true/false)

В этом советнике уже столько всего. В следующем месяце в новом топике опишите ТЗ, если советник будет простым, сделаю.
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 20 января 2016, 23:52
+
0
а мне показалась эта идея с безубытком стоящей, и я ждала, чем все закончится ( 
avatar

  27  Oxy Сообщений: 3418 - ..ιllιlι.lι.ιllι.ιlι..

  • 20 января 2016, 23:56
+
0
Оксана, когда большой объем переносим на новый топик :) 
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 21 января 2016, 00:01
+
0
Спасибо! *friends*  Подождем. Нынешний вариант тоже весьма и весьма рабочий. Возможно я что то придумаю сам, но очень в этом сомневаюсь *rabota*  Все таки три дня практики и знакомства с MQL *bildbody* 

Поищу ошибки нынешнего варианта. Еще раз СПАСИБО!
Вы дали автоматическую жизнь моей стратегии!

P.S. Для Oxy:
да, эта добавление действительно очень стоящая штука, т.к. очень часто цена проходит от первого ордера на определенную величину. Подождем, что-нибудь придумаем. Рынок от нас не убежит <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/003.gif' alt=' :D '>&nbsp; 
Редактирован: 21 января 2016, 01:09
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 21 января 2016, 00:20
+
+2
В ходе теста выявил критическую ошибку, приводящую к трагическим последствиям и искажениям результатов теста.

Иногда возникают ситуации, когда ордер закрывается по тейку в зоне сигнала на следующее открытие, и сразу открывается другая сетка. Ордера предыдущей сетки при этом НЕ закрываются, т.к. условие закрытия уже не срабатывает!

Долго думал и решал, что не так. По прошествии суток адских мозговых усилий с внедрением каких только извращений, в т.ч. и применения задержек исполнения и тэдэитэпэ… Пока до меня не дошло просто сесть и пошагово в мозгу прокрутить написанный код. И о чудо! На меня снизошло озарение! Как всегда, все гениальное — ПРОСТО!

Закрытие ордера происходит по этому условию:
if(LastOrderOpenTime()>=TimeOpen)
     {
      DelOrder();
     }


Итак, решение проблемы:
ПЕРЕМЕЩАЕМ это условие в начало функции void OnTick()

Вот как должен получиться правильный рабочий вариант
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int i=0;
   double up=0,dn=0;


//Перемещаем это условие вперед и делаем его первичным!
   if(LastOrderOpenTime()>=TimeOpen)
     {
      DelOrder();
     }
   
   
   if(Buff==1)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
     }

   if(Buff==2)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
     }

   if(Buff==3)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
     }

   if(Buff==4)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
     }

   if(CountTrades()<1)
     {
      if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
        {
         PutOrder(0,Ask);
         TimeOpen=TimeCurrent();
         Stop=Ask-StopLoss*Point;
         
         for(i=1; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid>up && CountOrders(3)<1)//селл и селл лимит
        {
         PutOrder(1,Bid);
         TimeOpen=TimeCurrent();
         Stop=Bid+StopLoss*Point;

         for(i=1; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }


   Comment("\n Stop: ",Stop);

  }
//+------------------------------------------------------------------+

Таким образом сначала после тейка удаляются ордера, а потом уже происходит проверка сигнала и выставление сетки.
Редактирован: 21 января 2016, 00:27
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 21 января 2016, 00:13
+
+1
А вот на затравку, чтоб слюни текли.

Отработка шикарного сигнала USDCAD 20.01.2016
Уффф. Сигнальчик горячий, с пылу с жару, прям свежий свежий… А запах… Понюхайте: Мммм… Так вкусно пахнет профитом… Три сотни пунктов за час и вы несетесь радостно на Пепелаце как господин Пэжэ!

avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 21 января 2016, 00:46
+
+1
БУчит и удаляет ордера:




//+------------------------------------------------------------------+
//|                                                     Pepelats.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Simple expert advisor"

//--- Inputs
extern double Lots      = 0.1;      // лот
extern int Stops        = 0;        // 0-стоп на одной цене. 1-лось каждому ордеру
extern int StopLoss     = 500;      // лось
extern int TakeProfit   = 50;       // язь
extern int BULevel      = 100;      // уровень БУ
extern int Count        = 5;        // число отложек
extern int Step         = 200;      // спред
extern int Buff         = 1;        // 1-61.8, 2-50, 3-38.2, 4-23.5
extern int Slip         = 30;       // реквот
extern int Expiration   = 30;       // истечение отложек в часах
extern int BarsCount    = 500;      // баров для расчета индикатора
extern int MAPeriod     = 100;      // период МА
extern int Magic        = 123;      // магик

extern string IndName="MA_Chanels_FIBO";

int OrdType=0;
double Stop=0,MarketPrice=0;
datetime TimeOpen=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr;
   double sl=0,tp=0;
   datetime expiration=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del=true;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(OrderStopLoss()!=MarketPrice+20*Point)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),MarketPrice+20*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()!=MarketPrice-20*Point)
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),MarketPrice-20*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int i=0;
   double up=0,dn=0;
   if(Buff==1)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
     }

   if(Buff==2)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
     }

   if(Buff==3)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
     }

   if(Buff==4)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
     }

   if(CountTrades()<1)
     {
      if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
        {
         PutOrder(0,Ask);
         TimeOpen=TimeCurrent();
         Stop=Ask-StopLoss*Point;
         MarketPrice=Ask;
         OrdType=0;

         for(i=1; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid>up && CountOrders(3)<1)//селл и селл лимит
        {
         PutOrder(1,Bid);
         TimeOpen=TimeCurrent();
         Stop=Bid+StopLoss*Point;
         MarketPrice=Bid;
         OrdType=1;

         for(i=1; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }
/*
   if(LastOrderOpenTime()>=TimeOpen)
     {
      DelOrder();
     }
*/
   if(CountTrades()>0 && ((OrdType==0 && Bid-MarketPrice>BULevel*Point) || (OrdType==1 && MarketPrice-Ask>BULevel*Point)))
     {
      BU();
      DelOrder();
     }

   Comment("\n Stop: ",Stop,
           "\n MarketPrice: ",MarketPrice,
           "\n OrderType: ",OrdType);
  }
//+------------------------------------------------------------------+

avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 21 января 2016, 01:38
комментарий был удален 2016-01-22 23:29:14 pacak

комментарий был удален 2016-01-22 23:29:19 pacak

комментарий был удален 2016-01-22 23:29:25 pacak

+
0
Ждите конечную версию. Я работаю над советником, не все сразу.
Я брал эту версию и тестировал, потом внося изменения. У меня работала и в начальном варианте, я не знаю почему не работает у вас *???* 

Прикрутил значение BUpoint — кол-во пунктов безубытка.
Потом выложу свой промежуточный вариант, надо кое-что поправить и улучшить
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 21 января 2016, 17:05
комментарий был удален 2016-01-22 23:29:38 pacak

+
0
При тесте на демо (и на реале :)  ) вылезла следующая ошибка:
Открылась сетка по сигналу. Закрыли терминал МТ4.
При перезапуске терминала советник модифицирует стоп у имеющегося в рынке ордера и удаляет все отложки сети:

2016.01.21 22:17:25.271 Custom indicator MA_Chanels_FIBO_Pepelac USDCAD,M5: loaded successfully
2016.01.21 22:17:25.291 Expert pepelats_am2_5_or USDCAD,M5: loaded successfully
2016.01.21 22:17:26.989 '10116295': login on Alpari-Nano through nano.ru.0a (ping: 48.98 ms)
2016.01.21 22:17:27.886 '10116295': login datacenter on Alpari-Nano through nano.ru.0a (ping: 48.98 ms)
2016.01.21 22:17:28.000 '10116295': previous successful authorization performed from IP

2016.01.21 22:17:32.001 '10116295': modify order #1745474749 buy 0.01 USDCAD at 1.4318 sl: 1.4198 tp: 1.4418 -> sl: 0.0020 tp: 1.4418
2016.01.21 22:17:32.183 '10116295': order #1745474749 buy 0.01 USDCAD at 1.4318 was modified -> sl: 0.0020 tp: 1.4418

И после этого порезались все отложки:

2016.01.21 22:17:32.183 '10116295': delete pending order #1745474752 buy limit 0.01 USDCAD at 1.4258 sl: 1.4198 tp: 1.4358
2016.01.21 22:17:32.383 '10116295': pending order #1745474752 was deleted
2016.01.21 22:17:32.383 '10116295': delete pending order #1745474751 buy limit 0.01 USDCAD at 1.4278 sl: 1.4198 tp: 1.4378
2016.01.21 22:17:32.593 '10116295': pending order #1745474751 was deleted
2016.01.21 22:17:32.613 '10116295': delete pending order #1745474750 buy limit 0.01 USDCAD at 1.4298 sl: 1.4198 tp: 1.4398
2016.01.21 22:17:32.795 '10116295': pending order #1745474750 was deleted
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 21 января 2016, 22:40
+
0
Решено наполовину!
Решено полностью!
Редактирован: 22 января 2016, 20:36
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 22 января 2016, 00:51
комментарий был удален 2016-01-30 18:34:03 pacak

+
0
Промежуточная версия Пепелаца с настройками для счета с 4-х знаками, пара USDCAD, Альпари. Все параметры промежуточные, приблизительные и могут быть неточны. И даже очень.
В индикаторе MA_Channels_FIBO_Pepelac значение fibo_red по умолчанию для канадской пары должно быть равно 95.

Добавлен параметр BUPoint (кол-во пунктов безубытка)

//+------------------------------------------------------------------+
//|                                                     Pepelats.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property description "Simple expert advisor"

//--- Inputs (параметры для 4-х знаков)
extern double Lots      = 0.1;      // лот
extern int Stops        = 0;        // 0-стоп на одной цене. 1-лось каждому ордеру
extern int StopLoss     = 120;      // лось
extern int TakeProfit   = 100;      // язь
extern int Count        = 3;        // число отложек
extern int Step         = 20;       // шаг отложек
extern int Magic        = 123;      // магик
extern int Slip         = 3;        // реквот
extern int Expiration   = 24000;    // истечение отложек в часах
extern string BU="Безубыток";
extern int BULevel      = 65;       // уровень включения БУ
extern int BUPoint      = 10;       // пунктов БУ
extern string IndName="MA_Chanels_FIBO_Pepelac";
extern int Buff         = 1;        // 1-61.8, 2-50, 3-38.2, 4-23.5
extern int BarsCount    = 500;      // баров для расчета индикатора
extern int MAPeriod     = 100;      // период МА


int OrdType=0;
double Stop=0,MarketPrice=0;
datetime TimeOpen=0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
  
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
  
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr;
   double sl=0,tp=0;
   datetime expiration=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(type>1 && Stops==0) sl=NormalizeDouble(Stop,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   if(type==2 || type==3) expiration=TimeCurrent()+3600*Expiration;
   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,expiration,clr);
   return;
  }
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) count++;
           }
        }
     }
   return(count);
  }
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del=true;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime LastOrderOpenTime()
  {
   datetime t=0;
   if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderMagicNumber()==Magic || OrderSymbol()==Symbol())
        {
         if(OrderProfit()>0)//tp  
           {
            t=OrderOpenTime();
           }
        }
     }
   return(t);
  }  

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void BU()
  {
   bool m;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
//Здесь делаем нормализацию, чтоб небыло ошибки OrderModify Error 1                               
               if(OrderStopLoss()!=NormalizeDouble(MarketPrice+BUPoint*Point,Digits))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),MarketPrice+BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(OrderStopLoss()!=NormalizeDouble(MarketPrice-BUPoint*Point,Digits))
                 {
                  m=OrderModify(OrderTicket(),OrderOpenPrice(),MarketPrice-BUPoint*Point,OrderTakeProfit(),0,Yellow);
                  return;
                 }
              }
           }
        }
     }
  }
  
  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int i=0;
   double up=0,dn=0;


// Перемещаем это условие вперед. Удаляем ордера ДО выставления новой сетки
// Этот кусок активируем если БУ=false
/*
   if(LastOrderOpenTime()>=TimeOpen)
     {
      DelOrder();
     }
*/

// Это условие выхода с БУ
   if(CountTrades()>0 && ((OrdType==0 && Bid-MarketPrice>BULevel*Point) || (OrdType==1 && MarketPrice-Ask>BULevel*Point)))
     {
      BU();
      DelOrder();
     }

// Допишу   
   if(Buff==1)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,0,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,7,1);
     }

   if(Buff==2)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,1,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,6,1);
     }

   if(Buff==3)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,2,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,5,1);
     }

   if(Buff==4)
     {
      up=iCustom(NULL,0,IndName,BarsCount,MAPeriod,3,1);
      dn=iCustom(NULL,0,IndName,BarsCount,MAPeriod,4,1);
     }

   if(CountTrades()<1)
     {
      if(Ask<dn && CountOrders(2)<1)//бай и бай лимит
        {
         PutOrder(0,Ask);
         TimeOpen=TimeCurrent();
         Stop=Ask-StopLoss*Point;
         MarketPrice=Ask;
         OrdType=0;

         for(i=1; i<=Count;i++)
           {
            PutOrder(2,Ask-Step*Point*i);
           }
        }
      if(Bid>up && CountOrders(3)<1)//селл и селл лимит
        {
         PutOrder(1,Bid);
         TimeOpen=TimeCurrent();
         Stop=Bid+StopLoss*Point;
         MarketPrice=Bid;
         OrdType=1;

         for(i=1; i<=Count;i++)
           {
            PutOrder(3,Bid+Step*Point*i);
           }
        }
     }

/*     
   Comment("\n Stop: ",Stop,
           "\n MarketPrice: ",MarketPrice,
           "\n OrderType: ",OrdType);
*/           
  }
//+------------------------------------------------------------------+

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

Спасибо АМ2 за роботизацию Пепелаца! *friends* 
КУ ТОВАРИЩИ!
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 21 января 2016, 17:43
комментарий был удален 2016-01-22 23:29:46 pacak

+
0
Стоит добавить функции:
1. Трал: перенос в БУ на N-п. от линии ордера при проходе цены определённого кол-ва в п. от ордера, и от следующего по ходу уровня каналов (Фибо).
Далее тралится с указанным отступом от линии цены, либо также — от следующих уровней канала.

2. Закрытие по условиям:

2.1. Закрытие прибыльного ордера при открытии встречного ордера, убыточные — не закрываются.

2.2. Закрытие при достижении указанного уровня канала по ходу ордера.

3. Объединение в одну линию и модификация СЛ(стоп-лосс) и ТП(тейк-профит) от ордеров в сетке, при открытии новых ордеров в ту же сторону с первоначальным — если идёт тренд.
Трал в этом случае тралит общие линии СЛ и ТП.

4. Локирующий ордер на отрицательный ордер или усреднённую линию стопов нескольких ордеров в сетке вместо СЛ(стоп-лосса).
Т.е. выставляются вместо СЛ Стоповые ордера(buy stop или sell stop).
Лимитное кол-во шагов в сетке задаётся с учётом ММ(лотность, просадка и р-р депозита).
— Локи далее разруливаются либо руками, либо по отдельному алгоритму доп. советником, либо доп. модулем тут.
Смысл в том, чтобы не снижать размер депозита, оставлять шанс на компенсацию и разруливать локи отдельно, параллельно со следующими ордерами от советника,
иногда — закрывая и открывая ордера с учётом ордеров в локе как частично, так и по их средним линиям — линиям всех/части ордеров Селл и ордеров Бай.


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

6. Добавить динамический трал на открытие ордеров по движению цены дальше уровня крайнего канала (ловля пиков).
Т.е. когда цена пересекает крайнюю линию канала (красная), открывать ордер,
а) если цена прошла дальше на N-п.,
б) если цена на последующей свече разворачивается — идёт откат от предыдущего максимума.
в) либо по открытию ордера на закрытии каждой свечи, «за красной линией», если её Максимум(бай)/минимум(селл) был выше(бай)/ниже(селл) предыдущего.
Редактирован: 6 февраля 2016, 12:35
avatar

  11  preasto Сообщений: 445

  • 30 января 2016, 15:31
+
+1
Я доработал Пепелаца, выложу на неделе в своей теме с пояснениями для теста. Настроек стало много, советник очень гибко настраиваемый.
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 30 января 2016, 18:53
+
0
Есть подвижки?
Присмотритесь пож. к идее сделать функцию:
4. Локирующий ордер на отрицательный ордер или усреднённую линию стопов нескольких ордеров в сетке вместо СЛ(стоп-лосса).
Т.е. выставляются вместо СЛ Стоповые ордера(buy stop или sell stop).
— локи поставленные на границах каналов, да, и, в середине канала, перекрывают друг-друга и дают возможность на разворотах закрывать их в БУ и даже плюс*.
Снижая существенно потери от СЛ.
Очень далеко ушедшее по безоткатному тренду, также может висеть неск. дней до коррекции, либо закрыто руками — как СЛ (так СЛ был бы уже давно...).
Свопы с лихвой перекрываются профитом на тех же ордерах локов закрываемый уже в нужном направлении и на новых ордерах.
Зато депозит сохраняется максимально и даётся возможность разрулить ситуацию в прибыль.

*закрытие локов ведётся уже руками, по старшим ТФ, либо по ситуации в логике самого советника,
когда, допустим, появляется установленный профит по всем ордерам и все закрываются,
либо отд. советниками-разруливателями.
Вопрос программирования разруливания локов надо пока оставить на след. этап.
И, поставив лок вместо СЛ, сов. продолжает работу далее, открывая новые ордера по ТС.

Редактирован: 6 февраля 2016, 12:34
avatar

  11  preasto Сообщений: 445

  • 6 февраля 2016, 11:36
+
0
бывает часто отложки не выставляет с ошибкой:
«OrderSend error 130»
avatar

  9  yurez83 Сообщений: 34 - Юрий

  • 21 января 2016, 20:20
+
0
бывает часто отложки не выставляет с ошибкой:
«OrderSend error 130»


Здесь нужно учитывать размер стопа, сделать его побольше.
avatar

  34  AM2 Сообщений: 15880 - Андрей

  • 22 января 2016, 01:16
+
0
стоят настройки по умолчанию. стоп 500 — куда ж больше…
ставит вместо 5 отложек почему то 2, а остальные ошибка 130.
скрин:
avatar

  9  yurez83 Сообщений: 34 - Юрий

  • 22 января 2016, 13:39
+
0
ох. только обратил внимание — сл по всем ордерам одинаковый выставляется… тогда извиняюсь. :)  я почему то думал, что для всех отложек сл 500 п. должен быть.
avatar

  9  yurez83 Сообщений: 34 - Юрий

  • 22 января 2016, 13:46
+
0
Подскажите, поставил советник на eurusd m1 со стандартными настройками. Ошибок никаких нет. Поробывал выставлять значение sl больше, тоже ничего не происходит. Хотя в тестере показывает, что ордера должны открываться.
Редактирован: 23 января 2016, 00:21
avatar

  6  mops0000 Сообщений: 31

  • 22 января 2016, 19:07
+
0
Вот что действительно было бы хорошей штукой в Пепелаце, это задержка открытия следующей сети ордеров, значение которой можно было бы регулировать и вынести в переменные задаваемые пользователем.

К примеру закрылся ордер, тот, с которого стартовала сетка, первый рыночный (по стопу или тейку, неважно), и после этого события отдыхаем N-цать минут, и как они истекут, уже ждем наступления сигнала и снова в бой *budenov* 
avatar

  19  pacak Автор Сообщений: 545 - варвар Andre

  • 30 января 2016, 19:10
+
0
Есть какие-то подвижки по Пепелацу?
avatar

  11  preasto Сообщений: 445

  • 28 мая 2016, 23:55
+
0
Что-то наверное не пошло, уже как 4 месяца минуло…
avatar

  8  WolfTraderS Сообщений: 142

  • 29 мая 2016, 10:01
+
0
Конечно не пойдет, знающий человек это сразу поймет :) 

Торговля против тренда, это плохо ( 

Все *hi* 
avatar

  14  beton2011 Сообщений: 895

  • 29 мая 2016, 11:44
+
0
Это торговля в канале, когда на старшем шорт и цена корректируется в бай активируя отложки в селл, то при возрате получается профит и торговля по тренду, тут главное рассчитать величину коррекции т.е ширину канала
avatar

  16  cerber04 Сообщений: 409

  • 29 мая 2016, 13:59

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