cm_EA_PairTrading

Author: Copyright © 2019, Khlistov Vladimir
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open ordersIt Closes Orders by itself
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
cm_EA_PairTrading
ÿþ//+------------------------------------------------------------------+

//| !:@8?B, 2KAB02;O5B 2 >@45@0 ?> 2< 20;NB0< >4=>2@5<5==> HEDGE.mq4 |

//|                              Copyright © 2012, Khlistov Vladimir |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2019, Khlistov Vladimir"

#property link      "cmillion@narod.ru"

#property version   "1.00"

#property strict

#property description "!>25B=8: >B:@K205B ?>78F88 ?> 42C< ?0@0< C:070==K< 2 ?0=5;8. "0:65 2 ?0=5;8 <>6=> 2K1@0BL @07<5@ ;>B0. ?@02>9 G0AB8 ?0=5;8 >B>1@0605BAO AC<<0@=0O ?@81K;L ?> 2A5< >B:@KBK< ?>78F8O<. @8 =060B88 =0 :=>?:C CLOSE 2A5 ?>78F88 70:@K20NBAO."

//+------------------------------------------------------------------+

extern string  SYMBOL1        = "GBPUSD"; //?5@2K9 A8<2>;

extern string  SYMBOL2        = "EURUSD"; //2B>@>9 A8<2>;

extern double  LOT1           = 0.1;      //;>B ?5@2>3> 8=AB@C<5=B0

extern double  LOT2           = 0.1;      //;>B 2B>@>3> 8=AB@C<5=B0

extern int     Slippage       = 3;        //?@>A:0;L7K20=85 

extern int     Magic          = 123;

extern int     Y=30,X = 10;

string id="cmillion";

//+------------------------------------------------------------------+

int OnInit()

