Exp_GTakeProfit_Tm

Author: Copyright © 2018, Nikolay Kositsin
Orders Execution
It automatically opens orders when conditions are reached
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
Exp_GTakeProfit_Tm
ÿþ//+------------------------------------------------------------------+

//|                                           Exp_GTakeProfit_Tm.mq5 |

//|                               Copyright © 2018, Nikolay Kositsin | 

//|                              Khabarovsk,   farria@mail.redcom.ru | 

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

#property copyright "Copyright © 2018, Nikolay Kositsin"

#property link "farria@mail.redcom.ru"

#property version   "1.10"

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

//|  1JO2;5=85 ?5@5G8A;5=8O G0A>2 ACB>:         |

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

enum HOURS 

  {

   ENUM_HOUR_0=0,   //0

   ENUM_HOUR_1,     //1

   ENUM_HOUR_2,     //2

   ENUM_HOUR_3,     //3

   ENUM_HOUR_4,     //4

   ENUM_HOUR_5,     //5

   ENUM_HOUR_6,     //6

   ENUM_HOUR_7,     //7

   ENUM_HOUR_8,     //8

   ENUM_HOUR_9,     //9

   ENUM_HOUR_10,     //10

   ENUM_HOUR_11,     //11   

   ENUM_HOUR_12,     //12

   ENUM_HOUR_13,     //13

   ENUM_HOUR_14,     //14

   ENUM_HOUR_15,     //15

   ENUM_HOUR_16,     //16

   ENUM_HOUR_17,     //17

   ENUM_HOUR_18,     //18

   ENUM_HOUR_19,     //19

   ENUM_HOUR_20,     //20

   ENUM_HOUR_21,     //21  

   ENUM_HOUR_22,     //22

   ENUM_HOUR_23      //23    

  };

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

//|  1JO2;5=85 ?5@5G8A;5=8O <8=CB G0A>2         |

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

enum MINUTS 

  {

   ENUM_MINUT_0=0,   //0

   ENUM_MINUT_1,     //1

   ENUM_MINUT_2,     //2

   ENUM_MINUT_3,     //3

   ENUM_MINUT_4,     //4

   ENUM_MINUT_5,     //5

   ENUM_MINUT_6,     //6

   ENUM_MINUT_7,     //7

   ENUM_MINUT_8,     //8

   ENUM_MINUT_9,     //9

   ENUM_MINUT_10,     //10

   ENUM_MINUT_11,     //11   

   ENUM_MINUT_12,     //12

   ENUM_MINUT_13,     //13

   ENUM_MINUT_14,     //14

   ENUM_MINUT_15,     //15

   ENUM_MINUT_16,     //16

   ENUM_MINUT_17,     //17

   ENUM_MINUT_18,     //18

   ENUM_MINUT_19,     //19

   ENUM_MINUT_20,     //20

   ENUM_MINUT_21,     //21  

   ENUM_MINUT_22,     //22

   ENUM_MINUT_23,     //23

   ENUM_MINUT_24,     //24

   ENUM_MINUT_25,     //25

   ENUM_MINUT_26,     //26

   ENUM_MINUT_27,     //27

   ENUM_MINUT_28,     //28

   ENUM_MINUT_29,     //29

   ENUM_MINUT_30,     //30

   ENUM_MINUT_31,     //31  

   ENUM_MINUT_32,     //32

   ENUM_MINUT_33,     //33

   ENUM_MINUT_34,     //34

   ENUM_MINUT_35,     //35

   ENUM_MINUT_36,     //36

   ENUM_MINUT_37,     //37

   ENUM_MINUT_38,     //38

   ENUM_MINUT_39,     //39 

   ENUM_MINUT_40,     //40

   ENUM_MINUT_41,     //41  

   ENUM_MINUT_42,     //42

   ENUM_MINUT_43,     //43

   ENUM_MINUT_44,     //44

   ENUM_MINUT_45,     //45

   ENUM_MINUT_46,     //46

   ENUM_MINUT_47,     //47

   ENUM_MINUT_48,     //48

   ENUM_MINUT_49,     //49

   ENUM_MINUT_50,     //50

   ENUM_MINUT_51,     //51  

   ENUM_MINUT_52,     //52

   ENUM_MINUT_53,     //53

   ENUM_MINUT_54,     //54

   ENUM_MINUT_55,     //55

   ENUM_MINUT_56,     //56

   ENUM_MINUT_57,     //57

   ENUM_MINUT_58,     //58

   ENUM_MINUT_59      //59             

  };

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

