0
Советник отрабатывает паттерн указанный вами на рисунке: www.opentraders.ru/downloads/1017/

avatar

AM2

  • 20 января 2016, 01:50
0
Можно будет сделать.
avatar

AM2

  • 19 января 2016, 19:44
0
Андрей! не тралит он за ценой.


Сегодня стоял без трала только серия лок и профит. Еще раз посмотрю с тралом.



avatar

AM2

  • 19 января 2016, 17:35
0
Советник только покупает, можете добавить выбор направления?


В коде переставьте комменты на другую строчку. Вы знаете как это делать :) 
avatar

AM2

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

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

AM2

  • 19 января 2016, 17:28
0
осталась проблема трала.


Трал мы проверяли уже, попробуйте поставить в настройках TrailingStop значение больше 0. Я делал 0 чтобы ордера не тралил на время.


extern string s="------- Внешние параметры трала------------";
extern bool   AllPositions   = True;  // Управлять всеми позициями
extern bool   ProfitTrailing = True;  // Тралить только профит
extern int    TrailingStop   = 0;     // Фиксированный размер трала
extern int    TrailingStep   = 2;     // Шаг трала
avatar

AM2

  • 19 января 2016, 10:48
0
только этот трал работает когда ордера идут в прибыль.


В настройках трала можно менять тралить профит или сразу за ценой.
avatar

AM2

  • 19 января 2016, 10:23
+1
Можно вас попросить добавить открытие ордера на пробитие сречи например пробил в низ дневную свечу открыл селл и наоборот, чтобы в тестере подобрать оптимальные параметры для каждой пары.


Это будет уже не помощник, сделаю отдельным файлом.
avatar

AM2

  • 19 января 2016, 10:02
0
Вот дождался я этого момента когда выставит серию, лок и уйдет в плюс. все закрыл как положено. Я еще вносил изменения: www.opentraders.ru/downloads/1008/

avatar

AM2

  • 19 января 2016, 07:44
+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

AM2

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


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

avatar

AM2

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


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

AM2

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


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

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


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

AM2

  • 18 января 2016, 22:43
+2
Вот набросок. Только что из печки :)  Можно тестировать в тестере.



www.opentraders.ru/downloads/1016/
avatar

AM2

  • 18 января 2016, 15:09
+1
Сейчас займусь.
avatar

AM2

  • 18 января 2016, 13:57
+1
Вы в базе смотрели нет подобных?
Вот один нашел: www.opentraders.ru/downloads/778/
Еще: opentraders.ru/downloads/800

В общем набираете в поиске: Советник Усреднитель

www.opentraders.ru/search/?q=%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D0%BD%D0%B8%D0%BA%20%D0%A3%D1%81%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C
avatar

AM2

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

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

AM2

  • 18 января 2016, 04:59
+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);
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 18 января 2016, 04:45
+1
Поправил скрипт: www.opentraders.ru/downloads/1010/

avatar

AM2

  • 18 января 2016, 03:50