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

Рейтинг 2146



РЕКОМЕНДУЮ



Индикатор для МТ4 Parabolic Sar + всплывающее окно с алертом + счётчик точек + с указанием направления

Здравствуйте! Возможно подДелать этот индикатор, а именно научить его считать свои точки как баевские так и селловские — одновременно? Включая их в одну торговую комбинацию с последующим выводом инф.окошка с алертом и указанием пары и указанием направления вверх или вниз, где меньше точек в том направлении и вход? К примерумы ввели в первой настройке 31точка — образуется 1-ая часть выполняемой комбинации 31 точка параболика без разницы бай или селл (см.скрин) и 2-ая часть выполняемой комбинации 2 точки, сложилась такая ситуация выпрыгивает окошко с алертом и указанием пары и указанием направления входа.
Parabolic.mq4 (7 Kb)
1-aya situatsiya.JPG (110 Kb)
2-situatsiya.JPG (104 Kb)



  • +4
  • Просмотров: 5635
  • 19 ноября 2016, 19:25
  • Shiva
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

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

+
0
Просьба скидывать картинки в топик.
avatar

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

  • 19 ноября 2016, 19:30
+
0
Сам поправил. Завтра посмотрю.
avatar

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

  • 19 ноября 2016, 19:35
+
0
avatar

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

  • 20 ноября 2016, 09:43
+
0
Добавьте пож.:
1. Р-р 1й точки SAR — т.к. когда она мелкая и попадает на линии, уровни — её незамечаешь во-время.
Т.е., чтобы её м.б. сделать крупнее остальных точек.
2. Сигнал на появление 1й точки др. направления (вкл/откл)
К комментах окна сообщений удобно, нагляднее и по-короче в таком порядке:
(имя_пары),№(имя)ТФ SAR,…
Редактирован: 21 ноября 2016, 13:45
avatar

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

  • 21 ноября 2016, 13:38
+
0
Здравствуйте! Поставил индюка, а настройки только такие? *help* 
avatar

  10  Shiva Автор Сообщений: 148

  • 22 ноября 2016, 12:24
+
+1
Обновил и скинул кодом: www.opentraders.ru/downloads/1392/

//+------------------------------------------------------------------+
//|                                                    Parabolic.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Parabolic Stop-And-Reversal system"
#property strict

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Lime
//--- input parameters
input double InpSARStep=0.02;    // Step
input double InpSARMaximum=0.2;  // Maximum
input int Points=32;

//---- buffers
double       ExtSARBuffer[];
//--- global variables
double       ExtSarStep;
double       ExtSarMaximum;
int          ExtLastReverse;
bool         ExtDirectionLong;
double       ExtLastStep,ExtLastEP,ExtLastSAR;
double       ExtLastHigh,ExtLastLow;
int points=0,up=0,dn=0;
datetime t=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- checking input data
   if(InpSARStep<0.0)
     {
      ExtSarStep=0.02;
      Print("Input parametr InpSARStep has incorrect value. Indicator will use value ",
            ExtSarStep," for calculations.");
     }
   else
      ExtSarStep=InpSARStep;
   if(InpSARMaximum<0.0)
     {
      ExtSarMaximum=0.2;
      Print("Input parametr InpSARMaximum has incorrect value. Indicator will use value ",
            ExtSarMaximum," for calculations.");
     }
   else
      ExtSarMaximum=InpSARMaximum;
//--- drawing settings
   IndicatorDigits(Digits);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,159);
//---- indicator buffers
   SetIndexBuffer(0,ExtSARBuffer);
//--- set short name
   IndicatorShortName("SAR("+DoubleToString(ExtSarStep,2)+","+DoubleToString(ExtSarMaximum,2)+")");
//--- set global variables
   ExtLastReverse=0;
   ExtDirectionLong=false;
   ExtLastStep=ExtLastEP=ExtLastSAR=0.0;
   ExtLastHigh=ExtLastLow=0.0;
