[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 160

 
extern double SL=100, TP=200, Tral=0, steps=2, Level=100;
extern int TF1=0, TF2=60, TF3=240, per1=14, per2=14, per3=14, shiftbars=20;
double sl, tp, cci[3], lastbar, lastpos=-1, lot=0.1, x=0.0001, calc, price, lb;
int init(){if( SL< Tral) SL= Tral;if(MarketInfo(Symbol(),MODE_DIGITS)==3) x=0.01; TP*= x; SL*= x; Tral*= x; calc=MathPow(2, steps)*0.1;}

double lot(){int l;double lotiki=0.1;bool isit=false;
for(int i=1; i<= steps; i++){
if(!OrderSelect(OrdersHistoryTotal()- i, SELECT_BY_POS, MODE_HISTORY))break;
if(OrderProfit()>0) lotiki*=2; l++;
if(OrderLots()== calc) { isit=true;break;}
if(OrderProfit()<0) break;}
if( l== steps+1 || isit) lotiki=0.1;
return( lotiki);}

int Trailing()
{double Tip, SL1;
for(int i=OrdersTotal()-1; i>=0; i--){
OrderSelect( i, SELECT_BY_POS);if(OrderMagicNumber()==350000){
Tip=OrderType(); SL1=OrderStopLoss();
if( Tip==0) {if(Bid- SL1> Tral) {OrderModify(OrderTicket(),OrderOpenPrice(),Bid- Tral,OrderTakeProfit(),0);break;}}
if( Tip==1) {if( SL1-Ask> Tral) {OrderModify(OrderTicket(),OrderOpenPrice(),Ask+ Tral,OrderTakeProfit(),0);break;}}
}}}

int Closeorders(){
for(int i=OrdersTotal()-1; i>=0; i--){OrderSelect( i, SELECT_BY_POS);if(OrderMagicNumber()==350000)
{if(OrderType()==0) price=Bid;else price=Ask; OrderClose(OrderTicket(),OrderLots(), price,50);break;}}
}
void start(){
//if(iBarShift(NULL,0,lastbar,false)==0)return;
//lastbar=CurTime();
if(OrdersTotal()!=0 && Tral!=0){ Trailing();}
//cci=iCustom(NULL,0,"i-3CCI-h3",CCI_Period_0,Level_0,TF_1,CCI_Period_1,Level_1,TF_2,CCI_Period_2,Level_2,1000,-1,0,0);
cci[0]=iCCI(NULL, TF1, per1,0,1);
cci[1]=iCCI(NULL, TF2, per2,0,0);
cci[2]=iCCI(NULL, TF3, per3,0,0);
string s1="cci-0 *** "+DoubleToStr( cci[0],3);
string s2="cci-1 *** "+DoubleToStr( cci[1],3);
string s3="cci-2 *** "+DoubleToStr( cci[2],3);
string str[3];
str[0]= s1;
str[1]= s2;
str[2]= s3;
color col=Lime;
     for(int y=0; y<3; y++)
     {ObjectCreate("textSignal"+ y,OBJ_LABEL,0,0,0,0,0);    
      ObjectSet("textSignal"+ y, OBJPROP_CORNER,1);
      ObjectSet("textSignal"+ y, OBJPROP_XDISTANCE,35-25);
      ObjectSet("textSignal"+ y, OBJPROP_YDISTANCE, y*(20)+20+8);
      if( cci[ y]>=0) col=Lime;else col=Red;
      if( cci[ y]> Level) col=Aqua;
      if( cci[ y]<- Level) col=DarkViolet;
      ObjectSetText("textSignal"+ y, str[ y],15,"Tahoma", col);
     }
if(OrdersTotal()!=0)return;
if( cci[0]> Level && cci[1]> Level && cci[2]> Level && (/*iBarShift(NULL,0,lb,false)>shiftbars || */ lastpos!=0))
{ Closeorders(); tp=Ask+ TP; sl=Ask- SL;if( TP==0) tp=0;if( SL==0) sl=0;
OrderSend(Symbol(),0, lot(),Ask,50, sl, tp,"i-3CCI-h3_Buy",350000,0); lastpos=0; lb=Time[0];}
if( cci[0]<- Level && cci[1]<- Level && cci[2]<- Level && (/*iBarShift(NULL,0,lb,false)>shiftbars || */ lastpos!=1))
{ Closeorders(); tp=Bid- TP; sl=Ask+ SL;if( TP==0) tp=0;if( SL==0) sl=0;
OrderSend(Symbol(),1, lot(),Bid,50, sl, tp,"i-3CCI-h3_Sell",350000,0); lastpos=1; lb=Time[0];}
}
Aidez-moi, s'il vous plaît.

Si pendant le test visuel de l'EA 1.mq4 (ci-joint) je mets sur un graphique l'indicateur 3-cci-h3 (ci-joint), alors, comme il semblerait, avec exactement les mêmes paramètres de signaux cci calculés de l'indicateur et le cci réel (texte de l'objet dans le coin supérieur droit) ne coïncident pas.

