Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2261

 
Aleksei Stepanenko #:
Если это веб-интерфейс, то можно http-запросами делать, что нужно. Читать, нажимать, выбирать, писать.

Спасибо, в общем нашел как это сделать, управление компьютером из МТ через  WinAPI, для одного вэб терминала достаточно горячих клавиш. А если нужно несколько окон, то при помощи какого нибудь доступного кликера можно эмулировать работу мыши, уже с горячих клавиш, как то так...

 

Добрый день!

Подскажите, пожалуйста, каким образом можно реализовать данную задумку: имеется внешний индикатор разворотного бара (по системе Торговый Хаос 2) - каким образом можно реализовать в советнике простую функцию - покупать на пробой максимума разворотного бара (при его нахождении под Аллигатором) и продавать на пробой минимума (при нахождении - над). 

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

//----------------------------------------------------
extern double LotsFor100      = 0.01;
extern int TakeProfit         = 300;
extern int StopLoss           = 50;
extern int Magic              = 111;  
extern int Slippage           = 3;
//----------------------------------------------------
extern int     BarsToProcess=200;   //максимальное колличество баров для расчета (-1 все)
extern int width=2;                 //толщина отображения тела развротного бара 

//----------------------------------------------------
double DivergenceBar,  SL, TP;
int ticket; 

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
   TakeProfit *=10;
   StopLoss   *=10;
   Slippage   *=10;
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()

{
  double clots = AccountBalance()/100*LotsFor100;
  clots = MathMax(clots, MarketInfo(Symbol(), MODE_MINLOT));
  clots = MathMin(clots, MarketInfo(Symbol(), MODE_MAXLOT));
  
  clots = NormalizeDouble(clots, 2);
 

 DivergenceBar = iCustom(NULL, 0, "i-DivergenceBar", BarsToProcess, width, 0, 0);

 
     
   if (CountBuy () == 0 && Ask > DivergenceBar)
   {
     ticket = OrderSend(Symbol(),OP_BUY, clots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
     if (ticket > 0)
     {
        TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
        SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
        
        if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
            Print ("Ошибка");
     }else Print("Ошибка");
     }
   
      if (CountSell () == 0 && Bid < DivergenceBar)
   {
   
     ticket = OrderSend(Symbol(),OP_SELL, clots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
     if (ticket > 0)
     {
        SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
        TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
        
        if (OrderSelect(ticket, SELECT_BY_TICKET))
           if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print ("Ошибка");
     }  else Print("Ошибка");
     }
    
  
}
//+------------------------------------------------------------------+

int CountBuy()
{
int count = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)
  {
    if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic  && OrderType() == OP_BUY)
    count++;
    }
  }
  return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)
  {
    if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic  && OrderType() == OP_SELL)
    count++;
    }
  }
  return(count);
}
//+------------------------------------------------------------------+

  Код индикатора:

//---- подключаем ядро системы Profitunity_MT4
//---- Настройки цветов для отображения
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Lime
#property indicator_color4 Lime

//---- Внешние настройки индикатора
extern int     BarsToProcess=200;   //максимальное колличество баров для расчета (-1 все)
extern int width=2;                 //толщина отображения тела развротного бара 

//---- буферы для отображения индикатора
double   UpBuffer1[],
         DnBuffer1[],
         UpBuffer2[],
         DnBuffer2[];
//+------------------------------------------------------------------+
//| Инциализация индикатора                                          |
//+------------------------------------------------------------------+
int init()
  {
//---- начало инциализации индикатора  
//---- связываем массив с буфером индикатора   
   SetIndexBuffer(0,UpBuffer1);
   SetIndexBuffer(1,DnBuffer1);
   SetIndexBuffer(2,UpBuffer2);
   SetIndexBuffer(3,DnBuffer2);
//---- Установим стиль отображения линий
   SetIndexStyle(0,DRAW_HISTOGRAM,0,width);
   SetIndexStyle(1,DRAW_HISTOGRAM,0,width);
   SetIndexStyle(2,DRAW_HISTOGRAM,0,width);
   SetIndexStyle(3,DRAW_HISTOGRAM,0,width);
//---- установим короткое имя индикатора и каждой линии в отдельности
   IndicatorShortName("i-DiverBar");  
   SetIndexLabel(0,NULL);
   SetIndexLabel(1,NULL);
   SetIndexLabel(2,NULL);
   SetIndexLabel(3,NULL);
   SetIndexLabel(4,NULL);
   SetIndexLabel(5,NULL);
//---- Инициализация завершена
   return(0);
  }
