TradeChannel_v3

Author: Copyright � 2005, George-on-Don
Price Data Components
Series array that contains close prices for each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategy
Indicators Used
Indicator of the average true range
Miscellaneous
It sends emails
0 Views
0 Downloads
0 Favorites
TradeChannel_v3
//+------------------------------------------------------------------+
//|                                                 TradeChannel.mq4 |
//|                                  Copyright © 2005, George-on-Don |
//|                                       http://www.forex.aaanet.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, George-on-Don"
#property link      "http://www.forex.aaanet.ru"

#include <stdlib.mqh>
#include <stderror.mqh>

#define MAGICMA  20050610

extern double    Lots=0.1;            // Ðàçìåð ëîòà
extern bool      SndMl=true;          // Ôëàã äëÿ îòïðàâêè èíôîðìàöèè íà å-ìàéë
extern bool      isFloatLots = true;  // Ôëàã äëÿ ðàñ÷åòà âåëè÷èíû ëîòà 
extern double    DcF = 3;             // Ôàêòîð îïòèìèçàöèè 
extern double    MaxR = 0.02;         // Ìàêñèìàëüíûé äîïóñòèìûé ðèñê
extern int       pATR=4;              // Ïåðèîä ÀÒÐ
extern int       rChannel = 20;       // ïåðèîä êàíàëà
extern double    Trailing = 30;

//--------- global variables
double Atr;
double Resist;
double ResistPrev;
double Support;
double SupportPrev;
double Pivot;
//------------------   

int CalculateCurrentOrders(string symbol)
  {
   int buys=0;
   int sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) 
         break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY)  
            buys++;
         if(OrderType()==OP_SELL) 
           sells++;
        }
     }
//---- return orders volume
      if(buys>0) 
         return(buys);
      else
        return(-sells);
  }

//+------------------------------------------------------------------+
//| Ðàñ÷åò îïòèìàëüíîé íà âçãëÿä àâòîðà âåëè÷èíû ëîòà                |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   if (isFloatLots == true)          // åñëè ôëàã true òî ïðîâîäèòñÿ îïòèìèçàöèÿ âåëè÷èíû ëîòà, èíà÷å ëîò íåèçìåíåí
     {  
     	int orders=HistoryTotal();  // history orders total
   	int losses=0;               // number of losses orders without a break
//---- select lot size
	   lot=NormalizeDouble(AccountFreeMargin()*MaxR/1000.0,1);
//---- calcuulate number of losses orders without a break
	   if(DcF>0)
     	  {  
      	for(int i=orders-1;i>=0;i--)
        	  {
	         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
	           { 
	           	Print("Îøèáêà â èñòîðèè!"); 
	           	break;
	           }
         	if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
         	  continue;
	         if(OrderProfit()>0) break;
         	if(OrderProfit()<0) losses++;
        	  }
      	if(losses>1) lot=NormalizeDouble(lot-lot*losses/DcF,1);
        }
     }  
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
  }

//-------------------------------------------------------------------+
// Âû÷èñëÿåì ïàðàìåòðû êàíàëà                                        |
//-------------------------------------------------------------------+
void defPcChannel() 
  {
   Resist=High[Highest(NULL,0,MODE_HIGH,rChannel,1)]; // up channel   
   ResistPrev=High[Highest(NULL,0,MODE_HIGH,rChannel,2)];   
   Support=Low[Lowest(NULL,0,MODE_LOW,rChannel,1)];
   SupportPrev=Low[Lowest(NULL,0,MODE_LOW,rChannel,2)];
   Pivot = (Resist+Support+Close[1])/3;
  }

//-------------------------------------------------------------------+
// Îïðåäåëÿåì âûïîëíÿþòñÿ ëè óñëîâèÿ äëÿ îòêðûòèÿ äëèííîé            |
// ïîçèöèè "íà îòáîé"                                                |
//-------------------------------------------------------------------+
bool isOpenBuy()
  {
// îïðåäåëÿåì ïàðàìåòðû êàíàëà
   defPcChannel() ;     
// óñëîâèÿ îòêðûòèÿ äëèííîé ïîçèöèè
   if ( High[1] >= Resist && Resist == ResistPrev) // êàñàíèå öåíîé âåðõíåíé ãðàíèöû êàíàëà è ôîðìèðîâàíèå êàíàëîì "ïîòîëêà" 
     return (true); 
   if ( Close [1] < Resist && Resist == ResistPrev && Close [1] > Pivot) // çàêðûòèå ñâå÷è â âåðõíåé ïîëîâèíå êàíàëà è ôîðìèðîâàíèå êàíàëîì "ïîòîëêà" 
     return(true); 

     return(false);
  }

//-------------------------------------------------------------------+
// Îïðåäåëÿåì âûïîëíÿþòñÿ ëè óñëîâèÿ äëÿ îòêðûòèÿ êîðîòêîé           |
// ïîçèöèè "íà îòáîé"                                                |
//-------------------------------------------------------------------+
bool isOpenSell()
  {
   defPcChannel();
   if (Low[1] <= Support && Support==SupportPrev ) // êàñàíèå öåíîé íèæíåé ãðàíèöû è ôîðìèðîâàíèå "ïîëà"
     return (true);

   if (Close [1] > Support && Support==SupportPrev && Close [1] < Pivot ) // çàêðûòèå ñâå÷è âíèæíåé îáëàñòè êàíàëà è ôîðìèðîâàíèå "ïîëà"
     return (true);

     return (false);
  }