POURQUOI ?

Pourquoi les alertes ne fonctionnent-elles pas dans cet indicateur ?

Code du conseiller expert :





Code indicateur :

//+------------------------------------------------------------------+
//| i-3CCI-h.mq4 |
//| johnfantom & kimIV |
//| http://www.kimiv.ru |
//| |
//| 02.01.2006 CCI avec 3 TF dans une bouteille. | |
//+------------------------------------------------------------------+
#property copyright "johnfantom & KimIV"
#lien de propriété "http://www.kimiv.ru"

#propriété indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_maximum 1.4
#property indicator_level1 0
#property indicator_minimum -1.2

//------- Paramètres de l'indicateur externe -------------------------------
extern int CCI_Period_0 = 14 ; // Période CCI pour la période en cours
extern int Level_0 = 100 ; // Niveau CCI pour le TF actuel
extern int TF_1 = 60 ; // Nombre de minutes dans la première période de temps.
extern int CCI_Period_1 = 14 ; // Période CCI pour le premier TF
extern int Level_1 = 100 ; // Niveau CCI pour le premier TF
extern int TF_2 = 240 ; // Nombre de minutes de la deuxième TF
extern int CCI_Period_2 = 14 ; // Période CCI pour le deuxième TF
extern int Level_2 = 100 ; // Niveau CCI pour le deuxième TF
extern int NumberOfBars = 1000 ; // Nombre de barres (0-All)
extern int ExtBars = 3 ;
int per ;


//------- Tampons indicateurs ------------------------------------------
double buf0[] ;

//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |
//+------------------------------------------------------------------+
void init() {
IndicateurDigits(1) ;

SetIndexBuffer(0, buf0) ;
SetIndexLabel(0, "i-3CCI-h") ;
SetIndexStyle (0, DRAW_HISTOGRAM, STYLE_SOLID, 2) ;
SetIndexEmptyValue(0, 0) ;
}