//|  5@5G8A;5=85 4;O 20@80=B>2 @0AGQB0 ?@81K;8  |

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

enum TakeMode

  {

   ENUM_PERCENT,     //?@81K;L 2 ?@>F5=B0E >B 45?>78B0

   ENUM_CARRENCY     //?@81K;L 2 20;NB5 45?>78B0

  };

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

//| E>4=K5 ?0@0<5B@K 8=48:0B>@0 M:A?5@B0        |

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

input TakeMode LMode=ENUM_PERCENT;     //A?>A>1 >?@545;5=8O ?@81K;8

input double TakeProfit=100.0;         //@07<5@ B59:?@>D8B0

input bool   TimeTrade=true;        // 07@5H5=85 4;O B>@3>2;8 ?> 8=B5@20;0< 2@5<5=8

input HOURS  StartH=ENUM_HOUR_0;    //!B0@B B>@3>2;8 ('0AK)

input MINUTS StartM=ENUM_MINUT_0;   //!B0@B B>@3>2;8 (8=CBK)

input HOURS  EndH=ENUM_HOUR_23;     //:>=G0=85 B>@3>2;8 ('0AK)

input MINUTS EndM=ENUM_MINUT_59;    //:>=G0=85 B>@3>2;8 (8=CBK) 

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

bool Stop;

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//---- 

   Stop=false;

//---- 7025@H5=85 8=8F80;870F88

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//----



//----

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//---- ?@545;5=85 A83=0;>2 4;O B>@3>2;8 2 ?5@8>45

   bool Trade=false;

   if(TimeTrade)

     {

      MqlDateTime tm;

      TimeToStruct(TimeCurrent(),tm);



      if(StartH<EndH)

        {

         if(tm.hour==StartH && tm.min>=StartM) Trade=true;

         if(tm.hour>StartH && tm.hour<EndH) Trade=true;

         if(tm.hour>StartH && tm.hour==EndH && tm.min<EndM) Trade=true;

        }



      if(StartH==EndH)

        {

         if(tm.hour==StartH && tm.min>=StartM && tm.min<EndM) Trade=true;

        }



      if(StartH>EndH)

        {

         if(tm.hour>=StartH && tm.min>=StartM) Trade=true;

         if(tm.hour<EndH) Trade=true;

         if(tm.hour==EndH && tm.min<EndM) Trade=true;

        }

     }

//----  

   double balance=AccountInfoDouble(ACCOUNT_BALANCE);

   double profit=AccountInfoDouble(ACCOUNT_PROFIT);

   if(profit<0 && !Stop && Trade) return;



//---- ?@>25@:0 =0 3;>10;L=K9 AB>?;>AA

   if(!Stop)

      switch(LMode)

        {

         case ENUM_PERCENT :

           {

            double TakeRatio=MathAbs(100*profit/balance);

            if(TakeRatio>=TakeProfit)

              {

               Stop=true;

               Print(__FUNCTION__,": ","!@01>B0; 3;>10;L=K9 B59:?@>D8B! 0:@K205< 2A5 >B:@KBK5 ?>78F88!");

              }

            break;

           }

         case ENUM_CARRENCY :

           {

            if(MathAbs(profit)>TakeProfit) Stop=true;

            break;

           }

        }

//---- 70:@K205< 2A5 >B:@KBK5 ?>78F88

   if(Stop || (TimeTrade && !Trade))

     {

      int total=PositionsTotal();

      if(!total)

        {

         Stop=false; // 2A5 ?>78F88 70:@KBK

         return;

        }

      for(int pos=total-1; pos>=0; pos--)

        {

         string symbol=PositionGetSymbol(pos);

         if(!PositionSelect(symbol)) continue;

         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)

           {

            bool BUY_Close=true;

            BuyPositionClose(BUY_Close,symbol,20);

           }

         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)

           {

            bool SELL_Close=true;

            SellPositionClose(SELL_Close,symbol,20);

           }

        }

     }

