построение линии H_line на самом высоком максимуме из последних 36 максимумов - страница 2

 

меня не волнует закрытие стоха, поэтому достаточно просто текущего K%.

код для проверки объектов:

 int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
      if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
      }
   if (StringSubstr(id,0,6)=="olive ")
      {
      if (StringSubstr(id,6,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      }  
}

удаляет линию id после 96 свечей, как мне нужно.

Теперь мне нужно сделать так, чтобы ea не рисовала новые томатные линии, если одна томатная линия уже есть на графике.

Я думаю добавить

if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ..............
         }

......... = стоп и с самого начала (но при этом считывать условия оли).

код сейчас:

int start()
  {
/////////// K% over >75 or under <25 (no waiting for close)
double stoch;
stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);  
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];
datetime H=Time[high_nr];
string Hdate = TimeToStr(H,TIME_DATE|TIME_MINUTES);
datetime L=Time[low_nr];
string Ldate = TimeToStr(L,TIME_DATE|TIME_MINUTES);


/////////////////////////////////////////////////////////////////////////////////
//---
 int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
      if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
      }
   if (StringSubstr(id,0,6)=="olive ")
      {
      if (StringSubstr(id,6,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      }  
}
//---


////////////////////////////////////////////////////////////////////////////////

if(Bid<high_price && High[0]<high_price && High[1]<high_price && stoch>75)
     {
      ObjectCreate("tomato "+Hdate,OBJ_TREND,0,H,high_price,Time[0],high_price);
      ObjectSet("tomato "+Hdate,OBJPROP_COLOR,Tomato);
      //Print ("tomato ON"+high_price);
     }
       

///////////////////////////////////////////////////////////////////////////////

if(Bid>low_price && Low[0]>low_price && Low[1]>low_price && stoch<25)
   {
   ObjectCreate("olive "+Ldate,OBJ_TREND,0,L,low_price,Time[0],low_price);
   ObjectSet("olive "+Ldate,OBJPROP_COLOR,Olive);
   //Print ("olive ON"+low_price);
   }
 
   
   
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

перефразируем:

я хочу, чтобы на графике была максимум одна томатная линия.

если эта линия будет использоваться для OrderSend, удалить линию.

Если она истекает (96), удаляю линию.

То же самое для оливковой.

Таким образом, если линия помидора уже есть на графике, больше линий помидора не будет, пока на графике не останется ни одного помидора.

надеюсь, перефразирование поможет найти решение :)

 
cichichan:

перефразируем:

я хочу, чтобы на графике была максимум одна томатная линия.

если эта линия будет использоваться для OrderSend, удалить линию.

Если она истекает (96), удаляю линию.

То же самое для оливковой.

Таким образом, если линия помидора уже есть на графике, больше линий помидора не будет, пока на графике не останется ни одного помидора.

надеюсь, перефразирование поможет найти решение :)


datetime L=Time[low_nr];
string Ldate = TimeToStr(L,TIME_DATE|TIME_MINUTES);

это время, когда вы создаете свою линию ??? как это сделать ???

 int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
       //  line found
      }
}

И как можно избежать рисования других линий....?????

 

Я думал изменить имя объекта на исходное, чтобы скрипт не рисовал линии из-за ограничения на одно и то же имя... но у меня нет функции для изменения имени.

hmm.... я не понимаю.

Мой разум застрял! Я чувствую себя глупым и расстроенным.

 
cichichan:

Я думал изменить имя объекта на исходное, чтобы скрипт не рисовал линии из-за ограничения на одно и то же имя... но у меня нет функции для изменения имени.

hmm.... я не понимаю.

Мой разум застрял! Я чувствую себя глупым и расстроенным.

Когда вы создаете новую линию?

Не в момент, когда вы находите самый высокий или самый низкий бар.

и вы должны создавать только если нет линии.

Так что если вы создаете новую линию, используйте время Time[0].

если вы нашли свой объект, то какое имя он имеет ?? ==> string id=ObjectName (i);

Итак, что вам нужно сделать? Получить это имя, когда у него есть StringSubstr(id,0,7)=="tomato "

 

Вернитесь к вашему первому сообщению:

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

Вы не получаете новую линию, потому что старая уже существует. Удалите ее и будет нарисована новая.

 

на данный момент я сделал вот так:

и похоже, что работает как надо, всего одна строка, и после 96 баров удаление, перерисовка при повторном появлении условия.

int start()
  {
/////////// K% over >75 or under <25 (no waiting for close)
double stoch;
stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);