//----
  }
//+------------------------------------------------------------------+
//| Parabolic SAR                                                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   bool   dir_long;
   double last_high,last_low,ep,sar,step;
   int    i;
//--- check for minimum rates count
   if(rates_total<3)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtSARBuffer,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
//--- detect current position for calculations 
   i=prev_calculated-1;
//--- calculations from start?
   if(i<1)
     {
      ExtLastReverse=0;
      dir_long=true;
      step=ExtSarStep;
      last_high=-10000000.0;
      last_low=10000000.0;
      sar=0;
      i=1;
      while(i<rates_total-1)
        {
         ExtLastReverse=i;
         if(last_low>low[i])
            last_low=low[i];
         if(last_high<high[i])
            last_high=high[i];
         if(high[i]>high[i-1] && low[i]>low[i-1])
            break;
         if(high[i]<high[i-1] && low[i]<low[i-1])
           {
            dir_long=false;
            break;
           }
         i++;
        }
      //--- initialize with zero
      ArrayInitialize(ExtSARBuffer,0.0);
      //--- go check
      if(dir_long)
        {
         ExtSARBuffer[i]=low[i-1];
         ep=high[i];
        }
      else
        {
         ExtSARBuffer[i]=high[i-1];
         ep=low[i];
        }
      i++;
     }
   else
     {
      //--- calculations to be continued. restore last values
      i=ExtLastReverse;
      step=ExtLastStep;
      dir_long=ExtDirectionLong;
      last_high=ExtLastHigh;
      last_low=ExtLastLow;
      ep=ExtLastEP;
      sar=ExtLastSAR;
     }
//---main cycle
   while(i<rates_total)
     {
      //--- check for reverse
      if(dir_long && low[i]<ExtSARBuffer[i-1])
        {
         SaveLastReverse(i,true,step,low[i],last_high,ep,sar);
         step=ExtSarStep;
         dir_long=false;
         ep=low[i];
         last_low=low[i];
         ExtSARBuffer[i++]=last_high;
         continue;
        }
      if(!dir_long && high[i]>ExtSARBuffer[i-1])
        {
         SaveLastReverse(i,false,step,last_low,high[i],ep,sar);
         step=ExtSarStep;
         dir_long=true;
         ep=high[i];
         last_high=high[i];
         ExtSARBuffer[i++]=last_low;
         continue;
        }
      //---
      sar=ExtSARBuffer[i-1]+step*(ep-ExtSARBuffer[i-1]);
      //--- LONG?
      if(dir_long)
        {
         if(ep<high[i])
           {
            if((step+ExtSarStep)<=ExtSarMaximum)
               step+=ExtSarStep;
           }
         if(high[i]<high[i-1] && i==2)
            sar=ExtSARBuffer[i-1];
         if(sar>low[i-1])
            sar=low[i-1];
         if(sar>low[i-2])
            sar=low[i-2];
         if(sar>low[i])
           {
            SaveLastReverse(i,true,step,low[i],last_high,ep,sar);
            step=ExtSarStep; dir_long=false; ep=low[i];
            last_low=low[i];
            ExtSARBuffer[i++]=last_high;
            continue;
           }
         if(ep<high[i])
            ep=last_high=high[i];
        }
      else // SHORT
        {
         if(ep>low[i])
           {
            if((step+ExtSarStep)<=ExtSarMaximum)
               step+=ExtSarStep;
           }
         if(low[i]<low[i-1] && i==2)
            sar=ExtSARBuffer[i-1];
         if(sar<high[i-1])
            sar=high[i-1];
         if(sar<high[i-2])
            sar=high[i-2];
         if(sar<high[i])
           {
            SaveLastReverse(i,false,step,last_low,high[i],ep,sar);
            step=ExtSarStep;
            dir_long=true;
            ep=high[i];
            last_high=high[i];
            ExtSARBuffer[i++]=last_low;
            continue;
           }
         if(ep>low[i])
            ep=last_low=low[i];
        }
      ExtSARBuffer[i++]=sar;
     }
   if(t!=Time[0])
     {
      points++;
      if(Bid>ExtSARBuffer[rates_total-1]) up++;
      if(Bid<ExtSARBuffer[rates_total-1]) dn++;
      if(points>Points && up<dn)
        {
         Alert(Symbol()+"UP!!!");
         points=0;up=0;dn=0;
        }
      if(points>Points && up>dn) 
        {
         Alert(Symbol()+"DN!!!");
         points=0;up=0;dn=0;
        }
      t=Time[0];
     }
   Comment("\n Points: ",points,
           "\n UP Points: ",up,
           "\n DN Points: ",dn,
           "\n SAR: ",NormalizeDouble(ExtSARBuffer[rates_total-1],Digits),
           "\n Rates Total: ",rates_total);
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|  save last values to continue further calculations               |
//+------------------------------------------------------------------+
void SaveLastReverse(int reverse,bool dir,double step,double last_low,double last_high,double ep,double sar)
  {
   ExtLastReverse=reverse;
   if(ExtLastReverse<2)
      ExtLastReverse=2;
   ExtDirectionLong=dir;
   ExtLastStep=step;
   ExtLastLow=last_low;
   ExtLastHigh=last_high;
   ExtLastEP=ep;
   ExtLastSAR=sar;
  }