{

   EventSetTimer(1);

   RectLabelCreate(0,id+" r1"    ,0,X  ,Y   ,385,55,clrIvory);

   EditCreate  (0,id+" SYMBOL  1",0,X+5,Y+5 ,100,20,SYMBOL1,"Arial",10,ALIGN_CENTER,false);

   EditCreate  (0,id+" SYMBOL  2",0,X+5,Y+30,100,20,SYMBOL2,"Arial",10,ALIGN_CENTER,false);

   

   EditCreate  (0,id+" LOT     1",0,X+110,Y+5 ,50,20,DoubleToStr(LOT1,2),"Arial",10,ALIGN_CENTER,false);

   EditCreate  (0,id+" LOT     2",0,X+110,Y+30,50,20,DoubleToStr(LOT2,2),"Arial",10,ALIGN_CENTER,false);

   

   ButtonCreate(0,id+" kn buy  1",0,X+165,Y+5 ,50 ,20,"buy","Times New Roman",10,clrBlack,clrLightGray,clrNONE,false);

   ButtonCreate(0,id+" kn sell 1",0,X+220,Y+5 ,50 ,20,"sell","Times New Roman",10,clrBlack,clrLightGray,clrNONE,false);

   ButtonCreate(0,id+" kn buy  2",0,X+165,Y+30,50 ,20,"buy","Times New Roman",10,clrBlack,clrLightGray,clrNONE,false);

   ButtonCreate(0,id+" kn sell 2",0,X+220,Y+30,50 ,20,"sell","Times New Roman",10,clrBlack,clrLightGray,clrNONE,false);



   ButtonCreate(0,id+" kn CLOSE ",0,X+275,Y+5 ,50 ,45,"CLOSE","Times New Roman",10,clrBlack,clrLightGray,clrNONE,false);

   EditCreate  (0,id+" Profit   ",0,X+330,Y+5 ,50,45,"0.00","Arial",10,ALIGN_CENTER,true);

   return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

void OnTick() {OnTimer();}

void OnTimer()

{

   SYMBOL1 = ObjectGetString(0,id+" SYMBOL  1",OBJPROP_TEXT);

   int    Digit=(int)MarketInfo(SYMBOL1,MODE_DIGITS);

   double Poin=MarketInfo(SYMBOL1,MODE_POINT);

   double ASK=NormalizeDouble(MarketInfo(SYMBOL1,MODE_ASK),Digit);

   double BID=NormalizeDouble(MarketInfo(SYMBOL1,MODE_BID),Digit);

   if (ASK==0 || BID==0) ObjectSetInteger(0,id+" SYMBOL  1",OBJPROP_BGCOLOR,clrRed);

   else ObjectSetInteger(0,id+" SYMBOL  1",OBJPROP_BGCOLOR,clrWhite);



   string String=ObjectGetString(0,id+" LOT     1",OBJPROP_TEXT); 

   StringReplace(String,",",".");

   if (LOT1!=StringToDouble(String))

   {

      LOT1=StringToDouble(String);

      ObjectSetString(0,id+" LOT     1",OBJPROP_TEXT,DoubleToString(LOT1,2)); 

   }

   String=ObjectGetString(0,id+" LOT     2",OBJPROP_TEXT); 

   StringReplace(String,",",".");

   if (LOT2!=StringToDouble(String))

   {

      LOT2=StringToDouble(String);

      ObjectSetString(0,id+" LOT     2",OBJPROP_TEXT,DoubleToString(LOT2,2)); 

   }



   if (ObjectGetInteger(0,id+" kn buy  1",OBJPROP_STATE))  

   {

      if (AccountFreeMarginCheck(SYMBOL1,OP_BUY,LOT1)>0)

      {

         if (OrderSend(SYMBOL1,OP_BUY,LOT1,ASK,Slippage,0,0,NULL,Magic,0,Blue)!=-1) 

            ObjectSetInteger(0,id+" kn buy  1",OBJPROP_STATE,false);  

         else Alert(SYMBOL1," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL1,MODE_ASK),"  ",LOT1);

      }

   }

   if (ObjectGetInteger(0,id+" kn sell 1",OBJPROP_STATE))  

   {

      if (AccountFreeMarginCheck(SYMBOL1,OP_SELL,LOT1)>0)

      {

         if (OrderSend(SYMBOL1,OP_SELL,LOT1,BID,Slippage,0,0,NULL,Magic,0,Blue)!=-1) 

            ObjectSetInteger(0,id+" kn sell 1",OBJPROP_STATE,false);  

         else Alert(SYMBOL1," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL1,MODE_ASK),"  ",LOT1);

      }

   }

   SYMBOL2 = ObjectGetString(0,id+" SYMBOL  2",OBJPROP_TEXT);

   Digit=(int)MarketInfo(SYMBOL2,MODE_DIGITS);

   Poin=MarketInfo(SYMBOL2,MODE_POINT);

   ASK=NormalizeDouble(MarketInfo(SYMBOL2,MODE_ASK),Digit);

   BID=NormalizeDouble(MarketInfo(SYMBOL2,MODE_BID),Digit);

   if (ASK==0 || BID==0) ObjectSetInteger(0,id+" SYMBOL  2",OBJPROP_BGCOLOR,clrRed);

   else ObjectSetInteger(0,id+" SYMBOL  2",OBJPROP_BGCOLOR,clrWhite);

   

   if (ObjectGetInteger(0,id+" kn buy  2",OBJPROP_STATE))  

   {

      if (AccountFreeMarginCheck(SYMBOL2,OP_BUY,LOT2)>0)

      {

         if (OrderSend(SYMBOL2,OP_BUY,LOT2,ASK,Slippage,0,0,NULL,Magic,0,Blue)!=-1) 

            ObjectSetInteger(0,id+" kn buy  2",OBJPROP_STATE,false);  

         else Alert(SYMBOL2," send order BAY error ",GetLastError(),"  ",MarketInfo(SYMBOL2,MODE_ASK),"  ",LOT2);

      }

   }

   if (ObjectGetInteger(0,id+" kn sell 2",OBJPROP_STATE))  

   {

      if (AccountFreeMarginCheck(SYMBOL2,OP_SELL,LOT2)>0)

      {

         if (OrderSend(SYMBOL2,OP_SELL,LOT2,BID,Slippage,0,0,NULL,Magic,0,Blue)!=-1) 

            ObjectSetInteger(0,id+" kn sell 2",OBJPROP_STATE,false);  

         else Alert(SYMBOL2," send order SELL error ",GetLastError(),"  ",MarketInfo(SYMBOL2,MODE_ASK),"  ",LOT2);

      }

   }

   //---

   double Profit=0;

   for (int i=0; i<OrdersTotal(); i++)

   {    

      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

      { 

         string OS=OrderSymbol();

         if ((OS==SYMBOL1 || OS==SYMBOL2) && Magic==OrderMagicNumber())

         { 

            Profit+=OrderProfit()+OrderCommission()+OrderSwap();

         }

      }

   }

   ObjectSetString(0,id+" Profit   ",OBJPROP_TEXT,DoubleToStr(Profit,2));

   if (ObjectGetInteger(0,id+" kn CLOSE ",OBJPROP_STATE))

   {

      CloseAll();

      if (Profit==0) ObjectSetInteger(0,id+" kn CLOSE ",OBJPROP_STATE,false);  

   }

} 

//--------------------------------------------------------------------

bool ButtonCreate(const long              chart_ID=0,               // ID 3@0D8:0

                  const string            name="Button",            // 8<O :=>?:8

                  const int               sub_window=0,             // =><5@ ?>4>:=0

                  const long              x=0,                      // :>>@48=0B0 ?> >A8 X

                  const long              y=0,                      // :>>@48=0B0 ?> >A8 Y

                  const int               width=50,                 // H8@8=0 :=>?:8

                  const int               height=18,                // 2KA>B0 :=>?:8

                  const string            text="Button",            // B5:AB

                  const string            font="Arial",             // H@8DB

                  const int               font_size=10,             // @07<5@ H@8DB0

                  const color             clr=clrRed,               // F25B B5:AB0

                  const color             clrfon=clrBlack,          // F25B D>=0

                  const color             border_clr=clrNONE,       // F25B 3@0=8FK

                  const bool              state=false,       // F25B 3@0=8FK

                  const ENUM_BASE_CORNER  CORNER=CORNER_LEFT_UPPER)

  {

   if (ObjectFind(chart_ID,name)==-1)

   {

      ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);

      ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);

      ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);

      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER);

      ObjectSetString(chart_ID,name,OBJPROP_FONT,font);

      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);

      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0);

      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0);

      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0);

      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1);

      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,1);

      ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);

   }

   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,clrfon);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);

   return(true);

}