//----

  }

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

//| 0:@K205< 4;8==CN ?>78F8N                                        |

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

bool BuyPositionClose

(

 bool &Signal,         // D;03 @07@5H5=8O =0 A45;:C

 const string symbol,  // B>@3>20O ?0@0 A45;:8

 uint deviation        // A;8??06

 )

  {

//----

   if(!Signal) return(true);



//---- 1JO2;5=85 AB@C:BC@ B>@3>2>3> 70?@>A0 8 @57C;LB0B0 B>@3>2>3> 70?@>A0

   MqlTradeRequest request;

   MqlTradeResult result;

//---- 1JO2;5=85 AB@C:BC@K @57C;LB0B0 ?@>25@:8 B>@3>2>3> 70?@>A0 

   MqlTradeCheckResult check;



//---- >1=C;5=85 AB@C:BC@

   ZeroMemory(request);

   ZeroMemory(result);

   ZeroMemory(check);



//---- @>25@:0 =0 =0;8G85 >B:@KB>9 BUY ?>78F88

   if(PositionSelect(symbol))

     {

      if(PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_BUY) return(false);

     }

   else return(false);



   double MaxLot,volume,Bid;

//---- ?>;CG5=85 40==KE 4;O @0AGQB0    

   if(!PositionGetDouble(POSITION_VOLUME,volume)) return(true);

   if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX,MaxLot)) return(true);

   if(!SymbolInfoDouble(symbol,SYMBOL_BID,Bid)) return(true);



//---- ?@>25@:0 ;>B0 =0 <0:A8<0;L=>5 4>?CAB8<>5 7=0G5=85       

   if(volume>MaxLot) volume=MaxLot;



//---- =8F80;870F8O AB@C:BC@K B>@3>2>3> 70?@>A0 MqlTradeRequest 4;O 70:@K20=8O BUY ?>78F88

   request.type   = ORDER_TYPE_SELL;

   request.price  = Bid;

   request.action = TRADE_ACTION_DEAL;

   request.symbol = symbol;

   request.volume = volume;

   request.sl = 0.0;

   request.tp = 0.0;

   request.deviation=deviation;

   //request.type_filling=ORDER_FILLING_FOK;

   request.position=PositionGetInteger(POSITION_TICKET); 



//---- @>25@:0 B>@3>2>3> 70?@>A0 =0 :>@@5:B=>ABL

   if(!OrderCheck(request,check))

     {

      Print(__FUNCTION__,"(): 525@=K5 40==K5 4;O AB@C:BC@K B>@3>2>3> 70?@>A0!");

      Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode));

      return(false);

     }

//----     

   string comment="";

   StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): 0:@K205< Buy ?>78F8N ?> ",symbol," ============ >>>");

   Print(comment);



//---- B?@02:0 ?@8:070 =0 70:@K20=85 ?>78F88 =0 B>@3>2K9 A5@25@

   if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE)

     {

      Print(__FUNCTION__,"(): 52>7<>6=> 70:@KBL ?>78F8N!");

      Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));

      return(false);

     }

   else

   if(result.retcode==TRADE_RETCODE_DONE)

     {

      Signal=false;

      comment="";

      StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Buy ?>78F8O ?> ",symbol," 70:@KB0 ============ >>>");

      Print(comment);

      PlaySound("ok.wav");

     }

   else

     {

      Print(__FUNCTION__,"(): 52>7<>6=> 70:@KBL ?>78F8N!");

      Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));

      return(false);

     }

//----

   return(true);

  }

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

//| 0:@K205< :>@>B:CN ?>78F8N                                       |

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

bool SellPositionClose

(

 bool &Signal,         // D;03 @07@5H5=8O =0 A45;:C

 const string symbol,  // B>@3>20O ?0@0 A45;:8

 uint deviation        // A;8??06

 )

  {

//----

   if(!Signal) return(true);



//---- 1JO2;5=85 AB@C:BC@ B>@3>2>3> 70?@>A0 8 @57C;LB0B0 B>@3>2>3> 70?@>A0

   MqlTradeRequest request;

   MqlTradeResult result;

//---- 1JO2;5=85 AB@C:BC@K @57C;LB0B0 ?@>25@:8 B>@3>2>3> 70?@>A0 

   MqlTradeCheckResult check;



//---- >1=C;5=85 AB@C:BC@

   ZeroMemory(request);

   ZeroMemory(result);

   ZeroMemory(check);



//---- @>25@:0 =0 =0;8G85 >B:@KB>9 SELL ?>78F88

   if(PositionSelect(symbol))

     {

      if(PositionGetInteger(POSITION_TYPE)!=POSITION_TYPE_SELL)return(false);

     }

   else return(false);



   double MaxLot,volume,Ask;

//---- ?>;CG5=85 40==KE 4;O @0AGQB0    

   if(!PositionGetDouble(POSITION_VOLUME,volume)) return(true);

   if(!SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX,MaxLot)) return(true);

   if(!SymbolInfoDouble(symbol,SYMBOL_ASK,Ask)) return(true);



//---- ?@>25@:0 ;>B0 =0 <0:A8<0;L=>5 4>?CAB8<>5 7=0G5=85       

   if(volume>MaxLot) volume=MaxLot;



//---- =8F80;870F8O AB@C:BC@K B>@3>2>3> 70?@>A0 MqlTradeRequest 4;O 70:@K20=8O SELL ?>78F88

   request.type   = ORDER_TYPE_BUY;

   request.price  = Ask;

   request.action = TRADE_ACTION_DEAL;

   request.symbol = symbol;

   request.volume = volume;

   request.sl = 0.0;

   request.tp = 0.0;

   request.deviation=deviation;

   //request.type_filling=ORDER_FILLING_FOK;

   request.position=PositionGetInteger(POSITION_TICKET); 



//---- @>25@:0 B>@3>2>3> 70?@>A0 =0 :>@@5:B=>ABL

   if(!OrderCheck(request,check))

     {

      Print(__FUNCTION__,"(): 525@=K5 40==K5 4;O AB@C:BC@K B>@3>2>3> 70?@>A0!");

      Print(__FUNCTION__,"(): OrderCheck(): ",ResultRetcodeDescription(check.retcode));

      return(false);

     }

//----    

   string comment="";

   StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): 0:@K205< Sell ?>78F8N ?> ",symbol," ============ >>>");

   Print(comment);



//---- B?@02:0 ?@8:070 =0 70:@K20=85 ?>78F88 =0 B>@3>2K9 A5@25@

   if(!OrderSend(request,result) || result.retcode!=TRADE_RETCODE_DONE)

     {

      Print(__FUNCTION__,"(): 52>7<>6=> 70:@KBL ?>78F8N!");

      Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));

      return(false);

     }

   else

   if(result.retcode==TRADE_RETCODE_DONE)

     {

      Signal=false;

      comment="";

      StringConcatenate(comment,"<<< ============ ",__FUNCTION__,"(): Sell ?>78F8O ?> ",symbol," 70:@KB0 ============ >>>");

      Print(comment);

      PlaySound("ok.wav");

     }

   else

     {

      Print(__FUNCTION__,"(): 52>7<>6=> 70:@KBL ?>78F8N!");

      Print(__FUNCTION__,"(): OrderSend(): ",ResultRetcodeDescription(result.retcode));

      return(false);

     }

//----

   return(true);

  }

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

//| 2>72@0B AB@8=3>2>3> @57C;LB0B0 B>@3>2>9 >?5@0F88 ?> 53> :>4C     |

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