//+------------------------------------------------------------------+
//| Fonction personnalisée de désinitialisation de l'indicateur |
//+------------------------------------------------------------------+
void deinit() {
Commentaire (") ;
}

//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisé |
//+------------------------------------------------------------------+
void start() {
double cci0,cci1,cci2 ;
int nb1, nb2 ; count ;
int LoopBegin, sh ;


si (NumberOfBars==0) LoopBegin=Bars-1 ;
sinon LoopBegin=NumberOfBars-1 ;
LoopBegin=MathMin(Bars-1, LoopBegin) ;
count=IndicatorCounted() ;
for (sh=count ; sh>=0 ; sh--) {
nb1=iBarShift(NULL, TF_1, Time[sh+1], False) ;
nb2=iBarShift(NULL, TF_2, Time[sh+1], False) ;

cci0=iCCI(NULL, 0, CCI_Period_0, PRICE_CLOSE, sh+1) ;
cci1=iCCI(NULL, TF_1, CCI_Period_1, PRICE_CLOSE, nb1) ;
cci2=iCCI(NULL, TF_2, CCI_Period_2, PRICE_CLOSE, nb2) ;
/* double cci[3] ;
cci[0]=cci0 ;
cci[1]=cci1 ;
cci[2]=cci2 ;
string s1="cci-0 ***"+DoubleToStr(cci[0],3) ;
string s2="cci-1 ***"+DoubleToStr(cci[1],3) ;
string s3="cci-2 ***"+DoubleToStr(cci[2],3) ;
chaîne str[3] ;
str[0]=s1 ;
str[1]=s2 ;
str[2]=s3 ;
color col=Lime ;
for(int y=0;y<3;y++)
{ObjectCreate("textSignal "+y,OBJ_LABEL,0,0,0,0)
ObjectSet("textSignal "+y,OBJPROP_CORNER,1) ;
ObjectSet("textSignal "+y,OBJPROP_XDISTANCE,35-25) ;
ObjectSet("textSignal "+y,OBJPROP_YDISTANCE,y*(20)+20+8) ;
si(cci[y]>=0)col=Lime;else col=Red ;
si(cci[y]>Niveau_0) col=Aqua ;
if(cci[y]<-Level_0) col=DarkViolet ;
ObjectSetText("textSignal "+y,str[y],15, "Tahoma",col) ;
}
*/
if (cci0>Niveau_0 && cci1>Niveau_1 && cci2>Niveau_2) {buf0[sh]=1 ;
if (per != Time[0]) {per = Time[0] ;
si(sh<=ExtBars && ExtBars!=-1)
Alert(Symbol(),Period()," ",
TimeYear(Time[sh]), ",
TimeDay(Time[sh]), ",
TimeMonth(Time[sh]), ",
TimeHour(Time[sh]), " :",
TimeMinute(Time[sh]), ",
"Achat");}}
if (cci0<-Level_0 && cci1<-Level_1 && cci2<-Level_2) {buf0[sh]=-1 ;
if (per != Time[0]) {per = Time[0] ;
si(sh<=ExtBars && ExtBars!=-1)
Alert(Symbol(),Period()," ",
TimeYear(Time[sh]), ",
TimeDay(Time[sh]), ",
TimeMonth(Time[sh]), ",
TimeHour(Time[sh]), " :",
TimeMinute(Time[sh])," ",
"Sale");}}
}
}
//+------------------------------------------------------------------+
 

Essayez-le vous-même. Je n'arrive pas du tout à le faire fonctionner. Ça ne marche pas du tout.

Les lignes sont censées être alignées. Mais en pratique, c'est un peu différent.

int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   ObjectCreate("fibowhite",OBJ_TRENDBYANGLE,0,0,0,0,0);
   //ObjectSet("fibowhite",OBJPROP_ANGLE,angle_);
   ObjectSet("fibowhite", OBJPROP_TIME1,Time[5]);
   ObjectSet("fibowhite", OBJPROP_TIME2,Time[1]);
   ObjectSet("fibowhite", OBJPROP_PRICE1,Low[5]);
   ObjectSet("fibowhite", OBJPROP_PRICE2,Low[1]);
   ObjectSet("fibowhite", OBJPROP_COLOR,Red);
   //----------------------------------------------------------
   ObjectCreate("fibowhite1",OBJ_TRENDBYANGLE,0,0,0,0,0);
   ObjectSet("fibowhite1", OBJPROP_TIME1,Time[5]);
   //ObjectSet("fibowhite1",OBJPROP_TIME2,Time[1]);
   ObjectSet("fibowhite1", OBJPROP_PRICE1,Low[5]);
   //ObjectSet("fibowhite1",OBJPROP_PRICE2,Low[1]);
   ObjectSet("fibowhite1", OBJPROP_COLOR,Green);
   WindowRedraw();
   double awd=ObjectGet("fibowhite", OBJPROP_ANGLE);
   Comment("AngleRED= ",ObjectGet("fibowhite", OBJPROP_ANGLE),"\n AngleWHITE= ",ObjectGet("fibowhite1", OBJPROP_ANGLE));
   ObjectSet("fibowhite1", OBJPROP_ANGLE,ObjectGet("fibowhite", OBJPROP_ANGLE));
   
//----
   return(0);
  }
 

