//+------------------------------------------------------------------+
//|                                                TradeChannell.mq4 |
//|                                   Copyright © 2010, Korvin ® Co. |
//|                                         http://alecask.narod.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Korvin® Co."
#property link      "http://alecask.narod.ru/"
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|--------------- Ñîâåòíèê "Òîðãîâëÿ â êàíàëå" ---------------------|
//| Òîðãîâëÿ  ïðîèñõîäèò  â  êàíàëå,  êîòîðîìó  ïðè  ñîçäàíèè  íóæíî |
//| ïðèñâîèòü èìÿ: "TradeCannel".                                    |
//| Îñíîâíàÿ  ëèíèÿ  íèñõîäÿùåãî  êàíàëà  ïðîâîäèòñÿ  ïî  íèñõîäÿùèì |
//| ìàêñèìóìàì è îïðåäåëÿåò óðîâåíü îòêðûòèÿ êîðîòêèõ ïîçèöèé.       |
//| Âñïîìîãàòåëüíàÿ ëèíèÿ  íèñõîäÿùåãî  êàíàëà ïðîâîäèòñÿ íèæå ëèíèè |
//| îòêðûòèÿ îðäåðîâ è îïðåäåëÿåò óðîâåíü çàêðûòèÿ êîðîòêèõ ïîçèöèé. |
//| Îñíîâíàÿ  ëèíèÿ  âîñõîäÿùåãî  êàíàëà  ïðîâîäèòñÿ  ïî  âîñõîäÿùèì |
//| ìèíèìóìàì è îïðåäåëÿåò óðîâåíü îòêðûòèÿ äëèíûõ ïîçèöèé.          |
//| Âñïîìîãàòåëüíàÿ ëèíèÿ  âîñõîäÿùåãî  êàíàëà ïðîâîäèòñÿ âûøå ëèíèè |
//| îòêðûòèÿ îðäåðîâ è îïðåäåëÿåò óðîâåíü çàêðûòèÿ äëèíûõ ïîçèöèé.   |
//| Êàêèå èìåííî îðäåðà  îòêðûâàòü  ñîâåòíèê  îïðåäåëÿåò  ïî íàêëîíó |
//| êàíàëà. Îäíîâðåìåííî îòêðûâàåòñÿ ÒÎËÜÊÎ ÎÄÈÍ îðäåð.              |
//| Ïàðàìåòð Delta îïðåäåëÿåò ðàññòîÿíèå â ïóíêòàõ äî ëèíèè îòêðûòèÿ |
//| è ëèíèè çàêðûòèÿ  îðäåðîâ èçíóòðè êàíàëà.  Ïðè  îòêðûòèè  îðäåðà |
//| öåíà  Bid  äîëæíà íàõîäèòüñÿ â ïðåäåëàõ   [opr±Delta ; opr]; ïðè |
//| çàêðûòèè  îðäåðà  öåíà   Bid   äîëæíà  áûòü  áîëüøå  èëè  ìåíüøå |
//| [cpr±Delta] â çàâèñèìîñòè îò òèïà îðäåðà è íàïðàâëåíèÿ òîðãîâîãî |
//| êàíàëà, ãäå:                                                     |
//| opr - ðàññ÷èòàííîå  çíà÷åíèå  ëèíèè  îòêðûòèÿ îðäåðà  íà òåêóùåì |
//|       áàðå;                                                      |
//| cpr - ðàññ÷èòàííîå  çíà÷åíèå  ëèíèè  çàêðûòèÿ îðäåðà  íà òåêóùåì |
//|       áàðå;                                                      |
//| Ïàðàìåòð StopLoss âûñòàâëÿåòñÿ íà ñëó÷àé ïðîáîÿ êàíàëà âðó÷íóþ.  |
//| Ïàðàìåòð TakeProfit âûñòàâëÿåòñÿ â 50 ïóíêòàõ îò ëèíèè çàêðûòèÿ. |
//|          àâòîìàòè÷åñêè.                                          |
//| Ïàðàìåòð   Risk   îïðåäåëÿåò ìàêñèìàëüíûé  ðèñê  ïðè îòêðûâàåìîé |
//| ñäåëêå è ñëóæèò äëÿ ðàññ÷¸òà ìàêñèìàëüíîãî ëîòà. Äëÿ îòîáðàæåíèÿ |
//| ðåàëüíîãî  ðàññ÷èòàííîãî  ðèñêà  ñäåëêè  çàäàéòå  çíà÷åíèå  true |
//| ïàðàìåòðó ShowRisk.                                              |
//| Ïàðàìåòð PoTrendu îïðåäåëÿåò íàïðàâëåíèå òîðãîâëè  ÏÎ èëè ÏÐÎÒÈÂ |
//| íàïðàâëåíèÿ òðåíäà,  îïðåäåëÿåìîãî  ýêñïåðòîì  ñàìîñòîÿòåëüíî ïî |
//| íàêëîíó êàíàëà  è  ïî âçàèìíîìó  ðàñïîëîæåíèþ  ëèíèé  îòêðûòèÿ è |
//| çàêðûòèÿ òîðãîâûõ îðäåðîâ.                                       |
//| Îòêðûòèå  è  çàêðûòèå  îðäåðîâ   ìîæåò  ñîïðîâîæäàòüñÿ  çâóêîâûì |
//| ñèãíàëîì, åñëè  Âû  çàäàäèòå çíà÷åíèå  true  ïàðàìåòðó SoundOn è |
//| çàãðóçèòå çâóêîâûå ôàéëû  OrderSellOpen.wav , OrderBuyOpen.wav , |
//| è OrderClose.wav â ïàïêó: ÊÀÒÀËÎÃ ÒÅÐÌÈÍÀËÀ/sounds/....          |
//| Çíà÷åíèÿ âíåøíèõ ïåðåìåííûõ ïî óìîë÷àíèþ  ïðåäíàçíà÷åíû äëÿ ïàðû |
//| òèïà EURUSD; äëÿ òàêèõ ïàð, êàê XAUUSD èëè USDJPY ïðîùå èçìåíèòü |
//| çíà÷åíèÿ ïàðàìåòðîâ â êîäå è ïåðåêîìïèëèðîâàòü ñîâåòíèêà.        |
//|--------------------- Ïîïóòíîãî Âàì òðåíäà -----------------------|
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                     Channell.mq4 |
//|                                   Copyright © 2010, Korvin ® Co. |
//|                                         http://alecask.narod.ru/ |
//+------------------------------------------------------------------+
extern int    MaxRisk=2;         // Çàäàâàåìûé ìàêñèìàëüíûé ðèñê
extern bool   ShowRisk=true;     // Ïîêàçàòü ðåàëüíûé ðèñê
extern bool   PoTrendu=true;     // Òîðãîâàòü ïî òðåíäó?
extern int    StopLoss=50;       // Óñòàíîâèòü StopLoss
extern int    Delta=5;           // Øèðèíà çîíû ñðàáàòûâàíèÿ
extern int    DeltaFactor=2;     // Ðàñøèðåíèå çîíû çàêðûòèÿ îðäåðîâ
extern bool   SoundOn=true;      // Âêëþ÷èòü çâóê?
       int    tic = 0;           // Íîìåð îòêðûòîãî îðäåðà
       int    TakeProfit;