//+------------------------------------------------------------------+
//| Деинициализация индикатора                                       |
//+------------------------------------------------------------------+   
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+ 
//| Расчет индикатора                                                | 
//+------------------------------------------------------------------+   
int start()
  {
   int  i, counted_bars = IndicatorCounted(),limit;
   double lips,teeth,jaw,up,dn;
//---- проверка на возможные ошибки
   if(counted_bars<0) return(-1);
//---- проверка наличия истории  
   if(iBars(Symbol(),Period())<14) 
    {
     Print("Недостаточно баров для расчета индикатора!");
     return(-1); 
    }    
//---- найдем количество баров для расчета индикатора    
   limit = Bars - counted_bars-1;
   if(Bars - counted_bars > 2) limit = Bars-35;
   if(limit>BarsToProcess && BarsToProcess>0) limit=BarsToProcess;
//---- отобразим индикатор 
   for(i=limit;i>=0;i--) 
      {  
       UpBuffer1[i] =EMPTY;
       UpBuffer2[i] =EMPTY; 
   
       DnBuffer1[i] =EMPTY;
       DnBuffer2[i] =EMPTY;
       
       lips=iAlligator(Symbol(),Period(),13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,i);
       teeth=iAlligator(Symbol(),Period(),13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,i);
       jaw=iAlligator(Symbol(),Period(),13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,i);
       
       up=MathMax(lips,MathMax(teeth,jaw));
       dn=MathMin(lips,MathMin(teeth,jaw));
       
       if(High[i]>High[i+1] && Close[i]<High[i]-0.5*(High[i]-Low[i]) && Low[i]>up)
         {
          UpBuffer1[i] = Low[i]+(High[i]-Low[i])/2+(High[i]-Low[i])/10;
          DnBuffer1[i] = Low[i]+(High[i]-Low[i])/2-(High[i]-Low[i])/10;
         }
       else   
       if(Low[i]<Low[i+1] && Close[i]>Low[i]+0.5*(High[i]-Low[i]) && High[i]<dn)
         {
          UpBuffer2[i] = Low[i]+(High[i]-Low[i])/2+(High[i]-Low[i])/10;
          DnBuffer2[i] = Low[i]+(High[i]-Low[i])/2-(High[i]-Low[i])/10;
         }
      } 
   return(0);
  }
//+------------------------------------------------------------------+

Заранее - большое спасибо за помощь!

 
Alex8888888888 #:

Добрый день!

Подскажите, пожалуйста, каким образом можно реализовать данную задумку: имеется внешний индикатор разворотного бара (по системе Торговый Хаос 2) - каким образом можно реализовать в советнике простую функцию - покупать на пробой максимума разворотного бара (при его нахождении под Аллигатором) и продавать на пробой минимума (при нахождении - над). 

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

  Код индикатора:

Заранее - большое спасибо за помощь!

Для начала поправим индикатор

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 clrLime
#property indicator_color2 clrRed

//---- Внешние настройки индикатора
extern int BarsToProcess=200;   //максимальное колличество баров для расчета (-1 все)
extern int width=2;             //толщина отображения тела развротного бара 

//---- буферы для отображения индикатора
double   UpBuffer1[],
         DnBuffer1[];
//+------------------------------------------------------------------+
//| Инциализация индикатора                                          |
//+------------------------------------------------------------------+
int init()
  {
//---- начало инциализации индикатора
   IndicatorDigits(Digits);
//---- связываем массив с буфером индикатора   
   SetIndexBuffer(0,UpBuffer1);
   SetIndexBuffer(1,DnBuffer1);
//---- Установим стиль отображения линий
   SetIndexStyle(0,DRAW_HISTOGRAM,0,width);
   SetIndexStyle(1,DRAW_HISTOGRAM,0,width);
//---- установим короткое имя индикатора и каждой линии в отдельности
   IndicatorShortName("i-DiverBar");  
   SetIndexLabel(0,"Hi");
   SetIndexLabel(1,"Lo");
//---- Инициализация завершена
   return(0);
  }
//+------------------------------------------------------------------+
//| Деинициализация индикатора                                       |
//+------------------------------------------------------------------+   
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+ 
//| Расчет индикатора                                                | 
//+------------------------------------------------------------------+   
int start()
  {
   int  i, counted_bars = IndicatorCounted(),limit;
   double lips,teeth,jaw,up,dn;
//---- проверка на возможные ошибки
   if(counted_bars<0) return(-1);
//---- проверка наличия истории  
   if(iBars(Symbol(),Period())<14) 
    {
     Print("Недостаточно баров для расчета индикатора!");
     return(-1); 
    }    
//---- найдем количество баров для расчета индикатора    
   limit = Bars - counted_bars-1;
   if(Bars - counted_bars > 2) limit = Bars-35;
   if(limit>BarsToProcess && BarsToProcess>0) limit=BarsToProcess;
//---- отобразим индикатор 
   for(i=limit;i>=0;i--) 
      {  
       UpBuffer1[i] =EMPTY_VALUE;
       DnBuffer1[i] =EMPTY_VALUE;
       
       lips=iAlligator(Symbol(),Period(),13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,i);
       teeth=iAlligator(Symbol(),Period(),13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,i);
       jaw=iAlligator(Symbol(),Period(),13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,i);
       
       up=MathMax(lips,MathMax(teeth,jaw));
       dn=MathMin(lips,MathMin(teeth,jaw));
       
       if(High[i]>High[i+1] && Close[i]<High[i]-0.5*(High[i]-Low[i]) && Low[i]>up)
         {
          DnBuffer1[i] = Low[i]+(High[i]-Low[i])/2+(High[i]-Low[i])/10;
          UpBuffer1[i] = Low[i]+(High[i]-Low[i])/2-(High[i]-Low[i])/10;
         }
       else   
       if(Low[i]<Low[i+1] && Close[i]>Low[i]+0.5*(High[i]-Low[i]) && High[i]<dn)
         {
          UpBuffer1[i] = Low[i]+(High[i]-Low[i])/2+(High[i]-Low[i])/10;
          DnBuffer1[i] = Low[i]+(High[i]-Low[i])/2-(High[i]-Low[i])/10;
         }
      } 
   return(0);
  }
//+------------------------------------------------------------------+

Теперь у Вас будет два буфера обмена для советника

DivergenceBar_1 = iCustom(NULL, 0, "i-DivergenceBar", BarsToProcess, width, 0, 1);
DivergenceBar_2 = iCustom(NULL, 0, "i-DivergenceBar", BarsToProcess, width, 1, 1);

Далее в советнике определяете направление разворотного бара и запоминаете цену для открытия ордера

if(DivergenceBar_1>DivergenceBar_2)
  {
   bar_up=true; price_up=High[1];
  }
if(DivergenceBar_1<DivergenceBar_2)
  {
   bar_dn=true; price_dn=Low[1];
  }
 

Ростислав, большое спасибо!

Начну реализовывать Ваши исправления и рекомендации. 

 

Ростислав, подскажите, пожалуйста, еще такой момент - каким образом можно доработать систему, чтобы не было такой ситуации: когда условие входа в позицию выполняется спустя несколько баров, а не на следующем. Во вложении - ситуация на графике. 

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

Код, в нынешнем виде с Вашими рекомендациями: 

//----------------------------------------------------
extern double LotsFor100      = 0.01;
extern int TakeProfit         = 300;
extern int StopLoss           = 50;
extern int Magic              = 111;  
extern int Slippage           = 3;
//----------------------------------------------------
extern int     BarsToProcess=200;   //максимальное колличество баров для расчета (-1 все)
extern int width=2;                 //толщина отображения тела развротного бара 