Pouvez-vous me dire ce qui ne va pas ?

J'ai créé une fonction récursive qui écrit une valeur dans le tampon.

Lorsqu'il est appelé depuis l'indicateur, il fonctionne bien, mais lorsque j'essaie de le mettre dans l'EA, la réponse est 0.

Quel peut être le problème ?

 
Andrej78 писал(а) >>

Pouvez-vous me dire ce qui ne va pas ?

J'ai créé une fonction récursive qui écrit une valeur dans le tampon.

Lorsqu'il est appelé depuis l'indicateur, il fonctionne bien, mais lorsque j'essaie de le mettre dans l'EA, la réponse est 0.

Quel peut être le problème ?

peut-être que la taille du tampon n'est pas définie !

 

J'ai trouvé où se situe le problème.

Il s'avère que IndicatorCounted donne 0 dans l'indicateur et -1 dans l'Expert Advisor (cette fonction a un contrôle d'exactitude - être >=0, donc elle n'est pas considérée dans l'Expert Advisor).

Quelle est la raison et comment réparer l'erreur ?

MT4 build 225, eurusd M1.

 
Andrej78 писал(а) >>

J'ai trouvé où se situe le problème.

Il s'avère que IndicatorCounted donne 0 dans l'indicateur et -1 dans l'Expert Advisor (cette fonction a un contrôle d'exactitude - être >=0, donc elle n'est pas considérée dans l'Expert Advisor).

Quelle est la raison et comment réparer l'erreur ?

MT4 build 225, eurusd M1.

https://docs.mql4.com/ru/customind

 

if (k>k1+7 && s<(High[1]-(High[1]-Low[1])/2) && bay==true)
{
int t=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,NULL,NULL,"My order #",16384,0,Green);
bay=false;
Print (GetLastError());
}
}
if (s>(High[0]-(High[0]-Low[0])/2) && bay==false)
{
OrderSelect(t,SELECT_BY_TICKET,MODE_TRADES);
Print (GetLastError());
OrderClose(t,0.1,Ask,5,Red);
}

Quelle est l'erreur dans le code d'enregistrement 4051 not right ticket lors de la fermeture d'une commande ?
 
evgenio писал(а) >>

if (k>k1+7 && s<(High[1]-(High[1]-Low[1])/2) && bay==true)
{
int t=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,NULL,NULL,"My order #",16384,0,Green);
bay=false;
Print (GetLastError());
}
}
if (s>(High[0]-(High[0]-Low[0])/2) && bay==false)
{
OrderSelect(t,SELECT_BY_TICKET,MODE_TRADES);
Print (GetLastError());
OrderClose(t,0.1,Ask,5,Red);
}

Quel est le bogue dans le code de journalisation 4051 pas un ticket valide lors de la fermeture d'une commande s'il vous plaît conseiller ?

L'ouverture et la fermeture ont lieu sur des ticks différents. Et le conseiller expert ne se souvient plus de ce qui a été affecté à la variable t. Il doit être soit global, soit statique.

Une variable globale est définie en dehors des fonctions. Ou bien il peut être déclaré comme static int

 
Vinin >> :

L'ouverture et la fermeture ont lieu sur des ticks différents. Et le conseiller expert ne se souvient plus de ce qui a été affecté à la variable t. Il doit être soit global, soit statique.

Une variable globale est définie en dehors des fonctions. Ou bien il peut être déclaré comme static int

merci beaucoup, j'avais oublié ;))

 

Dans l'Indicateur que j'ai défini (pour ensuite les comparer avec Time[i]) :

extern datetime StartRange          = D'1970.12.24';
extern datetime EndRange            = D'2020.12.24';


Puis dans la boucle

   Comment(
      "\n", "Time[i]                = "   , Time[ i],
      "\n", "StrToTime(StartRange)  = "   , StrToTime( StartRange),
      "\n", "StrToTime(EndRange)    = "   , StrToTime( EndRange),
   "\n" );


Par conséquent, StrToTime(StartRange) et StrToTime(EndRange) produisent des zéros .

- Pourquoi et comment y remédier ?

Raison: