Помогите пожалуйста создать индикатор - страница 3

 
PapaYozh писал (а) >>

ПапаЙож, я вам очень сильно признателен за помощь! =)

А не могли бы вы объяснить словами смысл этой строчки что вы добавили. Для чайников. А то я не пойму в чем разница с моим кодом. Спасибо.

if ( (i1>0) && (i2>0) )
 
Haribin писал (а) >>

ПапаЙож, я вам очень сильно признателен за помощь! =)

А не могли бы вы объяснить словами смысл этой строчки что вы добавили. Для чайников. А то я не пойму в чем разница с моим кодом. Спасибо.

Это условие существования обоих запрошенных баров. Дело в том, что как только меняются сутки, функция iBarShift (с использованными параметрами вызова) начинает возвращать -1, т.к. бар для запрошенного Вами времени еще не существует.

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

А вообще, этот код я б переписал таким образом:

datetime mt1,mt2;

int i1,i2;

double H1,H2;

mt1=StrToTime("15:10");
mt2=StrToTime("15:15");

i1=iBarShift(NULL,0,mt1,TRUE);
i2=iBarShift(NULL,0,mt2,TRUE);
  
if ( (i1>0) && (i2>0) )
{
  H1=High[i1];
  H2=High[i2];
  
  ObjectDelete("line1");
  
  if (H1>=H2)
    ObjectCreate("line1",OBJ_HLINE,0,mt1,H1); 
  else
    ObjectCreate("line1",OBJ_HLINE,0,mt2,H2); 
  
  ObjectSet("line1",OBJPROP_STYLE,0);
  ObjectSet("line1",OBJPROP_COLOR,Magenta);
  ObjectSet("line1",OBJPROP_WIDTH,0);

}
смысл тот же, а строк меньше.
 
PapaYozh писал (а) >>

Это условие существования обоих запрошенных баров. Дело в том, что как только меняются сутки, функция iBarShift (с использованными параметрами вызова) начиннет возвращать -1, т.к. бар для запрошенного Вами времени еще не существует.

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

А вообще, этот код я б переписал таким образом:

смысл тот же, а строк меньше.

Очередное спасибо, я как раз думал как можно оптимизировать немного код чтобы меньше было строк. Я понял про iBarShift - спасибо большое. Я немного переделал ваш вариант, просто в моем индикаторе таких линии (хаев) много, и мне нужно чтобы некоторые оставались до следующего формирования бара, а некоторые исчезали на следующий день, поэтому я сделал вот так

if (i5>0)
{
H5=High[i5];
ObjectDelete("line3");
}
if (i6>0)
H6=High[i6];
ObjectDelete("line3"); // скажите тут надо дублировать команду или хватит той что выше? Это для того чтобы удалить вчерашнюю линию


if (H5>=H6)
ObjectCreate("line3",OBJ_HLINE,0,mt5,H5);
else
ObjectCreate("line3",OBJ_HLINE,0,mt6,H6);

ObjectSet("line3",OBJPROP_STYLE,0);
ObjectSet("line3",OBJPROP_COLOR,Green);
ObjectSet("line3",OBJPROP_WIDTH,3)

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

 

Подскажите пожалуйста какая разница в данном случае будет


if ( (i1>0) && (i2>0) )
if ( (i1!=-1) && (i2!=-1) )

в контексте программы


datetime mt1,mt2;

int i1,i2;

double H1,H2;

mt1=StrToTime("15:10");
mt2=StrToTime("15:15");

i1=iBarShift(NULL,0,mt1,TRUE);
i2=iBarShift(NULL,0,mt2,TRUE);
  
if ( (i1>0) && (i2>0) )    <-----------------------------
и тд....

если мы заменим одно на другое, разница вообще будет или нет

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