//+------------------------------------------------------------------+
//| ############### Áëîê èíèöèàëèçàöèè ïåðåìåííûõ ################## |
//+------------------------------------------------------------------+
int init() {Comment("");return(0);}
//+------------------------------------------------------------------+
//| ############### Áëîê äåèíèöèàëèçàöèè ïåðåìåííûõ ################ |
//+------------------------------------------------------------------+
int deinit() {Comment("");return(0);} // Î÷èñòêà òåðìèíàëà
//+------------------------------------------------------------------+
//| ############# Îñíîâíàÿ ôóíêöèÿ îáðàáîòêè ñîáûòèé ############### |
//+------------------------------------------------------------------+
int start()
  {
//+------------------------------------------------------------------+
//|                                   Ðóòèííûå ïðîâåðêè              |
//+------------------------------------------------------------------+
if(DayOfWeek()==0 || DayOfWeek()==6) return(0); // â âûõîäíûå
                                                // íå ðàáîòàåì
if(!IsTradeAllowed()) return(0);                // ïðîïóñòèì òèê åñëè
                                                // òåðìèíàë çàíÿò
//+------------------------------------------------------------------+
//|                                   Áëîê ñáîðà è îðàáîòêè äàííûõ   |
//+------------------------------------------------------------------+
string tRend=""; string Spaces="\n                          ";
string name="TradeChannel"; string str1; string str2; string str3;
RefreshRates();
//ïðîâåðèì ÷òî òîðãîâûé êàíàë íàðèñîâàí ïðàâèëüíî (ïî äâèæåíèþ öåíû)
 datetime t1=ObjectGet(name,OBJPROP_TIME1);
 datetime t2=ObjectGet(name,OBJPROP_TIME2);
 datetime t3=ObjectGet(name,OBJPROP_TIME3);
int err=GetLastError();
 if (err==4202) {Comment(err,"  Íàðèñóéòå òîðãîâûé êàíàë è äàéòå åìó èìÿ \"TradeChannel\"."); return;}
 if(t1>t2)
   {Comment("Íåïðàâèëüíî íàðèñîâàí òîðãîâûé êàíàë!");
    return(0);}
//ïðîäîëæèì ëèíèè êàíàëà (ñâîéñòâî ëó÷)
 ObjectSet(name,OBJPROP_RAY,true);
//îïðåäåëèì òðåíä (ââåðõ èëè âíèç)
 bool trend=false;
 double p1=ObjectGet(name,OBJPROP_PRICE1);
 double p2=ObjectGet(name,OBJPROP_PRICE2);
 double p3=ObjectGet(name,OBJPROP_PRICE3);
if(p1<p2) trend=true;
 if(trend) tRend=" Âîñõîäÿùèé ";
 else tRend=" Íèñõîäÿùèé ";
Comment(p1,"   ",p2,"   ",tRend);
double opr=ObjectGetValueByShift(name,0);// îïðåäåëèì òåêóùåå çíà÷åíèå
                                         // ëèíèè îòêðûòèÿ îðäåðîâ opr,
// íàéä¸ì òåêóùåå çíà÷åíèå ëèíèè çàêðûòèÿ îðäåðîâ cpr,
  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
// ðàññ÷¸ò êîýôôèöèåíòîâ óðàâíåíèÿ ëèíèè îòêðûòèÿ îðäåðîâ
  double A=p2-p1; double B=s1-s2; double C=s2*p1-s1*p2;
// ðàññ÷¸ò ðàññòîÿíèÿ ìåæäó ëèíèÿìè ïîêóïêè è ïðîäàæè
  double d=(A*s3+B*p3+C)/MathSqrt(MathPow(A,2.0)+MathPow(B,2.0))/MathCos(MathArctan(A/B));
  double cpr=opr+d; // òåêóùåå çíà÷åíèå öåíû ïðîäàæè
  int    TakeProfit=d/Point+50;
//---------------------------------- áëîê ðàññ÷¸òà ðåàëüíîãî ðèñêà ---
double Free =AccountFreeMargin();
double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
double Lot =MathFloor(Free*MaxRisk/100/One_Lot/Step)*Step;
if(Lot<Min_Lot) Lot=Min_Lot;
if(Lot>Max_Lot) Lot=Max_Lot;
double MyRisk = MathFloor(Lot*10000*One_Lot/Free)/100;
//------------------------- áëîê ôîðìèðîâàíèÿ ñëóæåáíîé èíôîðìàöèè ---
    if (tic>0) str1="\n\x95 Îòêðûò îðäåð ¹ "+tic;
    else str1="";
    if (ShowRisk) str2="\n\x95 Ìàêñèìàëüíûé ðèñê: "+DoubleToStr(MyRisk,2)+" %";
    else str2="";
    if (PoTrendu) str3="\n\x95 Ðåæèì ðàáîòû: ïî òðåíäó";
    else str3="\n\x95 Ðåæèì ðàáîòû: ïðîòèâ òðåíäà";
    if (MathAbs(d/Point)<=15) Comment("Name=",name,"  Ñëèøêîì óçêèé êàíàë äëÿ òîðãîâëè, âñåãî ",
                                      DoubleToStr(d/Point,0)," ïóíêòîâ.");
      Comment("\n\x97 ",tRend,"\"",name,"\" \x97",str1,str2,
              " \n\x95 Øèðèíà êàíàëà ",MathRound(d/Point)," ïóíêòîâ,\n\x97 Òåêóùèå: \x97\n\x95 Öåíà îòêðûòèÿ îðäåðîâ: ",
              DoubleToStr(opr,5),"\n\x95 Öåíà çàêðûòèÿ îðäåðîâ: ",DoubleToStr(cpr,5),
              "\n\x97 Áóäóùèå: \x97\n\x95 Stop Loss: ",DoubleToStr((opr-StopLoss*Point),5),
              "\n\x95 Take Profit: ",DoubleToStr((opr+TakeProfit*Point),5));
//+------------------------------------------------------------------+
//ïîäñ÷èòàåì êîë-âî îðäåðîâ
 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,sl=0;
        Lot=GetLot(MaxRisk);
 if(tic>0 && Lot!=0 && Bid<=cpr && Bid>=cpr-DeltaFactor*Delta*Point) {
     CloseOrder(tic); tic=0; PlaySound("OrderClose.wav"); Sleep(5000);}
//+------------------------------------------------------------------+
//|                                   Áëîê îòêðûòèÿ îðäåðîâ          |
//+------------------------------------------------------------------+
//åñëè íåò îðäåðîâ è öåíà ïîäîøëà ê ëèíèè îòêðûòèÿ - îòêðîåì îðäåð
tp=0;
sl=0;
Lot=GetLot(MaxRisk);
 if(Lot==0.0) {Alert("Íåäîñòàòî÷íî ñðåäñòâ!");return(0);}
 //+----------------------------------------------------- ÏÎÊÓÏÊÀ ---+
if((oBuy+oSell==0 && trend && PoTrendu && Bid>=opr && Bid<=opr+Delta*Point)||
  (oBuy+oSell==0 && !trend && !PoTrendu && Bid>=opr && Bid<=opr+Delta*Point))
   {if(TakeProfit>0) tp=Ask+TakeProfit*Point;
    if(StopLoss>0) sl=Ask-StopLoss*Point;
    tic=NewOrder(OP_BUY,Lot,Ask,tp,sl);
        if (SoundOn&&tic>0) PlaySound("OrderBuyOpen.wav"); Sleep(5000);
   }
 //+----------------------------------------------------- ÏÐÎÄÀÆÀ ---+
if((oBuy+oSell==0 && !trend && PoTrendu && Ask<=opr && Ask>=opr-Delta*Point)||
  (oBuy+oSell==0 && trend && !PoTrendu && Ask<=opr && Ask>=opr-Delta*Point))
   {if(TakeProfit>0) tp=Bid-TakeProfit*Point;
    if(StopLoss>0) sl=Bid+StopLoss*Point;
    tic=NewOrder(OP_SELL,Lot,Bid,tp,sl);
       if (SoundOn&&tic>0) PlaySound("OrderSellOpen.wav"); Sleep(5000);
   }
//==================================================== êîíåö áëîêà ==
   return(0);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| ################# Áëîê ïîäïðîãðàìì ïîëüçîâàòåëÿ ################ |
//+------------------------------------------------------------------+
double GetLot(int Risk)
{double Free    =AccountFreeMargin();
 double One_Lot =MarketInfo(Symbol(),MODE_MARGINREQUIRED);
 double Min_Lot =MarketInfo(Symbol(),MODE_MINLOT);
 double Max_Lot =MarketInfo(Symbol(),MODE_MAXLOT);
 double Step    =MarketInfo(Symbol(),MODE_LOTSTEP);
 double Lot     =MathFloor(Free*Risk/100/One_Lot/Step)*Step;
 if(Lot<Min_Lot) Lot=Min_Lot;
 if(Lot>Max_Lot) Lot=Max_Lot;
 if(Lot*One_Lot>Free) return(0.0);
return(Lot);}
//+------------------------------------------------------------------+
int NewOrder(int Cmd,double Lot,double PR=0,double TP=0,double SL=0)
{while(!IsTradeAllowed()) Sleep(100);
 if(Cmd==OP_BUY)
   {PR=NormalizeDouble(Ask,Digits);
    if(TP==0 && TakeProfit>0) TP=PR+TakeProfit*Point;
    if(SL==0 && StopLoss>0) SL=PR-StopLoss*Point;}
 if(Cmd==OP_SELL)
   {PR=NormalizeDouble(Bid,Digits);
    if(TP==0 && TakeProfit>0) TP=PR-TakeProfit*Point;
    if(SL==0 && StopLoss>0) SL=PR+StopLoss*Point;}
 int tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0,0,CLR_NONE);
 if(tic<0) Print("Îøèáêà îòêðûòèÿ îðäåðà: ",GetLastError());
return(tic);}
//+------------------------------------------------------------------+
void CloseOrder(int tic)
{double PR=0;
 while(!IsTradeAllowed()) Sleep(100);
 if(OrderType()==OP_BUY)  PR=NormalizeDouble(Bid,Digits);
 if(OrderType()==OP_SELL) PR=NormalizeDouble(Ask,Digits);
 if(OrderSelect(tic,SELECT_BY_TICKET))
   if(!OrderClose(OrderTicket(),OrderLots(),PR,3,CLR_NONE))
     Print("Îøèáêà çàêðûòèÿ îðäåðà: ",GetLastError());
return;}
//+------------------------------------------------------------------+
             
            
            
            
Comments