TradeChannel_v3_0

Author: Copyright � 2010, Korvin � Co.
Orders Execution
Checks for the total of open orders
Miscellaneous
It plays sound alertsIt issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
TradeChannel_v3_0
//+--------------------------------------------------------------------------------------+
//|                                                                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