Exp_ClosePositionsByTime

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

//|                                     Exp_ClosePositionsByTime.mq5 |

//|                               Copyright © 2017, Nikolay Kositsin | 

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

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

#property copyright "Copyright © 2017, Nikolay Kositsin"

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

#property version   "1.10"

#property description "!>25B=8: 4;O 70:@K20=8O 2A5E ?>78F89 ?> B5:CI5<C A8<2>;C, >B:@KBKE =0 AGQB5, 5A;8 B5:CI55 2@5<O A5@25@0 ?@52KA8;> D8:A8@>20==K9 2> 2E>4=KE ?5@5<5==KE ?@545; 2@5<5=8"

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

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

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

input datetime StopTime=D'2030.01.01 23:59';   //2@5<O 70:@KB8O ?>78F89

input uint    Deviation_=20;                   //<0:A. >B:;>=5=85 F5=K 2 ?C=:B0E

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

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

  {

//---- 

   if(TimeCurrent()>StopTime && PositionsTotal()) Stop=true;

   else return;

   

//---- 70:@K205< 2A5 >B:@KBK5 ?>78F88 ?> B5:CI5<C A8<2>;C

   if(Stop)

     {

      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(symbol!=Symbol()) continue; //70:@K205< 2A5 >B:@KBK5 ?>78F88 B>;L:> ?> B5:CI5<C A8<2>;C

         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)

           {

            bool BUY_Close=true;

            BuyPositionClose(BUY_Close,symbol,Deviation_);

           }

         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)

           {

            bool SELL_Close=true;

            SellPositionClose(SELL_Close,symbol,Deviation_);

           }

        }

     }

//----

  }

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

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