//+------------------------------------------------------------------+

avatar

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

  • 22 ноября 2016, 18:28
+
0
(вопрос перенёс ниже)
Редактирован: 28 ноября 2016, 14:56
avatar

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

  • 28 ноября 2016, 14:52
+
+1
Почти получилось, но наверное я не умею объяснить! Можете видео посмотреть…
www.youtube.com/watch?v=HQYiiTus3Ds
avatar

  10  Shiva Автор Сообщений: 148

  • 25 ноября 2016, 19:54
+
+3
Да если бы видео было с самого начала, это сэкономило бы мне время и трудозатраты.
avatar

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

  • 25 ноября 2016, 21:03
+
0
данный Parabolic и Parabolic встроенный в МТ4 создают одинаковую нагрузку на МТ4?
или есть разница?

+++
— Баг: — и при смене ТФ, и возврате на тот же — счётчик Пойнтов обнуляется и начинается каждый раз с 1.
Это неправильно. Надо, чтоб считались все с начала линии, пересчитывая на каждом ТФ при переключении.
Редактирован: 28 ноября 2016, 14:55
avatar

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

  • 28 ноября 2016, 14:42
+
0
хорошо бы показывать первую и сигнальную точки крупнее, и сделать вкл/откл алерта на контрольной точке
Редактирован: 28 ноября 2016, 15:02
avatar

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

  • 28 ноября 2016, 14:41
+
+1
Cегодня вечером буду доделывать.
avatar

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

  • 29 ноября 2016, 07:27
+
0
В сообщении-алерте лучше разделить пару_сигнал подчёркиванием — добавить в код _UP! и др.) так:
USDCAD_UP! M1 SAR(0.02, 0.20).
Ставя 2 SAR с разными настройками — интересная картина получается.
Алерты: вкл/откл
===
Но,
Алерты как-то подаются… не всегда синхронно с первыми точками…
Например, может ли там быть и такое(?):
— идёт алерт (DN), а точки по-прежденму в бай растут — и цена тоже.
Причём — сразу на неск. парах такое;
— менял настройки — «ускорил» параметры (0.04, 0.20) Points: 24,
но, вроде, как, на появление обратной точки инд. сигнал выдаёт не по изменённым настройкам, а по каким-то другим (зашитым), т.к. окно алертов вылазит тогда, когда обратных точек уже несколько.

— иногда, точки есть, алертов — нет.
Может это с функцией подсчёта точек, Points связано…

В инф. табл. Points лучше (компактнее и виднее)выводить в 1 строку, так:
Points:12 UP:12 DN:0
===
Что даёт Points: 32 — в параметрах инд.? Сигнал на 32 точке, или ...?
Редактирован: 29 ноября 2016, 11:05
avatar

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

  • 29 ноября 2016, 10:32
+
+2
Сейчас уже ближе к тому что в видео:




//+------------------------------------------------------------------+
//|                                                    Parabolic.mq4 |
//|                   Copyright 2005-2014, MetaQuotes Software Corp. |
//|                                              http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Parabolic Stop-And-Reversal system"
#property strict

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1  Lime
//--- input parameters
input double InpSARStep=0.02;    // Step
input double InpSARMaximum=0.2;  // Maximum
input int Points=32;

//---- buffers
double       ExtSARBuffer[];
//--- global variables
double       ExtSarStep;
double       ExtSarMaximum;
int          ExtLastReverse;
bool         ExtDirectionLong;
double       ExtLastStep,ExtLastEP,ExtLastSAR;
double       ExtLastHigh,ExtLastLow;
int up=0,dn=0;
datetime t=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- checking input data
   if(InpSARStep<0.0)
     {
      ExtSarStep=0.02;
      Print("Input parametr InpSARStep has incorrect value. Indicator will use value ",
            ExtSarStep," for calculations.");
     }
   else
      ExtSarStep=InpSARStep;
   if(InpSARMaximum<0.0)
     {
      ExtSarMaximum=0.2;
      Print("Input parametr InpSARMaximum has incorrect value. Indicator will use value ",
            ExtSarMaximum," for calculations.");
     }
   else
      ExtSarMaximum=InpSARMaximum;
//--- drawing settings
   IndicatorDigits(Digits);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,159);
//---- indicator buffers
   SetIndexBuffer(0,ExtSARBuffer);
//--- set short name
   IndicatorShortName("SAR("+DoubleToString(ExtSarStep,2)+","+DoubleToString(ExtSarMaximum,2)+")");
//--- set global variables
   ExtLastReverse=0;
   ExtDirectionLong=false;
   ExtLastStep=ExtLastEP=ExtLastSAR=0.0;
   ExtLastHigh=ExtLastLow=0.0;
//----
  }
//+------------------------------------------------------------------+
//| Parabolic SAR                                                    |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   bool   dir_long;
   double last_high,last_low,ep,sar,step;
   int    i;
//--- check for minimum rates count
   if(rates_total<3)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(ExtSARBuffer,false);
   ArraySetAsSeries(high,false);
   ArraySetAsSeries(low,false);
//--- detect current position for calculations 
   i=prev_calculated-1;
//--- calculations from start?
   if(i<1)
     {
      ExtLastReverse=0;
      dir_long=true;
      step=ExtSarStep;
      last_high=-10000000.0;
      last_low=10000000.0;
      sar=0;
      i=1;
      while(i<rates_total-1)
        {
         ExtLastReverse=i;
         if(last_low>low[i])
            last_low=low[i];
         if(last_high<high[i])
            last_high=high[i];
         if(high[i]>high[i-1] && low[i]>low[i-1])
            break;
         if(high[i]<high[i-1] && low[i]<low[i-1])
           {
            dir_long=false;
            break;
           }
         i++;
        }
      //--- initialize with zero
      ArrayInitialize(ExtSARBuffer,0.0);
      //--- go check
      if(dir_long)
        {
         ExtSARBuffer[i]=low[i-1];
         ep=high[i];
        }
      else
        {
         ExtSARBuffer[i]=high[i-1];
         ep=low[i];
        }
      i++;
     }
   else
     {
      //--- calculations to be continued. restore last values
      i=ExtLastReverse;
      step=ExtLastStep;
      dir_long=ExtDirectionLong;
      last_high=ExtLastHigh;
      last_low=ExtLastLow;
      ep=ExtLastEP;
      sar=ExtLastSAR;
     }