//-------------------------------------------------------------------+
// Ïðîâåðÿåì âîçìîæíî ëè âîîáùå îòêðûòèå ïîçèöèé                     |
//-------------------------------------------------------------------+
void CheckForOpen()
  {
   int    res;
   string sHeaderLetter;
   string sBodyLetter;
//---- íà÷èíàåì òîðãîâëþ òîëüêî ñ ïåðâûì òèêîì íîâîãî áàðà
   if(Volume[0]>1) 
   return;
//---- 
   Atr = iATR(NULL,0,pATR,1);

//---- Óñëîâèå ïðîäàæè
   if (isOpenBuy() == True)
     {    
      Print("Lots = ",LotsOptimized());
      res=OrderSend(Symbol(),OP_SELL, LotsOptimized(),Bid,3, Resist+Atr,0,"",MAGICMA,0,Red);
       if (SndMl == True && res != -1) 
         {
         sHeaderLetter = "Operation SELL by " + Symbol()+"";
         sBodyLetter = "Order Sell by "+ Symbol() + " at " + DoubleToStr(Bid,4)+ ", and set stop/loss at " + DoubleToStr(Resist+Atr,4)+"";
         sndMessage(sHeaderLetter, sBodyLetter);
         }
      return;
     }

//---- Óñëîâèå ïîêóïêè
    if (isOpenSell() == true)
      {
       res=OrderSend(Symbol(),OP_BUY, LotsOptimized() ,Ask,3,Support-Atr,0,"order",MAGICMA,0,Blue);
       if ( SndMl == True && res != -1)
         { 
          sHeaderLetter = "Operation BUY at " + Symbol()+"";
          sBodyLetter = "Order Buy at "+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and set stop/loss at " + DoubleToStr(Support-Atr,4)+"";
          sndMessage(sHeaderLetter, sBodyLetter);
         }
       return;
      }
   return;    
  }  

//-------------------------------------------------------------------+
// Ïðîâåðÿì âîçìîæíîñòü è óñëîâèÿ äëÿ äëÿ çàêðûòèÿ ïîçèöèé           |
//-------------------------------------------------------------------+
bool isCloseSell()
  {
   defPcChannel();
   if (Low[1] <= Support && Support==SupportPrev ) // êàñàíèå öåíîé íèæíåé ãðàíèöû è ôîðìèðîâàíèå "ïîëà"
        return (true);
   return (false);
  }

bool isCloseBuy()
  {
   defPcChannel();
   
   if ( High[1] >= Resist && Resist == ResistPrev) // êàñàíèå öåíîé âåðõíåíé ãðàíèöû êàíàëà è ôîðìèðîâàíèå êàíàëîì "ïîòîëêà" 
     return (true); 

   return (false);
  }

void CheckForClose()
  {
   string sHeaderLetter;
   string sBodyLetter;
   bool CloseOrd;

   if(Volume[0]>1) return;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
        break;
      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol())
        continue;
      
//----  
      if(OrderType()==OP_BUY)
        {
         if (isCloseBuy() == true )        
           {
            CloseOrd=OrderClose(OrderTicket(),OrderLots(),Bid,3,Lime);
            if ( SndMl == True && CloseOrd == True)
              {
               sHeaderLetter = "Operation CLOSE BUY at" + Symbol()+"";
               sBodyLetter = "Close order Buy at "+ Symbol() + " for " + DoubleToStr(Bid,4)+ ", and finish this Trade";
               sndMessage(sHeaderLetter, sBodyLetter);
              }
            break;
           }                                            
         else 
           {
// ïðîâåðèì òðåéëèíã ñòîï 
            if(Trailing>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*Trailing)
                 {
                  if(OrderStopLoss()<Bid-Point*Trailing)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*Trailing,OrderTakeProfit(),0,Green);
                     return ;
                    }
                 }
              }
           }
        }
        
      if(OrderType()==OP_SELL)
        {
           
         if (isCloseSell() == true)       
           {
            CloseOrd=OrderClose(OrderTicket(),OrderLots(),Ask,3,Lime);
            if ( SndMl == True && CloseOrd == True) 
              {
               sHeaderLetter = "Operation CLOSE SELL at" + Symbol()+"";
               sBodyLetter = "Close order Sell at "+ Symbol() + " for " + DoubleToStr(Ask,4)+ ", and finish this Trade";
               sndMessage(sHeaderLetter, sBodyLetter);
              }
            break;
           }
         else 
           {
// ïðîâåðèì íà òðåéëèíã ñòîï 
            if(Trailing>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*Trailing))
                 {
                  if((OrderStopLoss()>(Ask+Point*Trailing)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*Trailing,OrderTakeProfit(),0,Red);
                     return;
                    }
                 }
              }
           }
        }
     }
  }  
//-------------------------------------------------------------------+
// Ôóíêöèÿ îòïðàâêè ñîáùåíèÿ îá îòêðûòèè èëè çàêðûòèè ïîçèöèè        |
//-------------------------------------------------------------------+
void sndMessage(string HeaderLetter, string BodyLetter)
  {
   int RetVal;
   SendMail( HeaderLetter, BodyLetter );
   RetVal = GetLastError();
   if (RetVal!= ERR_NO_MQLERROR) 
     Print ("Îøèáêà, ñîîáùåíèå íå îòïðàâëåíî: ", ErrorDescription(RetVal));
   return;      
  }

//+------------------------------------------------------------------+
//| Expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   if(Bars<25 || IsTradeAllowed()==false) 
     return (0);
   if (AccountFreeMargin()<(100*Point*Lots))
     {
      Print("Ñòîï! Íåäîñòàòî÷íî ñðåäñòâ äëÿ ïðîäîëæåíèÿ òîðãîâëè. Ñâîáîäíàÿ ìàðæà = ", AccountFreeMargin());
      return(0);  
     }
//---- calculate open orders by current symbol
   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
   else                                    CheckForClose();

   return(0);
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---