//----------------------------------------------------
double DivergenceBar_1, DivergenceBar_2,  SL, TP, price_up, price_dn;
int ticket; 
bool bar_up,  bar_dn;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
   TakeProfit *=10;
   StopLoss   *=10;
   Slippage   *=10;
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()

{
  double clots = AccountBalance()/100*LotsFor100;
  clots = MathMax(clots, MarketInfo(Symbol(), MODE_MINLOT));
  clots = MathMin(clots, MarketInfo(Symbol(), MODE_MAXLOT));
  
  clots = NormalizeDouble(clots, 2);
 

 DivergenceBar_1 = iCustom(NULL, 0, "i-DivergenceBar", BarsToProcess, width, 0, 1);
 DivergenceBar_2 = iCustom(NULL, 0, "i-DivergenceBar", BarsToProcess, width, 1, 1);
 if(DivergenceBar_1>DivergenceBar_2)
  {
   bar_up=true; price_up=High[1];
  }
if(DivergenceBar_1<DivergenceBar_2)
  {
   bar_dn=true; price_dn=Low[1];
  }
     
   if (CountBuy () == 0 &&  bar_up==true && Ask > price_up)
   {
     ticket = OrderSend(Symbol(),OP_BUY, clots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
     if (ticket > 0)
     {
        TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
        SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
        
        if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
            Print ("Ошибка");
     }else Print("Ошибка");
     }
   
      if (CountSell () == 0 &&  bar_dn==true && Bid < price_dn)
   {
   
     ticket = OrderSend(Symbol(),OP_SELL, clots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
     if (ticket > 0)
     {
        SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
        TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
        
        if (OrderSelect(ticket, SELECT_BY_TICKET))
           if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print ("Ошибка");
     }  else Print("Ошибка");
     }
    
  
}
//+------------------------------------------------------------------+

int CountBuy()
{
int count = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)
  {
    if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic  && OrderType() == OP_BUY)
    count++;
    }
  }
  return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
int count = 0;

for (int trade = OrdersTotal()-1; trade>=0; trade--)
  {
    if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic  && OrderType() == OP_SELL)
    count++;
    }
  }
  return(count);
}
//+------------------------------------------------------------------+
Файлы:
4lyjdsx1nx.jpg  36 kb
 
Alex8888888888 #:
if(DivergenceBar_1>DivergenceBar_2)
  {
   bar_up=true; price_up=High[1]; time_bar_up=Time[0];
  }
if(DivergenceBar_1<DivergenceBar_2)
  {
   bar_dn=true; price_dn=Low[1]; time_bar_dn=Time[0];
  }
     
   if (CountBuy () == 0 &&  bar_up==true && time_bar_up==Time[0] && Ask > price_up)
   {

Аналогично для продаж

 

Большое спасибо!

Все отлично работает

 
Vyacheslav.K #:

Добрый день!

Воспользуйтесь кнопкой вставки кода


 

Добрый день!

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

//+------------------------------------------------------------------+
   int    cnt=1,snt=1;
   double lastupfr=0;
   double lastdnfr=0;

   while(cnt<100)
   {
      double upfr=GetNearestUpFractal(SYMBOL,TF,2,2);
      if(upfr!=0)
      {
         if(upfr>lastupfr) lastupfr=upfr;
         cnt++;
      }
   }
   Print("Biggest UpFractal = ",lastupfr);   

   while(snt<100)
   {
      double dnfr=GetNearestDownFractal(SYMBOL,TF,2,2);
      if(dnfr!=0)
      {
         if(dnfr>lastdnfr) lastdnfr=dnfr;
         snt++;
      }
   }
   Print("Biggest DnFractal = ",lastdnfr);

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

С уважением, Вячеслав.

 
Vyacheslav.K #:

Добрый день!

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

С уважением, Вячеслав.

А как работает эта функция?

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