//----------------------

bool EditCreate(const long             chart_ID=0,               // ID 3@0D8:0 

                const string           name="Edit",              // 8<O >1J5:B0 

                const int              sub_window=0,             // =><5@ ?>4>:=0 

                const int              x=0,                      // :>>@48=0B0 ?> >A8 X 

                const int              y=0,                      // :>>@48=0B0 ?> >A8 Y 

                const int              width=50,                 // H8@8=0 

                const int              height=18,                // 2KA>B0 

                const string           text="Text",              // B5:AB 

                const string           font="Arial",             // H@8DB 

                const int              font_size=8,             // @07<5@ H@8DB0 

                const ENUM_ALIGN_MODE  align=ALIGN_RIGHT,       // A?>A>1 2K@02=820=8O 

                const bool             read_only=true,           // 2>7<>6=>ABL @540:B8@>20BL 

                const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // C3>; 3@0D8:0 4;O ?@82O7:8 

                const color            clr=clrBlack,             // F25B B5:AB0 

                const color            back_clr=clrWhite,        // F25B D>=0 

                const color            border_clr=clrNONE,       // F25B 3@0=8FK 

                const bool             back=false,               // =0 704=5< ?;0=5 

                const bool             selection=false,          // 2K45;8BL 4;O ?5@5<5I5=89 

                const bool             hidden=true,              // A:@KB 2 A?8A:5 >1J5:B>2 

                const long             z_order=0)                // ?@8>@8B5B =0 =060B85 <KHLN 

  { 

   ResetLastError(); 

   if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0)) 

     { 

      return(false); 

     } 

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 

   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 

   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 

   ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align); 

   ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only); 

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 

   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 

   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 

   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 

   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 

   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 

   return(true); 

  } 

