tracer la ligne H_ sur le plus haut des 36 derniers sommets - page 2

 

Je ne me soucie pas de la clôture stochastique, donc le K% actuel est suffisant.

code pour les objets de contrôle:

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

cela supprime la ligne id après 96 bougies. comme j'en ai besoin

Ce que je dois faire maintenant est d'empêcher l'ea de dessiner de nouvelles lignes tomate si une ligne tomate est déjà sur le graphique.

Je pense ajouter

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

......... = stop et depuis le début (mais toujours lire les conditions de l'olive)

code maintenant :

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

pour reformuler :

Je veux que sur le graphique, il y ait au maximum une ligne de tomates.

si cette ligne sera utilisée pour l'envoi d'ordre, supprimer la ligne.

si elle expire (96), supprimer la ligne.

même chose pour olive.

donc si la ligne tomate est déjà sur le graphique, pas d'autres lignes tomate jusqu'à ce qu'il n'y ait plus de tomate sur le graphique.

j'espère que la reformulation aidera à trouver la solution :)

 
cichichan:

pour reformuler :

Je veux que sur le graphique, il y ait au maximum une ligne de tomates.

si cette ligne sera utilisée pour OrderSend, supprimer la ligne.

si elle expire (96), supprimer la ligne.

même chose pour olive.

donc si la ligne tomate est déjà sur le graphique, pas d'autres lignes tomate jusqu'à ce qu'il n'y ait plus de tomate sur le graphique.

j'espère que la reformulation aidera à trouver la solution :)


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

c'est le moment où vous créez votre ligne ? ?? comment faire ? ??

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

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

Alors comment éviter de dessiner d'autres lignes ? .... ??

 

Je pensais changer le nom de l'objet comme initial pour empêcher le script de dessiner des lignes à cause de la limitation du même nom... mais je n'ai pas de fonction pour changer le nom.

hmm.... je ne comprends pas.

Je me sens stupide et frustré.

 
cichichan:

Je pensais changer le nom de l'objet comme initial pour empêcher le script de dessiner des lignes à cause de la limitation du même nom... mais je n'ai pas de fonction pour changer le nom.

hmm.... je ne comprends pas.

Mon esprit est bloqué ! je me sens stupide et frustré.

quand crée-t-on une nouvelle ligne ?

pas au moment de la barre que vous trouvez la plus haute ou la plus basse

et vous devez créer seulement s'il n'y a pas de ligne.

Donc si vous créez une nouvelle ligne, utilisez le temps de Time[0].

si vous trouvez votre objet, quel est son nom ? ? ==> string id=ObjectName (i) ;

donc qu'est ce que vous devez faire ? ? obtenir ce nom quand il a StringSubstr(id,0,7)=="tomate "

 

Revenez à votre premier message :

"Quand j'exécute ce programme, j'obtiens la première configuration pour la tomate et pour l'olive, puis même si dans le journal j'obtiens "tomate ON" à différents niveaux de prix, je n'obtiens pas de nouvelle ligne de tomate sur le graphique. même chose pour l'olive."

Vous n'obtenez pas de nouvelle ligne car l'ancienne existe déjà. Supprimez-la et une nouvelle ligne sera dessinée.

 

Pour le moment, j'ai fait comme ceci :

et on dirait que ça marche comme il faut, juste une ligne, et après 96 barres supprimées, le redessin quand la condition réapparaît.

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

Est-ce que cela fonctionne ?

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

les chaînes de caractères peuvent-elles être < ou > l'une par rapport à l'autre, c'est une question, je ne sais pas.

Vous compliquez les choses, parce que giol vous dit que si vous voulez plusieurs lignes, vous devez donner des noms différents aux lignes. Et il avait raison à l'époque.

S'il savait que vous ne voulez qu'une seule ligne, il n'aurait pas dit ça. La solution que devries a donné est très bonne dans le cas où l'on a plusieurs lignes, merci devries.

Mais si vous ne voulez qu'une seule ligne, appelez-la "tomate" ou "olive", alors est-ce que ObjectFind("tomate") ObjectDelete ("tomate"), résout les problèmes de temps séparé avec Time[96] et Time[0] stockés lorsque la ligne est dessinée.

Le prochain problème qui va se produire est que la condition stoch> 75 pourrait durer 20 Bars ou 50 Bars, alors, quand vous effacerez votre ligne, la condition pour dessiner la ligne sera toujours valide et dès que la ligne aura été effacée, ou un ordre pris, une nouvelle ligne sera dessinée. bonne chance, ce n'est pas si difficile.

 

Bonjour

Comme l'objet semblait trop compliqué pour mes deux semaines de lecture de code, j'ai décidé de définir un prix de niveau pour la vente et l'achat :

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

le "if (Close[2]>LSell && Close[1]>LSell && LevelSset==true) ne fonctionne pas.

Si je supprime le if (Close[2]>LSell && Close[1]>LSell) et laisse (LevelSset==true), ou si je change (Close[2]<LSell && Close[1]<1) la fonction semble fonctionner correctement.

Je vous remercie

 

des idées, ce qui ne va pas... quelqu'un ?

Merci.

Raison: