/*-----------------------------+ | | | Shared by www.Aptrafx.com | | | +------------------------------*/ //+------------------------------------------------------------------+ //| Mouteki EA 0.4 Modifié.mq4 | //| Copyright © 2006, GwadaTradeBoy | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, GwadaTradeBoy" #property link "http://www.metaquotes.net" //-- Variables pour l'EA Mouteki --// //#define MAGICMA 20050610 extern string nameEA = "Mouteki"; extern bool AlertsOn=True; extern bool MultiPositions=False; extern int ProfitToMoveSL=40; extern int PositiveSL=10; extern int SL_Offset=0; extern int TP_Offset=0; //extern double LotsPerTrade=1; //extern bool LondonOpen=True; //extern bool NewYorkOpen=True; //extern bool TokyoOpen=True; int spread; bool TD=False;/*Default is False. True setting draws up and down arrows instead of dots on TD Points creating more clutter.*/ int BackSteps=0;/*Used to be extern int now just int. Leave at 0*/ int ShowingSteps=1;/*Used to be extern int now just int. Leave at 1*/ bool FractalAsTD=False;/*Used to be extern bool now just bool. Leave at False, otherwise Trend Lines based on Fractal Points not TD Points*/ double TrendLineBreakUp=-1;//Line added. double TrendLineBreakUpPrev=-1;//Line added. double TrendLineBreakUpPrev1=-1;//Line added. bool TrendLineBreakUpFlag=False;//Line added. double TrendLineBreakDown=-1;//Line added. double TrendLineBreakDownPrev=-1;//Line added. double TrendLineBreakDownPrev1=-1;//Line added. bool TrendLineBreakDownFlag=False;//Line added. bool BothTLBroken=False; //---- buffers double highs[100000]; double lows[100000]; //-- Variables pour l'indic Mouteki --// extern bool Comments=true;/*Optional Comments. Default is false. Orginal variable called "Commen"*/ extern bool TrendLine=True;/*Default is true to draw current TD Lines*/ extern int TrendLineStyle=STYLE_SOLID;/*STYLE>_SOLID=0,DASH=1,_DOT=2,_DASHDOT=3,_DASHDDOTDOT=4. Line of code added from original.*/ extern int TrendLineWidth=1;/*Thinnest or allow dots and dashes = 0 or 1, Thinner=2, Medium=3,Thicker=4,Thickest=5. Line of code added from original.*/ extern color UpperTrendLineColour=LimeGreen;/*Line of code added from original.*/ extern color LowerTrendLineColour=Red;/*Line of code added from original.*/ extern bool ProjectionLines=True;/*Default is True. These are the TD Price Projections. Original variable called "Take Prof"*/ extern int ProjectionLinesStyle=STYLE_DOT;/*STYLE>_SOLID=0,DASH=1,_DOT=2,_DASHDOT=3,_DASHDDOTDOT=4. Line of code added from original.*/ extern int ProjectionLinesWidth=1;/*Thinnest or allow dots and dashes = 0 or 1, Thinner=2, Medium=3,Thicker=4,Thickest=5. Line of code added from original.*/ extern color UpperProjectionLineColour=LimeGreen;/*Line of code added from original.*/ extern color LowerProjectionLineColour=Red;/*Line of code added from original.*/ extern bool HorizontLine=true;/*Default is false. It seems the Horizontal Lines are were the code predicts price may cross TD line.*/ string Comm=""; //-- Variables pour l'optimisation des lots --// extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; //-- Variable pour l'optimisation de l'EA --// bool isBuying = false; bool isSelling = false; bool isClosing = false; //-- Variables pour le Signal 2 Stolastic --// //+------------------------------------------------------------------+ //| Fonction d'initialisation de l'expert | //+------------------------------------------------------------------+ int init() { //-- Lecture du spread spread = MarketInfo(Symbol(),MODE_SPREAD); //-- Initialisation indicateur Mouteki SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,217); SetIndexBuffer(0,highs); SetIndexEmptyValue(0,0.0); SetIndexStyle(1,DRAW_ARROW); SetIndexArrow(1,218); SetIndexBuffer(1,lows); SetIndexEmptyValue(1,0.0); for (int i=1;i<=10;i++) { ObjectDelete("HHL_"+i);ObjectDelete("HL_"+i); ObjectDelete("HLL_"+i);ObjectDelete("LL_"+i); ObjectDelete("HC1_"+i); ObjectDelete("HC2_"+i); ObjectDelete("HC3_"+i); ObjectDelete("LC1_"+i); ObjectDelete("LC2_"+i); ObjectDelete("LC3_"+i); } Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| Fonction de desinitialisation de l'expert | //+------------------------------------------------------------------+ int deinit() { //-- Desinitialisation indicateur Mouteki for (int i=1;i<=10;i++) { ObjectDelete("HHL_"+i);ObjectDelete("HL_"+i); ObjectDelete("HLL_"+i);ObjectDelete("LL_"+i); ObjectDelete("HC1_"+i); ObjectDelete("HC2_"+i); ObjectDelete("HC3_"+i); ObjectDelete("LC1_"+i); ObjectDelete("LC2_"+i); ObjectDelete("LC3_"+i); } Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| Calculs preliminaires de l'expert | //+------------------------------------------------------------------+ //--- Calcul de la taille optimale du lot ---// double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // Historique des ordres int losses=0; // Nombre de trade perdants consécutif /* Selection de la taille du lot */ lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000,1); /* Calcul du nombre de perte consecutive */ if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==False) { Print("Erreur dans l historique!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } /* Retour de la taille du lot */ if(lot<0.1) lot=0.1; return(lot); } //--- Calcul préliminaire à l'utilisation de Mouteki ---// /* Recherche des Hauts et des Bas dans le graph */ int SetTDPoint(int B) { int shift; if (FractalAsTD==False) { for (shift=B;shift>2;shift--) { /* Si le Haut de la barre de gauche et egale au Haut de la barre courante, le Haut de la barre courante est un Haut valide */ if (High[shift+2]<=High[shift] && High[shift+1]<=High[shift] && High[shift-1]<High[shift] && High[shift-2]<High[shift]) highs[shift]=High[shift]; //if(shift<100 && highs[shift]!=0) Print("shift=", shift, " highs[shift]=", highs[shift]); //else highs[shift]=0; /* Si le Bas de la barre de gauche et egale au Bas de la barre courante, le Bas de la barre courante est un Bas valide */ if (Low[shift+2]>=Low[shift] && Low[shift+1]>=Low[shift] && Low[shift-1]>Low[shift] && Low[shift-2]>Low[shift]) lows[shift]=Low[shift]; //else lows[shift]=0; } highs[0]=0; lows[0]=0; highs[1]=0; lows[1]=0; } else { for (shift=B;shift>3;shift--) { if (High[shift+1]<=High[shift] && High[shift-1]<High[shift] && High[shift+2]<=High[shift] && High[shift-2]<High[shift]) highs[shift]=High[shift]; else highs[shift]=0; if (Low[shift+1]>=Low[shift] && Low[shift-1]>Low[shift] && Low[shift+2]>=Low[shift] && Low[shift-2]>Low[shift]) lows[shift]=Low[shift]; else lows[shift]=0; } highs[0]=0; lows[0]=0; highs[1]=0; lows[1]=0; highs[2]=0; lows[2]=0; } return(0); } //-- Choix des sommets pour tracer la TrendLine --// /* Sommet Haut 1 */ int GetHighTD(int P) { int i=0,j=0; while (j<P) { i++; while(highs[i]==0) { i++;if(i>Bars-2)return(-1); } j++; } return (i); } /* Sommet Haut 2 */ int GetNextHighTD(int P) { int i=P+1; while(lows[i]<=High[P]) { i++;if(i>Bars-2)return(-1); } return (i); } /* Sommet Bas 1 */ int GetLowTD(int P) { int i=0,j=0; while (j<P) { i++; while(lows[i]==0) { i++;if(i>Bars-2)return(-1); } j++; } return (i); } /* Sommet Bas 2 */ int GetNextLowTD(int P) { int i=P+1; while(lows[i]>=Low[P] || lows[i]==0) { i++;if(i>Bars-2)return(-1); } return (i); } //-- Dessin des Trend Lines //-- Trend Line du Haut int TrendLineHighTD(int H1,int H2,int Step,int Col) { ObjectSet("HL_"+Step,OBJPROP_TIME1,Time[H2]); ObjectSet("HL_"+Step,OBJPROP_TIME2,Time[H1]); ObjectSet("HL_"+Step,OBJPROP_PRICE1,High[H2]); ObjectSet("HL_"+Step,OBJPROP_PRICE2,High[H1]); ObjectSet("HL_"+Step,OBJPROP_COLOR,UpperTrendLineColour);/*TEMP Original OBJPROP_COLOR,Col*/ if (Step==1) ObjectSet("HL_"+Step,OBJPROP_WIDTH,TrendLineWidth);/*Original OBJPROP_WIDTH,2*/ else ObjectSet("HL_"+Step,OBJPROP_WIDTH,1); return(0); } //-- Trend Line du Bas int TrendLineLowTD(int L1,int L2,int Step,int Col)/*Draw Lower Trend Line*/ { ObjectSet("LL_"+Step,OBJPROP_TIME1,Time[L2]); ObjectSet("LL_"+Step,OBJPROP_TIME2,Time[L1]); ObjectSet("LL_"+Step,OBJPROP_PRICE1,Low[L2]); ObjectSet("LL_"+Step,OBJPROP_PRICE2,Low[L1]); ObjectSet("LL_"+Step,OBJPROP_COLOR,LowerTrendLineColour);/*TEMP Original OBJPROP_COLOR,Col*/ if (Step==1) ObjectSet("LL_"+Step,OBJPROP_WIDTH,TrendLineWidth);/*Original OBJPROP_WIDTH,2*/ else ObjectSet("LL_"+Step,OBJPROP_WIDTH,1); return(0); } //-- Dessin des Projections de Prix //-- Projection Long string TakeProfitHighTD(int H1,int H2,int Step,int Col)/*Draw Buy TD Price Projection(s)*/ { int i,ii,j=0; string Comm=""; double kH,HC1,HC2,HC3,k,St; kH=(High[H2]-High[H1])/(H2-H1); while (NormalizeDouble(Point,j)==0)j++; k=0; for(i=H1;i>0;i--) if(Close[i]>High[H2]-kH*(H2-i)){k=High[H2]-kH*(H2-i); break;} if (k>0) { Comm=Comm+"UTD_Line ("+DoubleToStr(High[H2]-kH*H2,j)+") broken at "+DoubleToStr(k,j)+", uptargets:\n"; ii=Lowest(NULL,0,MODE_LOW,H2-i,i); HC1=High[H2]-kH*(H2-ii)-Low[ii]; HC2=High[H2]-kH*(H2-ii)-Close[ii]; ii=Lowest(NULL,0,MODE_CLOSE,H2-i,i); HC3=High[H2]-kH*(H2-ii)-Close[ii]; St=TrendLineStyle;/*Original STYLE_SOLID*/ } else { k=High[H2]-kH*H2; Comm=Comm+"UTD_Line ("+DoubleToStr(k,j)+"), probable break-up targets:\n"; ii=Lowest(NULL,0,MODE_LOW,H2,0); HC1=High[H2]-kH*(H2-ii)-Low[ii]; HC2=High[H2]-kH*(H2-ii)-Close[ii]; ii=Lowest(NULL,0,MODE_CLOSE,H2,0); HC3=High[H2]-kH*(H2-ii)-Close[ii]; St=TrendLineStyle;/*Original STYLE_DASHDOT*/ } ObjectSet("HL_"+Step,OBJPROP_STYLE,St); Comm=Comm+"T1="+DoubleToStr(HC1+k,j)+" ("+DoubleToStr(HC1/Point,0)+"pts.)\n";//changed "pts.)" to "pts.)\n" ObjectSet("HC1_"+Step,OBJPROP_TIME1,Time[H1]);ObjectSet("HC1_"+Step,OBJPROP_TIME2,Time[0]); ObjectSet("HC1_"+Step,OBJPROP_PRICE1,HC1+k);ObjectSet("HC1_"+Step,OBJPROP_PRICE2,HC1+k); ObjectSet("HC1_"+Step,OBJPROP_COLOR,Col);ObjectSet("HC1_"+Step,OBJPROP_STYLE,St); if (Step==1) { ObjectSet("HC1_"+Step,OBJPROP_WIDTH,ProjectionLinesWidth);/*Original OBJPROP_WIDTH,2*/ ObjectSet("HC1_"+Step,OBJPROP_STYLE,ProjectionLinesStyle);/*This Line of code added from original. TD Upper Projection Line Style*/ } else { ObjectSet("HC1_"+Step,OBJPROP_WIDTH,2); } return(Comm); } //-- Projection Short string TakeProfitLowTD(int L1,int L2,int Step,int Col)/*Draw Sell TD Price Projection(s)*/ { int i,ii,j=0; string Comm=""; double kL,LC1,LC2,LC3,k,St; kL=(Low[L1]-Low[L2])/(L2-L1); while (NormalizeDouble(Point,j)==0)j++; k=0; for(i=L1;i>0;i--) if(Close[i]<Low[L2]+kL*(L2-i)) {k=Low[L2]+kL*(L2-i); break;} if (k>0) { Comm=Comm+"LTD_Line ("+DoubleToStr(Low[L2]+kL*L2,j)+") broken at "+DoubleToStr(k,j)+", downtargets:\n"; ii=Highest(NULL,0,MODE_HIGH,L2-i,i); LC1=High[ii]-(Low[L2]+kL*(L2-ii)); LC2=Close[ii]-(Low[L2]+kL*(L2-ii)); i=Highest(NULL,0,MODE_CLOSE,L2-i,i); LC3=Close[ii]-(Low[L2]+kL*(L2-ii)); St=TrendLineStyle;/*Original STYLE_SOLID*/ } else { k=Low[L2]+kL*L2; Comm=Comm+"LTD_Line ("+DoubleToStr(k,j)+"), probable downbreak targets:\n"; ii=Highest(NULL,0,MODE_HIGH,L2,0); LC1=High[ii]-(Low[L2]+kL*(L2-ii)); LC2=Close[ii]-(Low[L2]+kL*(L2-ii)); ii=Highest(NULL,0,MODE_CLOSE,L2,0); LC3=Close[ii]-(Low[L2]+kL*(L2-ii)); St=TrendLineStyle;/*Original STYLE_DASHDOT*/ } ObjectSet("LL_"+Step,OBJPROP_STYLE,St); Comm=Comm+"T1="+DoubleToStr(k-LC1,j)+" ("+DoubleToStr(LC1/Point,0)+"pts.)\n";//changed "pts.)" to "pts.)\n" ObjectSet("LC1_"+Step,OBJPROP_TIME1,Time[L1]);ObjectSet("LC1_"+Step,OBJPROP_TIME2,Time[0]); ObjectSet("LC1_"+Step,OBJPROP_PRICE1,k-LC1);ObjectSet("LC1_"+Step,OBJPROP_PRICE2,k-LC1); ObjectSet("LC1_"+Step,OBJPROP_COLOR,Col);ObjectSet("LC1_"+Step,OBJPROP_STYLE,St); if (Step==1) { ObjectSet("LC1_"+Step,OBJPROP_WIDTH,ProjectionLinesWidth);/*Original OBJPROP_WIDTH,2*/ ObjectSet("LC1_"+Step,OBJPROP_STYLE,ProjectionLinesStyle);/*This Line of code added from original. TD Lower Projection Line Style*/ } else { ObjectSet("LC1_"+Step,OBJPROP_WIDTH,2); } return(Comm); } string TDMain(int Step) { int H1,H2,L1,L2; // string Comm="--- step "+Step+" --------------------\n"; int i,j; while (NormalizeDouble(Point,j)==0)j++; double Style; double Col[20];Col[0]=UpperProjectionLineColour/*Original Col[0]=Red, Colour for Current Upper TD Projection*/;Col[2]=Magenta;Col[4]=Chocolate;Col[6]=Goldenrod;Col[8]=SlateBlue; Col[1]=LowerProjectionLineColour/*Original Col[1]=Blue, Colour for Current Lower TD Projection*/;Col[3]=FireBrick;Col[5]=Green;Col[7]=MediumOrchid;Col[9]=CornflowerBlue; Col[10]=Red;Col[12]=Magenta;Col[14]=Chocolate;Col[16]=Goldenrod;Col[18]=SlateBlue; Col[11]=Blue;Col[13]=FireBrick;Col[15]=Green;Col[17]=MediumOrchid;Col[19]=CornflowerBlue; Step=Step+BackSteps; H1=GetHighTD(Step); H2=GetNextHighTD(H1); L1=GetLowTD(Step); L2=GetNextLowTD(L1); TrendLineBreakUp=High[H2]-(High[H2]-High[H1])/(H2-H1)*H2;//added line TrendLineBreakDown=Low[L2]+(Low[L1]-Low[L2])/(L2-L1)*L2;//added line if (H1<0) Comm=Comm+"UTD no TD up-point \n"; else if (H2<0) Comm=Comm+"UTD no TD point-upper then last one ("+DoubleToStr(High[H1],j)+")\n"; else Comm=Comm+"UTD "+DoubleToStr(High[H2],j)+" "+DoubleToStr(High[H1],j)+"\n"; if (L1<0) Comm=Comm+"LTD no TD down-point \n"; else if (L2<0) Comm=Comm+"LTD no TD point-lower then last one ("+DoubleToStr(Low[L1],j)+")\n"; else Comm=Comm+"LTD "+DoubleToStr(Low[L2],j)+" "+DoubleToStr(Low[L1],j)+"\n"; //----------------------------------------------------------------------------------- if (Step==1) Style=STYLE_SOLID; else Style=STYLE_DOT; if (H1>0 && H2>0) { if (TrendLine==1) { ObjectCreate("HL_"+Step,OBJ_TREND,0,0,0,0,0); TrendLineHighTD(H1,H2,Step,Col[Step*2-2]); } else ObjectDelete("HL_"+Step); if (HorizontLine==1 && Step==1) { ObjectCreate("HHL_"+Step,OBJ_HLINE,0,0,0,0,0); ObjectSet("HHL_"+Step,OBJPROP_BACK,True);//Line added } else ObjectDelete("HHL_"+Step); if (ProjectionLines==1) { ObjectCreate("HC1_"+Step,OBJ_TREND,0,0,0,0,0); ObjectCreate("HC2_"+Step,OBJ_TREND,0,0,0,0,0); ObjectCreate("HC3_"+Step,OBJ_TREND,0,0,0,0,0); //Comm=Comm+TakeProfitHighTD(H1,H2,Step,Col[Step*2-2]); } else { ObjectDelete("HC1_"+Step); ObjectDelete("HC2_"+Step); ObjectDelete("HC3_"+Step); } } //----------------------------------------------------------------------------------- if (L1>0 && L2>0) { if (TrendLine==1) { ObjectCreate("LL_"+Step,OBJ_TREND,0,0,0,0,0); TrendLineLowTD(L1,L2,Step,Col[Step*2-1]); } else ObjectDelete("LL_"+Step); if (HorizontLine==1 && Step==1) { ObjectCreate("HLL_"+Step,OBJ_HLINE,0,0,0,0,0); ObjectSet("HLL_"+Step,OBJPROP_BACK,True);//Line added } else ObjectDelete("HLL_"+Step); if (ProjectionLines==1) { ObjectCreate("LC1_"+Step,OBJ_TREND,0,0,0,0,0); ObjectCreate("LC2_"+Step,OBJ_TREND,0,0,0,0,0); ObjectCreate("LC3_"+Step,OBJ_TREND,0,0,0,0,0); //Comm=Comm+TakeProfitLowTD(L1,L2,Step,Col[Step*2-1]); } else { ObjectDelete("LC1_"+Step); ObjectDelete("LC2_"+Step); ObjectDelete("LC3_"+Step); } } } //** Fonction en test ** bool IsNewBar() { static datetime lastbar = 0; datetime curbar = Time[0]; if(lastbar!= curbar) { lastbar=curbar; return (true); } else { return(false) ; } } //+------------------------------------------------------------------+ //| fonction de demarrage de l'expert | //+------------------------------------------------------------------+ int start() { //==============Indicateur Mouteki============================== string Comm=""; SetTDPoint(Bars-1); if (TD==1) { SetIndexArrow(0,217); SetIndexArrow(1,218); } else { SetIndexArrow(0,160); SetIndexArrow(1,160); } if (ShowingSteps>10) { Comment("ShowingSteps readings 0 - 10"); return(0); } for (int i=1;i<=ShowingSteps;i++) { Comm=Comm+TDMain(i); Comm=Comm+"------------------------------------\nShowingSteps="+ShowingSteps+"\nBackSteps="+BackSteps; if (FractalAsTD==true) Comm=Comm+"\nFractals"; else Comm=Comm+"\nTD point"; if (Comments==1) Comment(Comm); else Comment(""); } //==============EA Mouteki============================== int cnt, H1, H2, L1, L2, ii, iii, pos, total, ticket; double kH, kL, k, pp, tp, sl; //--- Calcul du lancement du Trailing Stop ---// // il faudrait amméliorer le trailing stop pour qu'il suive le mouvement de PositiveSL //--Calcul total=OrdersTotal(); for(cnt=0;cnt<total;cnt++) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==True) { if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>=ProfitToMoveSL*Point && OrderOpenPrice()-OrderStopLoss()>=0) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+PositiveSL*Point,OrderTakeProfit(),0); continue; } if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>=ProfitToMoveSL*Point && OrderOpenPrice()-OrderStopLoss()<=0) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-PositiveSL*Point,OrderTakeProfit(),0); continue; } } } else Print("OrderSelect returned the error of ",GetLastError()); } //--- Les Trend Line ---// //-- Où sont-elles? SetTDPoint(Bars-1); H1=GetHighTD(1); H2=GetNextHighTD(H1); L1=GetLowTD(1); L2=GetNextLowTD(L1); kH=(High[H2]-High[H1])/(H2-H1); kL=(Low[L1]-Low[L2])/(L2-L1); TrendLineBreakUp=High[H2]-kH*H2; TrendLineBreakUpPrev=High[H2]-kH*(H2-1); TrendLineBreakUpPrev1=High[H2]-kH*(H2-2); TrendLineBreakDown=Low[L2]+kL*L2; TrendLineBreakDownPrev=Low[L2]+kL*(L2-1); TrendLineBreakDownPrev1=Low[L2]+kL*(L2-2); //=====================SIGNAL1======================= //-- Cassure des 2 Trend Line? Wait! if(Open[0]>TrendLineBreakUp && Open[0]<TrendLineBreakDown) // && H2<50 && L2<50) { BothTLBroken=True; ArrayInitialize(highs, 0.0); ArrayInitialize(lows, 0.0); return(0); } //-- Cassure de la Trend Line du Haut ? //if(Open[0]<TrendLineBreakUp) if(Close[0]>TrendLineBreakUp && Open[0]<TrendLineBreakUp && TrendLineBreakUpFlag==False) { BothTLBroken=False; TrendLineBreakUpFlag=True; //Print("Upper TrendLine Break ",Symbol()," ",Period()," ",Bid); if(AlertsOn) Alert("UTL Break>",TrendLineBreakUp," on ",Symbol()," ",Period()," @ ",Ask); } //-- Long à la cassure de la trend line ?? if (pos==0||MultiPositions && Close[0]>TrendLineBreakUp) { Print("Ready to open a long trade"); //-- Ordre d'achat ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,sl,tp,"Mouteki",00011,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { Print("Long order opened : ",OrderOpenPrice()); //--Ordre passé réinitialisation des variables ArrayInitialize(highs, 0.0); ArrayInitialize(lows, 0.0); TrendLineBreakUp = False; isBuying = False; } else Print("Error opening Long order : ",GetLastError()); } } //-- Cassure de la Trend Line du Bas ? //if(Open[0]<TrendLineBreakDown) if(Close[0]<TrendLineBreakDown && TrendLineBreakDownFlag==False) { BothTLBroken=False; TrendLineBreakDownFlag=True; //Print("Lower Trendline Break ",Symbol()," ",Period()," ",Bid); if(AlertsOn) Alert("LTL Break<",TrendLineBreakDown," on ",Symbol()," ",Period()," @ ",Bid); } //=====================SIGNAL2======================= //==============Prise de Décision============================== //--- Opération Horaire ---// // Les 10 premières seconde de chaque bougie de 4H //if (MathMod(Hour(),4)==0 && Minute()==0 && Seconds()<10) if (IsNewBar()) { //if (TrendLineBreakUpFlag == True && Open[0]>TrendLineBreakUp) if (TrendLineBreakUpFlag == True && Open[0]>TrendLineBreakUp && Close[-1]>TrendLineBreakUp) { isBuying = True; } //if (TrendLineBreakDownFlag == True && Open[0]<TrendLineBreakDown) if (TrendLineBreakDownFlag == True && Close[0]<TrendLineBreakDown) { isSelling = True; } } //=====================Prise de position======================= //-- Conditions d'achat if(isBuying && !isSelling && !isClosing) { //-- Calcul de la Projection de Prix /* int i,ii,j=0; double kH,HC1,HC2,HC3,k,St; kH=(High[H2]-High[H1])/(H2-H1); while (NormalizeDouble(Point,j)==0)j++; k=0; for(i=H1;i>0;i--) if(Close[i]>High[H2]-kH*(H2-i)) {k=High[H2]-kH*(H2-i); break;} if (k>0) { ii=Lowest(NULL,0,MODE_LOW,H2-i,i); HC1=High[H2]-kH*(H2-ii)-Low[ii]; HC2=High[H2]-kH*(H2-ii)-Close[ii]; ii=Lowest(NULL,0,MODE_CLOSE,H2-i,i); HC3=High[H2]-kH*(H2-ii)-Close[ii]; } else { k=High[H2]-kH*H2; ii=Lowest(NULL,0,MODE_LOW,H2,0); HC1=High[H2]-kH*(H2-ii)-Low[ii]; HC2=High[H2]-kH*(H2-ii)-Close[ii]; ii=Lowest(NULL,0,MODE_CLOSE,H2,0); HC3=High[H2]-kH*(H2-ii)-Close[ii]; } */ // Il y a une couille à vérifier parce que jamais atteinte ii=Lowest(NULL,0,MODE_LOW,H2-1,1); iii=Lowest(NULL,0,MODE_LOW,H2-H1,H1); pp=MathMax(High[H2]-kH*(H2-ii)-Low[ii], High[H2]-kH*(H2-iii)-Low[iii]); //-- Calcul du StopLoss et du Take Profit tp=pp-spread*Point+Open[0]+TP_Offset*Point; if (pp>90*Point) sl=Open[0]-spread*Point-MathRound(10000*pp*0.33)/10000-SL_Offset*Point; else sl=Open[0]-spread*Point-MathRound(10000*pp*0.5)/10000-SL_Offset*Point; /*Ca pue les pieds la, il faudra dépatouiller tout ça */ // Short exists? Close it. Long exists? Change it. total=OrdersTotal(); pos=0; for(cnt=0;cnt<total;cnt++) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==True) { /* // Close the shorts if(OrderType()==OP_SELL && OrderSymbol()==Symbol()) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); continue; } */ // Modify the longs if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { pos++; OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0); continue; } } else Print("OrderSelect returned the error of ",GetLastError()); } Print("pos=", pos, " MultiPositions=", MultiPositions); // Long à la cassure de la Trend Line Haut if (pos==0||MultiPositions) { Print("Ready to open a long trade"); //-- Ordre d'achat ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,sl,tp,"Mouteki",00011,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Long order opened : ",OrderOpenPrice()); /* Print("H1=", H1, " High[H1]=", High[H1]); Print("H2=", H2, " High[H2]=", High[H2]); Print("L1=", L1, " Low[L1]=", Low[L1]); Print("L2=", L2, " Low[L2]=", Low[L2]); Print("TrendLineBreakUp=", TrendLineBreakUp); Print("TrendLineBreakDown=", TrendLineBreakDown); Print("Open[0]=", Open[0], " Open[1]=", Open[1]); */ // Fin de la prise de position, réinitialisation des variables pour un autre tour ArrayInitialize(highs, 0.0); ArrayInitialize(lows, 0.0); TrendLineBreakUp = False; isBuying = False; } else Print("Error opening Long order : ",GetLastError()); } // } } //-- Conditions de vente if(isSelling && !isBuying && !isClosing) { //-- Calcul de la Projection de Prix //Revoir à partir de calcul de prix du haut // Il y a une couille target jamais atteind ii=Highest(NULL,0,MODE_HIGH,L2-1,1); iii=Highest(NULL,0,MODE_HIGH,L2-L1,L1); pp=MathMax(High[ii]-(Low[L2]+kL*(L2-ii)), High[iii]-(Low[L2]+kL*(L2-iii))); //-- Calcul du StopLoss et du Take Profit tp=Open[0]-pp+spread*Point-TP_Offset*Point; if (pp>90*Point) sl=Open[0]+spread*Point+MathRound(10000*pp*0.33)/10000+SL_Offset*Point; else sl=Open[0]+spread*Point+MathRound(10000*pp*0.5)/10000+SL_Offset*Point; /* ca re-pue des pieds */ // Long exists? Close it. Short exists? Change it. total=OrdersTotal(); pos=0; for(cnt=0;cnt<total;cnt++) { if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==True) { /* // Close the longs if(OrderType()==OP_BUY && OrderSymbol()==Symbol()) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); continue; } */ // Modify the shorts if(OrderType()==OP_SELL && OrderSymbol()==Symbol()) { pos++; OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0); continue; } } else Print("OrderSelect returned the error of ",GetLastError()); } // Short à la cassure de la Trend Line Bas if (pos==0||MultiPositions) { Print("Ready to open a short trade"); //-- Ordre de vente ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,sl,tp,"Mouteki",00021,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Short order opened : ",OrderOpenPrice()); /* Print("H1=", H1, " High[H1]=", High[H1]); Print("H2=", H2, " High[H2]=", High[H2]); Print("L1=", L1, " Low[L1]=", Low[L1]); Print("L2=", L2, " Low[L2]=", Low[L2]); Print("TrendLineBreakUp=", TrendLineBreakUp); Print("TrendLineBreakDown=", TrendLineBreakDown); Print("Open[0]=", Open[0], " Open[1]=", Open[1]); */ // Fin de la prise de position, réinitialisation des variables pour un autre tour ArrayInitialize(highs, 0.0); ArrayInitialize(lows, 0.0); TrendLineBreakDown = False; isSelling = False; } else Print("Error opening Long order : ",GetLastError()); } } //-- Conditions de cloture // if(isClosing && !isSelling && !isBuying) // { // } // ArrayInitialize(highs, 0.0); // ArrayInitialize(lows, 0.0); // } // } //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains open time of each bar
Series array that contains close prices for each bar
Series array that contains open prices of each bar
Indicator Curves created:
Implements a curve of type DRAW_ARROW
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached
It Closes Orders by itself
Other Features:
It issuies visual alerts to the screen