//+------------------------------------------------------------------+ 

void OnDeinit(const int reason)

{

   ObjectsDeleteAll(0,id);

}

//+------------------------------------------------------------------+

bool RectLabelCreate(const long             chart_ID=0,               // ID 3@0D8:0

                     const string           name="RectLabel",         // 8<O <5B:8

                     const int              sub_window=0,             // =><5@ ?>4>:=0

                     const long              x=0,                     // :>>@48=0B0 ?> >A8 X

                     const long              y=0,                     // :>>@48=0B0 ?> >A8 y

                     const int              width=50,                 // H8@8=0

                     const int              height=18,                // 2KA>B0

                     const color            back_clr=clrWhite,        // F25B D>=0

                     const color            clr=clrBlack,             // F25B ?;>A:>9 3@0=8FK (Flat)

                     const ENUM_LINE_STYLE  style=STYLE_SOLID,        // AB8;L ?;>A:>9 3@0=8FK

                     const int              line_width=1,             // B>;I8=0 ?;>A:>9 3@0=8FK

                     const bool             back=false,               // =0 704=5< ?;0=5

                     const bool             selection=false,          // 2K45;8BL 4;O ?5@5<5I5=89

                     const bool             hidden=true,              // A:@KB 2 A?8A:5 >1J5:B>2

                     const long             z_order=0)                // ?@8>@8B5B =0 =060B85 <KHLN

  {

   ResetLastError();

   if (ObjectFind(chart_ID,name)==-1)

   {

      ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0);

      ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,BORDER_FLAT);

      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_LEFT_UPPER);

      ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);

      ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);

      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);

      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);

      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);

      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);

      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);

   }

   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);

   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);

   return(true);

}

//--------------------------------------------------------------------

void CloseAll()

{  

   bool error=true;

   int nn=0,err,DIGITS,OT,Ticket;

   double ASK,BID,POINT;

   while(!IsStopped())

   {

      OT=-1;

      for (int j = OrdersTotal()-1; j >= 0; j--)

      {

         if (OrderSelect(j, SELECT_BY_POS))

         {

            string OS=OrderSymbol();

            if ((OS==SYMBOL1 || OS==SYMBOL2) && Magic==OrderMagicNumber() && OrderMagicNumber() == Magic)

            {

               DIGITS = (int)MarketInfo(OrderSymbol(),MODE_DIGITS);

               ASK = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS);

               BID = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS);

               POINT = MarketInfo(OrderSymbol(),MODE_POINT);

               OT = OrderType();

               Ticket=OrderTicket();

               if (OT==OP_BUY) 

               {

                  error=OrderClose(Ticket,OrderLots(),BID,Slippage,Red);

                  if (error) Alert(OS," 0:@KB >@45@ N ",Ticket,"  ?@81K;L ",OrderProfit(),

                                     "     ",TimeToStr(TimeCurrent(),TIME_SECONDS));

               }

               if (OT==OP_SELL) 

               {

                  error=OrderClose(Ticket,OrderLots(),ASK,Slippage,Red);

                  if (error) Alert(OS," 0:@KB >@45@ N ",Ticket,"  ?@81K;L ",OrderProfit(),

                                     "     ",TimeToStr(TimeCurrent(),TIME_SECONDS));

               }

               if (!error) 

               {

                  err = GetLastError();

                  if (err<2) continue;

                  if (err==129) 

                  {

                     Sleep(5000);

                     RefreshRates();

                     continue;

                  }

                  if (err==146) 

                  {

                     j++;

                     if (IsTradeContextBusy()) Sleep(2000);

                     continue;

                  }

               }

            }

         }

      }

      if (OT==-1) break;

      nn++;

      if (nn>10) {Alert("5 C40;>AL 70:@KBL 2A5 A45;:8 ");break;}

      Sleep(1000);

      RefreshRates();

   }

}

//+------------------------------------------------------------------+



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 ---