double high_price,low_price;
int high_nr,low_nr;
high_nr=iHighest(NULL,0,MODE_HIGH,34,2);  
high_price=High[high_nr];
low_nr=iLowest(NULL,0,MODE_LOW,34,2);
low_price=Low[low_nr];
datetime H=Time[high_nr];
string Hdate = TimeToStr(H,TIME_DATE|TIME_MINUTES);
datetime L=Time[low_nr];
string Ldate = TimeToStr(L,TIME_DATE|TIME_MINUTES);


/////////////////////////////////////////////////////////////////////////////////
//---
int i, ot=ObjectsTotal()-1;
string id=ObjectName (i);

for (i=ot;i>=0;i--)
{
   if (StringSubstr(id,0,7)=="tomato ")
      {
      if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,7,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         Print ("tomato valid");
         break;
         }
      }
}

 if (ot==-1)
      {
      if(Bid<high_price && High[0]<high_price && High[1]<high_price && stoch>75)
         {
         ObjectCreate("tomato "+Hdate,OBJ_TREND,0,H,high_price,Time[0],high_price);
         ObjectSet("tomato "+Hdate,OBJPROP_COLOR,Tomato);
         //Print ("tomato ON"+high_price);
         }
      }  
//---


////////////////////////////////////////////////////////////////////////////////
for (i=ot;i>=0;i--)
{
 if (StringSubstr(id,0,6)=="olive ")
      {
      if (StringSubstr(id,6,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         ObjectDelete(id);
         }
      if (StringSubstr(id,6,16)>TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))
         {
         Print ("olive valid");
         break;
         }   
      }  
 }      

///////////////////////////////////////////////////////////////////////////////
if (ot==-1)
{
if(Bid>low_price && Low[0]>low_price && Low[1]>low_price && stoch<25)
   {
   ObjectCreate("olive "+Ldate,OBJ_TREND,0,L,low_price,Time[0],low_price);
   ObjectSet("olive "+Ldate,OBJPROP_COLOR,Olive);
   //Print ("olive ON"+low_price);
   }
}
   
   
//----
   
//----
   return(0);
  }
 

работает ли это?

if (StringSubstr(id,7,16)<TimeToStr(Time[96],TIME_DATE|TIME_MINUTES))

Могут ли строки быть < или > друг к другу, это вопрос, я не знаю.

Вы все усложняете, потому что Джиол сказал вам, что если вы хотите иметь несколько линий, вы должны дать линиям разные имена. И он был прав в то время.

Если бы он знал, что вам нужна только одна строка, он бы так не сказал. Решение, которое дал Devries, очень хорошо в случае, если у вас несколько строк, спасибо Devries.

Но если вам нужна только одна линия, назовите ее "помидор" или "оливка", тогда ObjectFind("tomato") ObjectDelete("tomato"), решит проблемы разделения времени с Time[96] и Time[0], сохраненными при построении линии.

Следующая проблема, которая может возникнуть, это то, что условие stoch> 75 может длиться 20 или 50 баров, тогда, когда вы удалите свою линию, условие для построения линии все еще будет действовать, и как только линия будет удалена, или будет взят ордер, будет построена новая линия. удачи, это не так сложно.

 

привет

поскольку объектная вещь показалась мне слишком сложной для моих двух недель чтения кода, я решил установить Level price для продажи и покупки. в этом процессе я столкнулся с проблемой:

void LevelSset()
{

stoch=iStochastic(NULL,0,Kperiod,Dperiod,Stochshift,MODE_SMA,1,MODE_MAIN,0);


high_bar=iHighest(NULL,0,MODE_HIGH,34,2);
string H=TimeToStr(Time[high_bar],TIME_DATE|TIME_MINUTES);
LSell=High[iHighest(NULL,0,MODE_HIGH,34,2)];


if(Bid<LSell && High[0]<LSell && High[1]<LSell && stoch>75 && LevelSset==false)
         {
         ObjectCreate("tomato "+H,OBJ_ARROW,0,Time[high_bar],LSell+Point*20);
         ObjectSet("tomato "+H,OBJPROP_ARROWCODE,242);
         ObjectSet("tomato "+H,OBJPROP_COLOR,Tomato);
         LevelSset=true;
         Print("LevelSset on "+LSell);
         }
if (Close[2]>LSell && Close[1]>LSell && LevelSset==true)
   {
      LSell=0;
      LevelSset=false;
      Print ("LSell"+LSell+"expired due to close");
   }
}

"if (Close[2]>LSell && Close[1]>LSell && LevelSset==true) не работает.

Если убрать if (Close[2]>LSell && Close[1]>LSell) и оставить (LevelSset==true), или изменить (Close[2]<LSell && Close[1]<1), то функция работает правильно.

спасибо

 

какие-нибудь идеи, что не так... кто-нибудь?

спасибо