//---main cycle
   while(i<rates_total)
     {
      //--- check for reverse
      if(dir_long && low[i]<ExtSARBuffer[i-1])
        {
         SaveLastReverse(i,true,step,low[i],last_high,ep,sar);
         step=ExtSarStep;
         dir_long=false;
         ep=low[i];
         last_low=low[i];
         ExtSARBuffer[i++]=last_high;
         continue;
        }
      if(!dir_long && high[i]>ExtSARBuffer[i-1])
        {
         SaveLastReverse(i,false,step,last_low,high[i],ep,sar);
         step=ExtSarStep;
         dir_long=true;
         ep=high[i];
         last_high=high[i];
         ExtSARBuffer[i++]=last_low;
         continue;
        }
      //---
      sar=ExtSARBuffer[i-1]+step*(ep-ExtSARBuffer[i-1]);
      //--- LONG?
      if(dir_long)
        {
         if(ep<high[i])
           {
            if((step+ExtSarStep)<=ExtSarMaximum)
               step+=ExtSarStep;
           }
         if(high[i]<high[i-1] && i==2)
            sar=ExtSARBuffer[i-1];
         if(sar>low[i-1])
            sar=low[i-1];
         if(sar>low[i-2])
            sar=low[i-2];
         if(sar>low[i])
           {
            SaveLastReverse(i,true,step,low[i],last_high,ep,sar);
            step=ExtSarStep; dir_long=false; ep=low[i];
            last_low=low[i];
            ExtSARBuffer[i++]=last_high;
            continue;
           }
         if(ep<high[i])
            ep=last_high=high[i];
        }
      else // SHORT
        {
         if(ep>low[i])
           {
            if((step+ExtSarStep)<=ExtSarMaximum)
               step+=ExtSarStep;
           }
         if(low[i]<low[i-1] && i==2)
            sar=ExtSARBuffer[i-1];
         if(sar<high[i-1])
            sar=high[i-1];
         if(sar<high[i-2])
            sar=high[i-2];
         if(sar<high[i])
           {
            SaveLastReverse(i,false,step,last_low,high[i],ep,sar);
            step=ExtSarStep;
            dir_long=true;
            ep=high[i];
            last_high=high[i];
            ExtSARBuffer[i++]=last_low;
            continue;
           }
         if(ep>low[i])
            ep=last_low=low[i];
        }
      ExtSARBuffer[i++]=sar;
     }
     
   if(t!=Time[0])
     {
      if(Bid>ExtSARBuffer[rates_total-1]) up++;
      if(Bid<ExtSARBuffer[rates_total-1]) dn++;
      if(dn>Points && up>1)
        {
         Alert(Symbol()+" UP!!!");
         up=0;dn=0;
        }
      if(up>Points && dn>1) 
        {
         Alert(Symbol()+" DN!!!");
         up=0;dn=0;
        }
      t=Time[0];
     }
   Comment("\n UP Points: ",up,
           "\n DN Points: ",dn,
           "\n SAR: ",NormalizeDouble(ExtSARBuffer[rates_total-1],Digits),
           "\n Rates Total: ",rates_total);
//---- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|  save last values to continue further calculations               |
//+------------------------------------------------------------------+
void SaveLastReverse(int reverse,bool dir,double step,double last_low,double last_high,double ep,double sar)
  {
   ExtLastReverse=reverse;
   if(ExtLastReverse<2)
      ExtLastReverse=2;
   ExtDirectionLong=dir;
   ExtLastStep=step;
   ExtLastLow=last_low;
   ExtLastHigh=last_high;
   ExtLastEP=ep;
   ExtLastSAR=sar;
  }
//+------------------------------------------------------------------+

avatar

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

  • 29 ноября 2016, 20:07

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