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

 
Здравствуйте Tretyakov Rostyslav #:


Помогите, пожалуйста, при наличии у вас времени подправить код индикатора.  Индикатор отрисовывает заданное количество  линий хай-лоу дней, недель и месяцев, не пересеченных ценой на момент закрытия дневной свечи. На текущей дневной свече линии хай-лоу пересеченные ценой остаются на месте. И только на первом тике дневной свечи происходит перерисовка линий и остаются только линии не «тронутой» ценой.  Если в советнике данный код у меня работает, то в индикаторе на первом тике дневной свечи перерисовки не происходит.  

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

//+------------------------------------------------------------------+
//|                                                     HL_LEVEL.mq4 |
//+------------------------------------------------------------------+
#property copyright "kochegarov.vm"
#property link      "kochegarov.vm@mail.ru"
#property indicator_chart_window

extern string General   = "//////////////////////////////////////////";
extern int    TimeFrame     = 0;
extern bool   Ray           = true; 

extern string D1_Settings   = "//////////////////////////////////////////";
extern int    Lines_D1      = 22;
extern color  ColorHigh_D1  = clrRed;
extern color  ColorLow_D1   = clrBlue;
extern int    LineStyle_D1  = 0;
extern int    LineWidth_D1  = 1;

extern string W1_Settings   = "//////////////////////////////////////////";
extern int    Lines_W1      = 52; 
extern color  ColorHigh_W1  = clrMagenta;
extern color  ColorLow_W1   = clrDeepSkyBlue;
extern int    LineStyle_W1  = 0;
extern int    LineWidth_W1  = 2;

extern string MN_Settings   = "//////////////////////////////////////////";
extern int    Lines_MN      = 12; 
extern color  ColorHigh_MN  = clrRed;
extern color  ColorLow_MN   = clrBlue;
extern int    LineStyle_MN  = 0;
extern int    LineWidth_MN  = 3;
//+----------------------------------------------------------------------------+
int       jMax = 0;

double    D1_h[], D1_l[], W1_h[], W1_l[], MN_h[], MN_l[];
datetime  D1ts[], D1te[], W1ts[], W1te[], MNts[], MNte[];

