//+--------------------------------------------------------------------------------------+
//| TradeChannel_v3_0.mq4 |
//| Copyright © 2010, Korvin ® Co. |
//| http://alecask.narod.ru/ |
//+--------------------------------------------------------------------------------------+
#property copyright "Copyright © 2010, Korvin ® Co."
#property link "http://alecask.narod.ru/"
#include <mylib.mqh>
extern bool expert = false;
extern int MaxRisk = 2;
extern int STOPLOSS = 50;
extern int TAKEPROFIT = 50;
extern int DELTA = 50;
extern double FACTOR = 1.0;
extern int align = 230;
extern bool SoundOn = false;
int swap,tic;
bool buy,sell;
//+--------------------------------------------------------------------------------------+
//| expert initialization function |
//+--------------------------------------------------------------------------------------+
int init() {
RefreshRates();
swap = MathRound((Ask-Bid)/Point); // Îïðåäåëèì ïðîñêàëüçûâàíèå íà ãðàôèêå
tic=0;
buy=false;
sell=false;
return(0);}
//+--------------------------------------------------------------------------------------+
//| expert deinitialization function |
//+--------------------------------------------------------------------------------------+
int deinit() {return(0);}
//+--------------------------------------------------------------------------------------+
//| expert start function |
//+--------------------------------------------------------------------------------------+
int start() {
Comment(""); // Î÷èñòèì ýêðàí îò ïðåäûäóùèõ íàäïèñåé
// Î÷èñòèì ýêðàí îò îáúåêòîâ, íàðèñîâàííûõ â ïðîøëîì òèêå:
ObjectDelete("LineMiddle");
ObjectDelete("LineRealOpen");
ObjectDelete("LineRealClose");
ObjectDelete("LineStopLoss");
ObjectDelete("LineTakeProfit");
//ObjectDelete("");
// Åñëè íå ïðîéäåí îáùèé êîíòðîëü - çàïðåòèì òîðãîâëþ.
if (!RutineCheck()) {Comment (Span(200),"Òîðãîâëÿ çàïðåùåíà"); return(0);}
// Íàðèñîâàí ëè êàíàë "TradeChannel" ...?
//------------------ Ñ Ò Ð Î Ê Î Â Û Å Ï Å Ð Å Ì Å Í Í Û Å -----------------------------
string name="TradeChannel"; string msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8;
//----------------------------------------------------------------------------------------
RefreshRates(); // Îáíîâèì äàííûå è ñäåëàåì çàïðîñû ïî èìåíè "TradeCannel"
datetime t1=ObjectGet(name,OBJPROP_TIME1);
datetime t2=ObjectGet(name,OBJPROP_TIME2);
datetime t3=ObjectGet(name,OBJPROP_TIME3);
double p1=ObjectGet(name,OBJPROP_PRICE1);
double p2=ObjectGet(name,OBJPROP_PRICE2);
double p3=ObjectGet(name,OBJPROP_PRICE3);
int control=0; // êîíòðîëüíàÿ öèôðà
int s1 = iBarShift( NULL, 0, t1, control); // ñìåùåíèå áàðà öåíû p1
int s2 = iBarShift( NULL, 0, t2, control); // ñìåùåíèå áàðà öåíû p2
int s3 = iBarShift( NULL, 0, t3, control); // ñìåùåíèå áàðà öåíû p3
//---------------- Í À Ð È Ñ Ó Å Ì Ò Î Ð Ã Î Â Û É Ê À Í À Ë -------------------------
// Åñëè êàíàëà íåò, ïîïðîñèì åãî íàðèñîâàòü
int err=GetLastError();
if (err==4202) {Comment(Span(187)," Íàðèñóéòå òîðãîâûé êàíàë è äàéòå åìó èìÿ \"TradeChannel\"."); return;}
//ïðîâåðèì ÷òî òîðãîâûé êàíàë íàðèñîâàí ïðàâèëüíî (ñëåâà-íàïðàâî)
if(t1>t2) {Comment(Span(219),"Ðàñïîëîæèòå \"",name,"\" ïðàâèëüíî!"); return(0);}
//Åñëè êàíàë íàðèñîâàí âåðíî - ïðîäîëæèì ëèíèè êàíàëà (ñâîéñòâî ëó÷)
ObjectSet(name,OBJPROP_RAY,true);
//-------------------- Ø È Ð È Í À Ò Î Ð Ã Î Â Î Ã Î Ê À Í À Ë À --------------------+
double d = (p3-p1) - (p2-p1)*(s1-s3)/(s1-s2); // |
//--------------- Ç Í À Ê Ø È Ð È Í Û Ò Î Ð Ã Î Â Î Ã Î Ê À Í À Ë À ---------------+
int sign = MathRound(d/MathAbs(d));// |
//+--------------------------------------------------------------------------------------+
// Åñëè êàíàë âîñõîäÿùèé - îí çåë¸íûé, åñëè íèñõîäÿùèé - êðàñíûé.
if (p1<=p2) ObjectSet(name,OBJPROP_COLOR,Green);
else ObjectSet(name,OBJPROP_COLOR,Red);
//---------- Í À Ð È Ñ Ó Å Ì Ñ Ð Å Ä Í Þ Þ Ë È Í È Þ Ê À Í À Ë À -------------------
double plm1=p1+d*0.5; double plm2=p2+d*0.5; // Ïàðàìåòðû öåíû äëÿ ðèñîâàíèÿ ñðåäíåé ëèíèè
ObjectCreate("LineMiddle",OBJ_TREND,0,t1,plm1,t2,plm2);
ObjectSet("LineMiddle",OBJPROP_STYLE,STYLE_DASHDOT);
ObjectSet("LineMiddle",OBJPROP_WIDTH,1);
ObjectSet("LineMiddle",OBJPROP_COLOR,Goldenrod);
//--------------- Ò Å Ê Ó Ù Å Å Ç Í À × Å Í È Å Ëèíèè îòêðûòèÿ îðäåðîâ ----------------+
double LineOpen = ObjectGetValueByShift(name,0);
//--------------- Ò Å Ê Ó Ù Å Å Ç Í À × Å Í È Å Ëèíèè çàêðûòèÿ îðäåðîâ ----------------+
double LineClose = LineOpen+d;
//--------------- Ò Å Ê Ó Ù Å Å Ç Í À × Å Í È Å Ñðåäíåé ëèíèè -------------------------+
double LineMiddle = ObjectGetValueByShift("LineMiddle",0);
//------------- Î Ï Ð Å Ä Å Ë È Ì Í À Ï Ð À Â Ë Å Í È Å Ò Î Ð Ã Î Â Ë È --------------
bool trend, potrendu;
if (p2>=p1) {trend=true; msg3=" ÂÎÑÕÎÄßÙÈÉ ";} // òðåíä âîñõîäÿùèé ...
else {trend=false; msg3=" ÍÈÑÕÎÄßÙÈÉ ";} // èëè íèñõîäÿùèé ?
if ((trend && sign>=0)||
(!trend && sign<0)) {potrendu=true; msg4=" ÏÎ ÒÐÅÍÄÓ ";} // òîðãîâëÿ ïî òðåíäó ...
else {potrendu=false; msg4=" ÏÐÎÒÈÂ ÒÐÅÍÄÀ ";} // èëè ïðîòèâ òðåíäà ?
//------- Ï Î Ê À Æ Å Ì Ã Ä Å Á Ó Ä Ó Ò Î Ò Ê Ð Û Â À Ò Ü Ñ ß Î Ð Ä Å Ð À --------
double zona1;
if (d<0) zona1 = sign*DELTA*Point;
else zona1 = sign*(DELTA+swap)*Point;
double lro1=p1+zona1; double lro2=p2+zona1; // Ïàðàìåòðû öåíû äëÿ
ObjectCreate("LineRealOpen",OBJ_TREND,0,t1,lro1,t2,lro2);
ObjectSet("LineRealOpen",OBJPROP_STYLE,STYLE_DASH);
ObjectSet("LineRealOpen",OBJPROP_WIDTH,1);
if ((trend && potrendu)||(!trend && !potrendu)) ObjectSet("LineRealOpen",OBJPROP_COLOR,Lime);
else ObjectSet("LineRealOpen",OBJPROP_COLOR,DeepPink);
double LineRealOpen = ObjectGetValueByShift("LineRealOpen",0); // òåêóùåå çíà÷åíèå ëèíèè
//------- Ï Î Ê À Æ Å Ì Ã Ä Å Á Ó Ä Ó Ò Ç À Ê Ð Û Â À Ò Ü Ñ ß Î Ð Ä Å Ð À --------
if (d<0) zona1 = sign*(DELTA+swap)*Point;
else zona1 = sign*DELTA*Point;
double lrc1=p1+d-zona1; double lrc2=p2+d-zona1; // Ïàðàìåòðû öåíû äëÿ
ObjectCreate("LineRealClose",OBJ_TREND,0,t1,lrc1,t2,lrc2);
ObjectSet("LineRealClose",OBJPROP_STYLE,STYLE_DASH);
ObjectSet("LineRealClose",OBJPROP_WIDTH,1);
if ((trend && potrendu)||(!trend && !potrendu)) ObjectSet("LineRealClose",OBJPROP_COLOR,DeepPink);
else ObjectSet("LineRealClose",OBJPROP_COLOR,Lime);
double LineRealClose = ObjectGetValueByShift("LineRealClose",0); // òåêóùåå çíà÷åíèå ëèíèè
//-------------- Í À É Ä Å Ì Ð Å À Ë Ü Í Ó Þ Ø È Ð È Í Ó Ê À Í À Ë À ---------------
int realwidth = sign*MathRound((LineRealClose-LineRealOpen)/Point); // Çàêîí÷èì, åñëè
if (realwidth<=0) {Comment("\n",Span(align)," ÊÀÍÀË ÑËÈØÊÎÌ ÓÇÎÊ"); return(0);}// óçêèé êàíàë
//---- Ï Î Ê À Æ Å Ì Ã Ä Å Á Ó Ä Å Ò Ó Ñ Ò À Í À Â Ë È Â À Ò Ü Ñ ß STOP_LOSS -----
// Ïàðàìåòðû öåíû äëÿ ðèñîâàíèÿ LineStopLoss
double lsl1=p1-sign*STOPLOSS*Point; double lsl2=p2-sign*STOPLOSS*Point;
ObjectCreate("LineStopLoss",OBJ_TREND,0,t1,lsl1,t2,lsl2);
ObjectSet("LineStopLoss",OBJPROP_STYLE,STYLE_DOT);
ObjectSet("LineStopLoss",OBJPROP_WIDTH,1);
ObjectSet("LineStopLoss",OBJPROP_COLOR,DeepPink);
double LineStopLoss = ObjectGetValueByShift("LineStopLoss",0); // òåêóùåå çíà÷åíèå ëèíèè
//--- Ï Î Ê À Æ Å Ì Ã Ä Å Á Ó Ä Å Ò Ó Ñ Ò À Í À Â Ë È Â À Ò Ü Ñ ß TAKE_PROFIT ----
// Ïàðàìåòðû öåíû äëÿ ðèñîâàíèÿ LineTakeProfit
double ltp1=p1+d+sign*TAKEPROFIT*Point; double ltp2=p2+d+sign*TAKEPROFIT*Point;
ObjectCreate("LineTakeProfit",OBJ_TREND,0,t1,ltp1,t2,ltp2);
ObjectSet("LineTakeProfit",OBJPROP_STYLE,STYLE_DOT);
ObjectSet("LineTakeProfit",OBJPROP_WIDTH,1);
ObjectSet("LineTakeProfit",OBJPROP_COLOR,DodgerBlue);
double LineTakeProfit = ObjectGetValueByShift("LineTakeProfit",0); // òåêóùåå çíà÷åíèå ëèíèè
//------------------------- Á Ë Î Ê Â Û Â Î Ä À Ò Å Ê Ñ Ò À -------------------------
if (!expert) {msg1="*** ÈÍÄÈÊÀÒÎÐ ***";}
else {msg1="**** ÝÊÑÏÅÐÒ ****";}
if (!expert) msg5="\n"+Span(align)+"Ëèíèÿ îòêðûòèÿ: "+DoubleToStr(LineOpen,Digits)+
"\n"+Span(align)+"Ëèíèÿ çàêðûòèÿ: "+DoubleToStr(LineClose,Digits);
else {
if (tic==0) {msg5="\n"+Span(align)+"Öåíà îòêðûòèÿ: "+DoubleToStr(LineOpen,Digits)+
"\n"+Span(align)+"Öåíà çàêðûòèÿ: "+DoubleToStr(LineClose,Digits);
msg6="";}
else {msg5="\n"+Span(align)+"Öåíà çàêðûòèÿ: "+DoubleToStr(LineClose,Digits);
msg6="\n"+Span(align)+"Îðäåð: "+tic;}
}
Comment("\n",Span(align),msg1,
"\n",Span(align),msg3," ÊÀÍÀË",
"\n",Span(align),"Òîðãîâëÿ: ",msg4,
"\n",Span(align),"Øèðèíà êàíàëà: ",MathAbs(MathRound(d/Point))," / ",realwidth,
msg5,
"\n",Span(align),"Ñðåäíÿÿ ëèíèÿ: ",DoubleToStr(LineMiddle,Digits),
"\n",Span(align),"Óðîâåíü SL: ",DoubleToStr(LineStopLoss,Digits),
"\n",Span(align),"Óðîâåíü TP: ",DoubleToStr(LineTakeProfit,Digits)
// "\n",Span(align),"",
);
if (!expert) return(0); // äëÿ ðåæèìà ÈÍÄÈÊÀÒÎÐ íè÷åãî áîëüøå íå íàäî, ÓÕÎÄÈÌ
//----- Â Ñ ¨ Í È Æ Å Ñ Ë Å Ä Ó Þ Ù Å Å - Ä Ë ß Ð Å Æ È Ì À "Ý Ê Ñ Ï Å Ð Ò" ------
//+------------------------------------------------------------------+
//| Áëîê óïðàâëåíèÿ îðäåðàìè |
//+------------------------------------------------------------------+
//ïîäñ÷èòàåì êîë-âî îòêðûòûõ îðäåðîâ
int oBuy=0,oSell=0;
for(int i=OrdersTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if(OrderSymbol()==Symbol())
{if(OrderType()==OP_BUY) oBuy++;
if(OrderType()==OP_SELL) oSell++;}
if(oBuy+oSell==0) tic=0;
//åñëè åñòü îðäåðà è öåíà ïîäîøëà ê ëèíèè çàêðûòèÿ - çàêðîåì îðäåð
double tp=0.0;
double sl=0.0;
double Lot=GetLot(MaxRisk);
if (tic>0 && Lot!=0 && buy && Bid>=LineClose-DELTA*Point && Bid<=LineClose) {
CloseOrder(tic); tic=0; PlaySound("OrderClose.wav"); Sleep(500);}
if (tic>0 && Lot!=0 && sell && Bid<=LineClose+DELTA*Point && Bid>=LineClose) {
CloseOrder(tic); tic=0; PlaySound("OrderClose.wav"); Sleep(500);}
//åñëè íåò îðäåðîâ è öåíà ïîäîøëà ê ëèíèè îòêðûòèÿ - îòêðîåì îðäåð
tp=0;
sl=0;
Lot=GetLot(MaxRisk);
if(Lot==0.0) {Alert("Íåäîñòàòî÷íî ñðåäñòâ!");return(0);}
//+----------------------------------------------------- ÏÎÊÓÏÊÀ ---+
// åñëè íåò îòêðûòûõ îðäåðîâ è öåíà â çîíå îòêðûòèÿ
if (tic==0 && Bid>=LineOpen && Bid<=LineOpen+DELTA*Point)
{if(TAKEPROFIT!=0) tp=LineTakeProfit;
if(STOPLOSS>0) sl=LineStopLoss;
tic=NewOrder(OP_BUY,Lot,Ask,tp,sl); buy = true;
if (SoundOn&&tic>0) PlaySound("OrderBuyOpen.wav"); Sleep(500);
}
//+----------------------------------------------------- ÏÐÎÄÀÆÀ ---+
// åñëè íåò îòêðûòûõ îðäåðîâ è öåíà â çîíå îòêðûòèÿ
if (tic==0 && Bid<=LineOpen && Bid>=LineOpen-DELTA*Point)
{if(TAKEPROFIT!=0) tp=LineTakeProfit;
if(STOPLOSS>0) sl=LineStopLoss;
tic=NewOrder(OP_SELL,Lot,Bid,tp,sl); sell = true;
if (SoundOn&&tic>0) PlaySound("OrderSellOpen.wav"); Sleep(500);
}
//+------------------------------------------- È Ç Ì Å Í Å Í È Å ---+
// ïåðåñòàâèì StopLoss íà áåçóáûòîê, åñëè öåíà íà ïåðåñåêëà ñðåäíþþ ëèíèþ:
if (tic!=0 && ((buy && Bid>=LineMiddle && sl<(OrderStopLoss()-DELTA*Point))||(sell && Bid<=LineMiddle && sl<(OrderStopLoss()+DELTA*Point)))) {
OrderSelect(tic,SELECT_BY_TICKET,MODE_TRADES);
sl=LineRealOpen; tp=LineTakeProfit; EditOrder(tic,sl,tp); PlaySound("StopLoss.wav"); Sleep(500);
}
//+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
// ïåðåñòàâèì TakeProfit, åñëè åãî çíà÷åíèå èçìåíèëîñü íà 2*DETLA ïóíêòîâ
if (tic!=0 && ((buy && (LineTakeProfit>=OrderTakeProfit()+2*DELTA*Point))||(sell && (LineTakeProfit<=OrderTakeProfit()-2*DELTA*Point)))) {
OrderSelect(tic,SELECT_BY_TICKET,MODE_TRADES);
sl=0; tp=LineTakeProfit; EditOrder(tic,sl,tp); Sleep(500);
}
//+--------------------------------------------------------------------------------------+
//+--------------------------------------------------------------------------------------+
return(0);}// Ê Î Í Å Ö Ð À Á Î Ò Û
//+--------------------------------------------------------------------------------------+
Comments