string ResultRetcodeDescription(int retcode)

  {

   string str;

//----

   switch(retcode)

     {

      case TRADE_RETCODE_REQUOTE: str=" 5:2>B0"; break;

      case TRADE_RETCODE_REJECT: str="0?@>A >B25@3=CB"; break;

      case TRADE_RETCODE_CANCEL: str="0?@>A >B<5=5= B@5945@><"; break;

      case TRADE_RETCODE_PLACED: str="@45@ @07<5I5="; break;

      case TRADE_RETCODE_DONE: str="0O2:0 2K?>;=5=0"; break;

      case TRADE_RETCODE_DONE_PARTIAL: str="0O2:0 2K?>;=5=0 G0AB8G=>"; break;

      case TRADE_RETCODE_ERROR: str="H81:0 >1@01>B:8 70?@>A0"; break;

      case TRADE_RETCODE_TIMEOUT: str="0?@>A >B<5=5= ?> 8AB5G5=8N 2@5<5=8";break;

      case TRADE_RETCODE_INVALID: str="5?@028;L=K9 70?@>A"; break;

      case TRADE_RETCODE_INVALID_VOLUME: str="5?@028;L=K9 >1J5< 2 70?@>A5"; break;

      case TRADE_RETCODE_INVALID_PRICE: str="5?@028;L=0O F5=0 2 70?@>A5"; break;

      case TRADE_RETCODE_INVALID_STOPS: str="5?@028;L=K5 AB>?K 2 70?@>A5"; break;

      case TRADE_RETCODE_TRADE_DISABLED: str="">@3>2;O 70?@5I5=0"; break;

      case TRADE_RETCODE_MARKET_CLOSED: str=" K=>: 70:@KB"; break;

      case TRADE_RETCODE_NO_MONEY: str="5B 4>AB0B>G=KE 45=56=KE A@54AB2 4;O 2K?>;=5=8O 70?@>A0"; break;

      case TRADE_RETCODE_PRICE_CHANGED: str="&5=K 87<5=8;8AL"; break;

      case TRADE_RETCODE_PRICE_OFF: str="BACBAB2CNB :>B8@>2:8 4;O >1@01>B:8 70?@>A0"; break;

      case TRADE_RETCODE_INVALID_EXPIRATION: str="525@=0O 40B0 8AB5G5=8O >@45@0 2 70?@>A5"; break;

      case TRADE_RETCODE_ORDER_CHANGED: str="!>AB>O=85 >@45@0 87<5=8;>AL"; break;

      case TRADE_RETCODE_TOO_MANY_REQUESTS: str="!;8H:>< G0ABK5 70?@>AK"; break;

      case TRADE_RETCODE_NO_CHANGES: str=" 70?@>A5 =5B 87<5=5=89"; break;

      case TRADE_RETCODE_SERVER_DISABLES_AT: str="2B>B@5948=3 70?@5I5= A5@25@><"; break;

      case TRADE_RETCODE_CLIENT_DISABLES_AT: str="2B>B@5948=3 70?@5I5= :;85=BA:8< B5@<8=0;><"; break;

      case TRADE_RETCODE_LOCKED: str="0?@>A 701;>:8@>20= 4;O >1@01>B:8"; break;

      case TRADE_RETCODE_FROZEN: str="@45@ 8;8 ?>78F8O 70<>@>65=K"; break;

      case TRADE_RETCODE_INVALID_FILL: str="#:070= =5?>445@68205<K9 B8? 8A?>;=5=8O >@45@0 ?> >AB0B:C "; break;

      case TRADE_RETCODE_CONNECTION: str="5B A>548=5=8O A B>@3>2K< A5@25@><"; break;

      case TRADE_RETCODE_ONLY_REAL: str="?5@0F8O @07@5H5=0 B>;L:> 4;O @50;L=KE AG5B>2"; break;

      case TRADE_RETCODE_LIMIT_ORDERS: str=">AB83=CB ;8<8B =0 :>;8G5AB2> >B;>65==KE >@45@>2"; break;

      case TRADE_RETCODE_LIMIT_VOLUME: str=">AB83=CB ;8<8B =0 >1J5< >@45@>2 8 ?>78F89 4;O 40==>3> A8<2>;0"; break;

      case TRADE_RETCODE_INVALID_ORDER: str="525@=K9 8;8 70?@5IQ==K9 B8? >@45@0"; break;

      case TRADE_RETCODE_POSITION_CLOSED: str=">78F8O A C:070==K< POSITION_IDENTIFIER C65 70:@KB0"; break;

      default: str="58725AB=K9 @57C;LB0B";

     }

//----

   return(str);

  }

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

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