datetime LastTime=0;
bool     New_Bar=false;
//+----------------------------------------------------------------------------+
int init()  
{
   
   ArrayResize(D1_h,Lines_D1+1); ArrayResize(D1_l,Lines_D1+1); ArrayResize(D1ts,Lines_D1+1); ArrayResize(D1te,Lines_D1+1);
   ArrayResize(W1_h,Lines_W1+1); ArrayResize(W1_l,Lines_W1+1); ArrayResize(W1ts,Lines_W1+1); ArrayResize(W1te,Lines_W1+1);
   ArrayResize(MN_h,Lines_MN+1); ArrayResize(MN_l,Lines_MN+1); ArrayResize(MNts,Lines_MN+1); ArrayResize(MNte,Lines_MN+1);
   
   jD1(Lines_D1+1);
   jW1(Lines_W1+1);
   jMN(Lines_MN+1);
/*      
   int x=0;
   ObjectDelete("D1_High_"+x);
   ObjectDelete("D1_Low_"+x); 
   ObjectDelete("W1_High_"+x);  
   ObjectDelete("W1_Low_"+x);  
   ObjectDelete("MN_High_"+x); 
   ObjectDelete("MN_Low_"+x); 
*/  
return(0);
}
//+----------------------------------------------------------------------------+
int deinit()
{
   rLines(jMax+1);

return(0);
}
//+----------------------------------------------------------------------------+
int start()
{
//-----------------
   New_Bar=false; 
   if(LastTime<iTime(Symbol(),PERIOD_D1,0)) 
   {
     LastTime=iTime(Symbol(),PERIOD_D1,0);
     New_Bar=true;  
   }
//-----------------
   if(DayOfWeek()==0 || DayOfWeek()==6) return(0);
   if(New_Bar==true)
   {
     int counted_bars = IndicatorCounted(); 
     int limit; 
   //---- последний посчитанный бар будет пересчитан 
     if(counted_bars>0) counted_bars--; 
     limit=iBars(Symbol(),PERIOD_D1)-counted_bars; 
   //---- основной цикл 
     for(int x=1; x<limit; x++)       
     {
         rLines(x);
         D1_h[x]=iHigh(Symbol(),1440,x);   D1_l[x]=iLow(Symbol(),1440,x);
         W1_h[x]=iHigh(Symbol(),10080,x);  W1_l[x]=iLow(Symbol(),10080,x);
         MN_h[x]=iHigh(Symbol(),43200,x);  MN_l[x]=iLow(Symbol(),43200,x);
   
         D1ts[x]=iTime(Symbol(),1440,x);  D1te[x]=Time[0];
         W1ts[x]=iTime(Symbol(),10080,x); W1te[x]=Time[0];
         MNts[x]=iTime(Symbol(),43200,x); MNte[x]=Time[0];      
     }
     jD1(Lines_D1+1);
     jW1(Lines_W1+1);
     jMN(Lines_MN+1);
   }
   
return(0);
}
//+----------------------------------------------------------------------------+
void jD1(int Count) 
{
   for (int x=1; x<Count; x++)
   {  
      int nb1=iBarShift(NULL,0, D1ts[x],false); 
      int nb2=iBarShift(NULL,0, D1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_D1>0) LineWidth_D1=1;
      SetTLine(ColorHigh_D1,"D1_High_"+x,iTime(NULL,PERIOD_D1,x),D1_h[x],Time[0],D1_h[x],Ray,LineStyle_D1,LineWidth_D1);
      if(up>D1_h[x]) {ObjectDelete("D1_High_"+x);}
      
      SetTLine(ColorLow_D1,"D1_Low_"+x,iTime(NULL,PERIOD_D1,x),D1_l[x],Time[0],D1_l[x],Ray,LineStyle_D1,LineWidth_D1);
      if(dn<D1_l[x]) {ObjectDelete("D1_Low_"+x);}
   }
}
//+----------------------------------------------------------------------------+
void jW1(int Count) 
{
   for (int x=1; x<Count; x++)
   {  
      int nb1=iBarShift(NULL,0, W1ts[x],false);
      int nb2=iBarShift(NULL,0, W1te[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_W1>0) LineWidth_W1=1;
      SetTLine(ColorHigh_W1,"W1_High_"+x,iTime(NULL,PERIOD_W1,x),W1_h[x],Time[0],W1_h[x],Ray,LineStyle_W1,LineWidth_W1);
      if(up>W1_h[x]) {ObjectDelete("W1_High_"+x);}
      
      SetTLine(ColorLow_W1,"W1_Low_"+x,iTime(NULL,PERIOD_W1,x),W1_l[x],Time[0],W1_l[x],Ray,LineStyle_W1,LineWidth_W1);
      if (dn<W1_l[x]) {ObjectDelete("W1_Low_"+x);}
   }
}
//+----------------------------------------------------------------------------+
void jMN(int Count)
{
   for (int x=1; x<Count; x++)
   { 
      int nb1=iBarShift(NULL,0, MNts[x],false);
      int nb2=iBarShift(NULL,0, MNte[x],false);
      double up=High[iHighest(NULL,0, MODE_HIGH, nb1-nb2, nb2)];
      double dn=Low [iLowest(NULL,0, MODE_LOW, nb1-nb2, nb2)];
      
      if(LineStyle_MN>0) LineWidth_MN=1;
      SetTLine(ColorHigh_MN,"MN_High_"+x,iTime(NULL,PERIOD_MN1,x),MN_h[x],Time[0],MN_h[x],Ray,LineStyle_MN,LineWidth_MN);
      if(up>MN_h[x]) {ObjectDelete("MN_High_"+x);}
      
      SetTLine(ColorLow_MN,"MN_Low_"+x,iTime(NULL,PERIOD_MN1,x),MN_l[x],Time[0],MN_l[x],Ray,LineStyle_MN,LineWidth_MN);
      if (dn<MN_l[x]) {ObjectDelete("MN_Low_"+x);}
   }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - не луч)                        |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}   
