Zeichnung der H_Linie auf dem höchsten Hoch der letzten 36 Hochs - Seite 2

 

Ich kümmere mich nicht um Stoch Close, so dass nur aktuelle K% ist genug.

Code für Prüfobjekte:

 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);
         }
      }  
}

dies löscht die id Linie nach 96 Kerzen. wie ich brauche

was ich jetzt tun muss, ist zu stoppen ea aus Zeichnung neue Tomate Linien, wenn eine Tomate Linie ist bereits auf Chart.

Ich denke, ich füge hinzu

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

......... = stop und von Anfang an (aber immer noch die olivenbedingungen lesen)

Code jetzt:

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);
  }
//+------------------------------------------------------------------+
 

um es anders zu formulieren:

Ich möchte im Diagramm maximal eine Tomatenlinie haben.

Wenn diese Linie für OrderSend verwendet wird, löschen Sie die Linie.

wenn sie abläuft (96), löschen Sie die Zeile.

Dasselbe gilt für die Olive.

Wenn also bereits eine Tomatenlinie im Diagramm vorhanden ist, wird keine weitere Tomatenlinie hinzugefügt, bis keine Tomate mehr im Diagramm vorhanden ist.

ich hoffe, die Umformulierung hilft bei der Lösung :)

 
cichichan:

Um es anders zu formulieren:

Ich möchte im Diagramm maximal eine Tomatenlinie haben.

Wenn diese Linie für OrderSend verwendet wird, löschen Sie die Linie.

wenn sie abläuft (96), löschen Sie die Zeile.

Dasselbe gilt für die Olive.

Wenn also bereits eine Tomatenlinie im Diagramm vorhanden ist, wird keine weitere Tomatenlinie hinzugefügt, bis keine Tomate mehr im Diagramm vorhanden ist.

ich hoffe, dass eine Umformulierung zur Lösung beiträgt :)


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

ist das die Zeit, in der Sie Ihre Linie erstellen? wie macht man das?

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

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

Wie kann man also vermeiden, dass andere Linien gezeichnet werden....?

 

Ich dachte daran, den Namen des Objekts wieder zu ändern, um zu verhindern, dass das Skript aufgrund der Beschränkung auf denselben Namen Linien zeichnet... aber ich habe keine Funktion zum Ändern des Namens.

hmm.... ich verstehe es nicht.

Ich komme mir dumm und frustriert vor.

 
cichichan:

Ich dachte daran, den Namen des Objekts wieder zu ändern, um zu verhindern, dass das Skript aufgrund der Beschränkung auf denselben Namen Linien zeichnet... aber ich habe keine Funktion zum Ändern des Namens.

hmm.... ich verstehe es nicht.

Ich fühle mich dumm und frustriert.

Wann erstellt man eine neue Linie?

nicht zu dem Zeitpunkt, an dem der höchste oder niedrigste Balken gefunden wird

und man muss nur dann eine neue Linie erstellen, wenn es keine Linie gibt

Wenn Sie also eine neue Zeile erstellen, verwenden Sie die Zeit von Time[0]

Wenn Sie Ihr Objekt finden, welchen Namen hat es dann? ==> string id=ObjectName (i);

Was müssen Sie also tun?? diesen Namen erhalten, wenn er StringSubstr(id,0,7)=="tomato" hat

 

Kommen Sie zurück zu Ihrem ersten Beitrag:

"Wenn ich dies ausführe, erhalte ich das erste Setup für Tomate und für Olive ok, dann, selbst wenn ich im Journal "Tomate ON" einen anderen Preis lvl erhalte, erhalte ich keine neue Tomatenlinie im Chart.

Sie erhalten keine neue Linie, weil die alte Linie bereits existiert. Löschen Sie sie und es wird eine neue gezeichnet.

 

für den Moment habe ich es so gemacht:

und es sieht aus, dass funktioniert wie es sollte, nur eine Zeile, und nach 96 Bars löschen, die neu zu zeichnen, wenn Bedingung wieder auftauchen.

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);
  }
 

Funktioniert das?

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

Könnten Strings < oder > zueinander sein, das ist eine Frage, die ich nicht weiß.

Du machst es kompliziert, denn giol hat dir gesagt, wenn du mehrere Zeilen haben willst, musst du den Zeilen verschiedene Namen geben. Und er hatte damals Recht.

Wenn er wüsste, dass du nur eine Linie willst, hätte er das nicht gesagt. Die Lösung, die devries gegeben hat, ist sehr gut, falls man mehrere Zeilen hat, danke devries

Aber wenn du nur eine Zeile willst, die du "Tomate" oder "Olive" nennst, dann löst ObjectFind("Tomate") ObjectDelete ("Tomate") das Problem der Zeitunterschiede mit Time[96] und Time[0], die gespeichert werden, wenn die Zeile gezeichnet wird.

Das nächste Problem, das auftreten wird, ist, dass die Bedingung stoch> 75 20 Bars oder 50 Bars dauern könnte, dann, wenn Sie Ihre Linie löschen werden, wird die Bedingung, um die Linie zu zeichnen, immer noch gültig sein, und sobald die Linie gelöscht wird, oder eine Bestellung genommen wird, wird eine neue Linie gezeichnet werden. viel Glück, es ist nicht so schwierig.

 

Hallo

da mir die Sache mit den Objekten für meine zwei Wochen Code lesen zu kompliziert erschien, habe ich mich entschlossen, Levelpreise für Verkauf und Kauf zu setzen. dabei stoße ich auf ein Problem:

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");
   }
}

das "if (Close[2]>LSell && Close[1]>LSell && LevelSset==true) funktioniert nicht.

Wenn ich das if (Close[2]>LSell && Close[1]>LSell) entferne und (LevelSset==true) lasse, oder wenn ich ändere (Close[2]<LSell && Close[1]<1) scheint die Funktion richtig zu funktionieren.

Vielen Dank!

 

einige Ideen, was falsch ist... jemand?

Vielen Dank!

Grund der Beschwerde: