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

Рейтинг 2089



РЕКОМЕНДУЮ



прошу проверить индикатор

BeginnerAlert.mq4 (4 Kb)

прошу посмотреть индикатор и попробовать его исправить.
индикатор достаточно точный, но проблемма в том, что он не
обновляет данные и что бы он работал(находил точки разворота),
его нужно постоянно вручную обновлять следующим способом:
либо заходить в свойства имитируя установку на график,
либо переключать таймфреймы((
вот например на М1 или М5 эти манипуляции приходится делать
чуть ли не каждые две-три минуты(
  • +1
  • Просмотров: 3513
  • 9 мая 2015, 21:06
  • russwill
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

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

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

+
0
Сейчас буду смотреть
avatar

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

  • 10 мая 2015, 08:34
+
0
С началом торгов смогу отладить.
avatar

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

  • 10 мая 2015, 08:58
+
0
Пробовал разобраться с чужим кодом. Никак. Напишите ТЗ попробую написать с нуля.


//+------------------------------------------------------------------+
//|                                                     Beginner.mq4 |
//|                                                 Copyright © 2007 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Heaven"
#property link      "http://Beginner.com"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#define  SH_BUY   1
#define  SH_SELL  -1
//---- Входные параметры
extern bool SoundON=true;
extern int     AllBars=0;//Для скольки баров считать. 0 - для всех.
extern int     Otstup=30;//Отступ.
extern double  Per=9;//Период.
//----
int            SH,NB,i,UD;
double         R,SHMax,SHMin;
double         BufD[];
double         BufU[];
int flagval1=0;
int flagval2=0;
//+------------------------------------------------------------------+
//| Функция инициализации                                            |
//+------------------------------------------------------------------+
int init()
  {
   //В NB записываем количество баров для которых считаем индикатор
   if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
   IndicatorBuffers(2);
   IndicatorShortName("SHI_SilverTrendSig");
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(0,159);
   SetIndexArrow(1,159);
   SetIndexBuffer(0,BufU);
   SetIndexBuffer(1,BufD);
   SetIndexDrawBegin(0,Bars-NB);//Индикатор будет отображаться только для NB баров
   SetIndexDrawBegin(1,Bars-NB);
   ArrayInitialize(BufD,0.0);//Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
   ArrayInitialize(BufU,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
//| Функция деинициализации                                          |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Собсна индикатор                                                 |
//+------------------------------------------------------------------+
int start()
  {
   int CB=IndicatorCounted();
   i=Bars-CB-1;
 
   /* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
   посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
   не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
   то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
   обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
   и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
   до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
   
   
   /*прошу посмотреть индикатор и попробовать его исправить.
   индикатор достаточно точный, но проблемма в том, что он не
   обновляет данные и что бы он работал(находил точки разворота),
   его нужно постоянно вручную обновлять следующим способом: 
   либо заходить в свойства имитируя установку на график,
   либо переключать таймфреймы((
   вот например на М1 или М5 эти манипуляции приходится делать
   чуть ли не каждые две-три минуты*/

   if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
   for(SH=1;SH<NB;SH++)//Прочёсываем график от 1 до NB
     {
      for(R=0,i=SH;i<SH+10;i++)//прочесываем на 10 баров вперед 
      {R+=(10+SH-i)*(High[i]-Low[i]);}//средний размах свечи за 10 баров
            R/=55;//сложили размах за 10 баров и делим на 55
//----
      SHMax=High[Highest(NULL,0,MODE_HIGH,Per,SH)];//хай и лоу за 10 баров
      SHMin=Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
      if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL)//если текущее закрытие меньше минимума... т.е. проход цены от лоя
        {
         // Pop an Alert
         if (SH==1 && flagval1==0)
           {
            flagval1=1;//ставим только стрелку под лоем
            flagval2=0;
            if (SoundON) Alert("BUY signal at Ask=",Ask,"\n Bid=",Bid,"\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
           }
         BufU[SH]=Low[SH]-R*0.5;//ставим стрелку под лоем
          UD=SH_SELL;
        }
      if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY)
        {
         // pop an Alert
         if (SH==1 && flagval2==0)
           {
            flagval2=1;//ставим только стрелку над хаем
            flagval1=0;
            if (SoundON) Alert("SELL signal at Ask=",Ask,"\n Bid=",Bid,"\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
           }
         BufD[SH]=High[SH]+R*0.5; UD=SH_BUY;//ставим стрелку над хаем
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+

Редактирован: 11 мая 2015, 15:34
avatar

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

  • 11 мая 2015, 15:33
+
0
))вы мне льстите, я вообще не понимаю, как работает этот индикатор, как впрочем и другие)
зы — а может к нему тупо приделать скрипт или еще что, что бы напр раз в полминуты он просто перезапускался(??)
Редактирован: 11 мая 2015, 16:33
avatar

  2  russwill Автор Сообщений: 63

  • 11 мая 2015, 16:09
+
0
Максимально упростил логику индикатора. Смотрите что не так, показывайте на скринах, я буду править.




//+------------------------------------------------------------------+
//|                                                        Begin.mq4 |
//|                                                 Copyright © 2007 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Heaven"
#property link      "http://Beginner.com"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red
#define  SH_BUY   1
#define  SH_SELL  -1
//---- Входные параметры
extern bool SoundON=true;
extern int     AllBars=0;//Для скольки баров считать. 0 - для всех.
extern int     Otstup=30;//Отступ.
extern double  Per=9;//Период.
//----
int            SH,NB,i,UD;
double         R,SHMax,SHMin;
double         BufD[];
double         BufU[];
int flagval1=0;
int flagval2=0;
//+------------------------------------------------------------------+
//| Функция инициализации                                            |
//+------------------------------------------------------------------+
int init()
  {
   //В NB записываем количество баров для которых считаем индикатор
   if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
   IndicatorBuffers(2);
   IndicatorShortName("SHI_SilverTrendSig");
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(0,159);
   SetIndexArrow(1,159);
   SetIndexBuffer(0,BufU);
   SetIndexBuffer(1,BufD);
   SetIndexDrawBegin(0,Bars-NB);//Индикатор будет отображаться только для NB баров
   SetIndexDrawBegin(1,Bars-NB);
   ArrayInitialize(BufD,0.0);//Забьём оба буфера ноликами. Иначе будет мусор при смене таймфрейма.
   ArrayInitialize(BufU,0.0);
   return(0);
  }
//+------------------------------------------------------------------+
//| Функция деинициализации                                          |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Собсна индикатор                                                 |
//+------------------------------------------------------------------+
int start()
  {
   int CB=IndicatorCounted();//
   i=Bars-CB-1;//
 
   /* Тут вот та самая оптимизационная фишка. В язык введена функция, которая возвращает количество
   посчитанных баров, причём очень хитро. При первом вызове индикатора это 0, всё понятно, ещё ничего
   не считалось, а затем выдаёт количество обсчитанных баров минус один. Т.е. если всего баров 100,
   то функция вернёт 99. Я ввёл такой код, выше у меня определялась NB - кол-во баров подлежащих
   обсчёту. В принципе этот параметр можно и выкинуть, однако для тех кто в танке (I80286) можно
   и оставить. Так вот, здесь, при первом вызове NB остаётся прежней, а при последующих уменьшается
   до последнего бара, т.е. 1 или 2, ну или сколько там осталось посчитать*/
   
   
   /*прошу посмотреть индикатор и попробовать его исправить.
   индикатор достаточно точный, но проблемма в том, что он не
   обновляет данные и что бы он работал(находил точки разворота),
   его нужно постоянно вручную обновлять следующим способом: 
   либо заходить в свойства имитируя установку на график,
   либо переключать таймфреймы((
   вот например на М1 или М5 эти манипуляции приходится делать
   чуть ли не каждые две-три минуты*/

   for(i=1;i<=CB;i++)//Прочёсываем график от 1 до NB
     {
      int k=0;
      SHMax=High[Highest(NULL,0,MODE_HIGH,Per,i)];//хай и лоу за 10 баров
      SHMin=Low[Lowest(NULL,0,MODE_LOW,Per,i)];
      if (Close[i]<SHMin+Otstup*Point && UD!=SH_SELL)//если текущее закрытие меньше минимума... т.е. проход цены от лоя
        {
         // Pop an Alert
         if (k==1 && flagval1==0)
           {
            flagval1=1;//ставим только стрелку под лоем
            flagval2=0;
            if (SoundON) Alert("BUY signal at Ask=",Ask,"\n Bid=",Bid,"\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
           }
         BufU[i]=Low[i]-Otstup*Point;//ставим стрелку под лоем
          UD=SH_SELL;
        }
      if (Close[i]>SHMax-Otstup*Point && UD!=SH_BUY)
        {
         // pop an Alert
         if (k==1 && flagval2==0)
           {
            flagval2=1;//ставим только стрелку над хаем
            flagval1=0;
            if (SoundON) Alert("SELL signal at Ask=",Ask,"\n Bid=",Bid,"\n Date=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
           }
         BufD[i]=High[i]+Otstup*Point; UD=SH_BUY;//ставим стрелку над хаем
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+
avatar

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

  • 12 мая 2015, 13:43
+
0
Индикатор перерисовывается *evil* 
avatar

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

  • 11 мая 2015, 17:08
+
0
это вопрос или утверждение?… не знаю что ты имеешь ввиду, но так как я его, на котротких таймфреймах обновляю вручную, то сложно сказать, как бы он вел себя на автомате, хотя при таком ручном способе он естественно иногда перерисовывает последнюю точку ибо получается, что анализ происходит, на новом промежутке графика
Редактирован: 11 мая 2015, 21:52
avatar

  2  russwill Автор Сообщений: 63

  • 11 мая 2015, 21:51
+
0
Индикатор подстраивается под историю.
avatar

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

  • 12 мая 2015, 05:39
+
0
ну не знаю… скажу одно, если этот индюк поставил точку над\под еще незакрытой свечей, то 99%, что на след.свече или чуть позже, хоть какой то, но будет откат.
зы-кстати я не пойму в чем фишка неперерисовывающихся индикаторов? типа цена идет в одну сторону, а индюк)) упорно показывает вдругую… что то это мне напоминает).
Редактирован: 12 мая 2015, 06:33
avatar

  2  russwill Автор Сообщений: 63

  • 12 мая 2015, 06:31
+
0
Фишка в том что точка не меняется, если цена дальше идет, тогда появляется обратный сигнал. У меня сейчас тестируется один неперерисовывающийся индикатор, есть хорошие результаты торговли, вот только этот индюк немного запаздывает и иногда исчезают точки.

Твой индюк хорошо показывает точки разворота на больших ТФ от D1 и выше, надо тестировать и тогда уже можно что то говорить.
avatar

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

  • 12 мая 2015, 10:25
+
0
Сейчас еще раз протестировал твой индюк, короче индюк жестоко перерисовывается, это видно если обновлять на каждой свече. Давненько я не видал такое :) 

Мой тебе совет, ищи неперерисовывающиеся индикаторы *good* 
avatar

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

  • 12 мая 2015, 14:23
+
0
Прошу помощи свободным от дел из программистам сделает размещение(их смещение) надписей по горизонтали на индикаторе уровней, а то наложились шесть подряд значений например нынешний день, прошлый, неделя, прошлая и месяц и так далее. Раскидывать мышкой это не удобно, да и когда делаешь скрин не успеваешь сфоткать как они сбегаются назад. Код такой даю одно значение дня дальше сам смогу, если это в нем возможно сделать:
if (Show_LABELS==true)
{
if(ObjectFind(«HILO»)!=0)
{
ObjectCreate(«HILO», OBJ_TEXT, 0, Time[Shift_CurrDaily_LABEL], DHigh);
ObjectSetText(«HILO», «Daily High „+DoubleToStr(DHigh,Digits)+“», 8, «Arial», line_color_CurrDailyUPPER);
}
else
{ ObjectMove(«HILO», 0, Time[Shift_CurrDaily_LABEL], DHigh);}
if(ObjectFind(«HILO1»)!=0)
{
ObjectCreate(«HILO1», OBJ_TEXT, 0, Time[Shift_CurrDaily_LABEL], DLow);
ObjectSetText(«HILO1», «Daily Low „+DoubleToStr(DLow,Digits)+“ », 8, «Arial», line_color_CurrDailyLOWER);
}
else
{
ObjectMove(«HILO1», 0, Time[Shift_CurrDaily_LABEL], DLow);
}
avatar

  0  koctik Сообщений: 1

  • 3 сентября 2018, 20:46

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