//+------------------------------------------------------------------+
void rLines(int Count)     
{
   for (int x=1; x<Count; x++)
   {
      ObjectDelete("D1_High_"+x);  
      ObjectDelete("D1_Low_"+x);   
      ObjectDelete("W1_High_"+x);  
      ObjectDelete("W1_Low_"+x);  
      ObjectDelete("MN_High_"+x);  
      ObjectDelete("MN_Low_"+x);   
   }
}
//+------------------------------------------------------------------+
 
Vyacheslav.K #:

Помогите, пожалуйста, при наличии у вас времени подправить код индикатора.  Индикатор отрисовывает заданное количество  линий хай-лоу дней, недель и месяцев, не пересеченных ценой на момент закрытия дневной свечи. На текущей дневной свече линии хай-лоу пересеченные ценой остаются на месте. И только на первом тике дневной свечи происходит перерисовка линий и остаются только линии не «тронутой» ценой.  Если в советнике данный код у меня работает, то в индикаторе на первом тике дневной свечи перерисовки не происходит.  

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

Я не совсем понимаю что Вы хотите, точнее что Вы хотите чтобы показывал индикатор.


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

 
Tretyakov Rostyslav #:

Я не совсем понимаю что Вы хотите, точнее что Вы хотите чтобы показывал индикатор.


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

А для такого кода по любому получить ответ мало вероятно. int init(), int deinit и int start() да плюс кимовские устаревшие функции отпугивают большинство нормальных программистов. Лично мне даже читать противно…

Вот этими функциями тоже ещё можно пользоваться…
 
Tretyakov Rostyslav #:

Я не совсем понимаю что Вы хотите, точнее что Вы хотите чтобы показывал индикатор.


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


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

 
Vyacheslav.K #:

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

  

 
Alexey Viktorov #:

А для такого кода по любому получить ответ мало вероятно. int init(), int deinit и int start() да плюс кимовские устаревшие функции отпугивают большинство нормальных программистов. Лично мне даже читать противно…

Вот этими функциями тоже ещё можно пользоваться…

Я самоучка и с Вашей критикой кода я полностью  согласен.  А данный индикатор мне был необходим и я его просто составил из разных частей кодов и функций. В тестере мне проще работать с кодом советника, чем индикатора. Если у Вас есть примеры подобных индикаторов с использованием функций, ссылку на которые Вы указали то, буду вам признателен. Мне проще учиться на конкретных примерах. 

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

 
Tretyakov Rostyslav #:

  

Понял, спасибо!
 

Всем добрый день!
Вопрос по тестеру МТ4. Советник печатает в файл содержимое массива при помощи этого кода

if (Year()==2011&&X4==0)
{
X4=1;
string eName="My_7"+(string)D3+".csv";
int eHandle=FileOpen(eName,FILE_CSV|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ,";");
for(int i5=0; i5<=19999; i5++)
{
if (bLn[i5][1]>0)
{
FileWrite(eHandle,bLn[i5][0],bLn[i5][1]);
}
}
}

ВОПРОС Как вызвать папку с файлом в который шла печать? Или как  сразу открыть файл в который Советник напечатал значения массива? Если вариантов много, то мне удобнее получить желаемое не при помощи кода, а при помощи сочетания клавиш , или при помощи соответствующих пунктов меню.
Всем спасибо за ценную информацию.

 
ANDREY #:

Всем добрый день!
Вопрос по тестеру МТ4. Советник печатает в файл содержимое массива при помощи этого кода

ВОПРОС Как вызвать папку с файлом в который шла печать? Или как  сразу открыть файл в который Советник напечатал значения массива? Если вариантов много, то мне удобнее получить желаемое не при помощи кода, а при помощи сочетания клавиш , или при помощи соответствующих пунктов меню.
Всем спасибо за ценную информацию.

Я не уверен, но думаю запустить внешнюю программу из МТ можно только при помощи DLL
 
ANDREY #:

Или как  сразу открыть файл в который Советник напечатал значения массива?

#import "shell32.dll"
   int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
#import

ShellExecuteW(WindowHandle(Symbol(),0),NULL,TerminalInfoString(TERMINAL_COMMONDATA_PATH)+"\\Files\\"+file_name,NULL,NULL,1);

Файл откроется той программой, с которой его тип ассоциирован в Windows.

Здесь путь в общую папку, проверьте у себя, где лежит файл.

Разрешите выполнение dll.

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