Author: Oleksii Chepurnyi
Orders Execution
It automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Indicators Used
Moving average indicator
0 Views
0 Downloads
0 Favorites
Pipser
ÿþ//+------------------------------------------------------------------+

//|                                                       Pipser.mq4 |

//|                                                Oleksii Chepurnyi |

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

#property copyright "Oleksii Chepurnyi"

#property link      "https://www.mql5.com/ru/users/oleksiic"

#property version   "1.0"

#property strict

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

#include <Errors.mqh>               //  K7>2 DC=:F88 - ShowError

#include <Orders.mqh>

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

extern int    period   = 200;       //  5@8>4 EMA

extern int    slope    = 1;         //  0:;>= EMA, ?8?AK

extern double Lot      = 0.01;      //  0G0;L=K9 ;>B

extern int    TS       = 20;        //  "@59;8=3 AB>?, ?8?AK

extern int    Range    = 50;        //   0AAB>O=85 CA@54=5=8O, ?8?AK

extern uchar  TimeIn   = 1;         //  @5<O =0G0;0 @01>BK @>1>B0, ''

extern uchar  TimeOut  = 9;         //  @5<O >:>=G0=8O @01>BK @>1>B0, ''

extern int    SprMax   = 20;        //  0:A8<0;L=K9 A?@54, ?8?AK

extern int    Slippage = 10;        //  @>A:0;L7K20=85, ?8?AK

sinput int    Magic    = 861260;    //  Magic



static datetime NewTime;

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

//| Expert initialization function                                   |

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

int OnInit()

  {

   NewTime=Time[0];



   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

   

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

   Get_Orders();



//------ A;8 5ABL >@45@0 - <>48D8F8@C5<

   if(Orders_Quant > 0)

     {

      if(!OrderSelect(Tickets[0],SELECT_BY_TICKET)) ShowError;

      switch(OrderType())

        {

         case OP_BUY:  Modify_Order_Buy(OrderTicket());break;

         case OP_SELL: Modify_Order_Sell(OrderTicket());break;

        }

     }



//------ 45< =>2K9 10@

   if(NewTime != Time[0]) NewTime = Time[0];

   else return;

   

//------ A;8 5ABL >@45@0 - CE>48<

   if(Orders_Quant > 0) return;



//------ @5<O @01>BK @>1>B0

   if(Hour()<TimeIn || Hour()>=TimeOut) return;

   

//------ 0:A8<0;L=K9 A?@54

   if(MarketInfo(Symbol(),MODE_SPREAD)>SprMax) return;

   

   double EMA_1 = iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,1); 

   double EMA_2 = iMA(NULL,0,period,0,MODE_EMA,PRICE_CLOSE,2); 



   if(NormalizeDouble((EMA_1-EMA_2),Digits)/Point>=slope)     //  A=>2=K5 CA;>28O =0 Buy

     {

      if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"Order by Pipser "+Symbol(),Magic)) ShowError;

      return;

     }



   if(NormalizeDouble((EMA_2-EMA_1),Digits)/Point>=slope)    //  A=>2=K5 CA;>28O =0 Sell

     {

      if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"Order by Pipser "+Symbol(),Magic)) ShowError;

      return;

     }

  }

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

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

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

// >48D8:0F8O >@45@0 BUY

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

void Modify_Order_Buy(int Ticket)

  {

//------ A;8 >@45@ >48=

   if(Orders_Quant == 1)

     {

      if(!OrderSelect(Ticket,SELECT_BY_TICKET)) ShowError;

      if(Bid>OrderOpenPrice()+TS*Point)

        {

         double NewStop=NormalizeDouble(Bid-TS*Point,Digits);

         if(NewStop<=OrderStopLoss()) return;

         if(!OrderModify(OrderTicket(),0,NewStop,0,0)) ShowError;

         return;

        }

      if(Ask<OrderOpenPrice()-Range*Point)

        if(!OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,0,0,"Order by Pipser "+Symbol(),Magic)) ShowError;

      return;

     }

//------ A;8 >@45@>2 1>;LH5 >4=>3>

   if(Orders_Quant > 1)

     {

      if(!OrderSelect(Orders_Find_min(),SELECT_BY_TICKET)) ShowError;

      if(Bid>OrderOpenPrice()+(TS+Range/2.0)*Point)

        {

         double NewStop=NormalizeDouble(Bid-TS*Point,Digits);

         if(NewStop<=OrderStopLoss()) return;

         Set_StopLoss(NewStop);

         return;

        }

      if(Ask<OrderOpenPrice()-Range/2.0*Point)

        {

         if(!OrderSend(Symbol(),OP_BUY,Orders_SumLots(),Ask,Slippage,0,0,"Order by Pipser "+Symbol(),Magic)) ShowError;

         return;

        }

     }

  }

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

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

// >48D8:0F8O >@45@0 SELL

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

void Modify_Order_Sell(int Ticket)

  {

//------ A;8 >@45@ >48=

   if(Orders_Quant == 1)

     {

      if(!OrderSelect(Ticket,SELECT_BY_TICKET)) ShowError;

      if(Ask<OrderOpenPrice()-TS*Point)

        {

         double NewStop=NormalizeDouble(Ask+TS*Point,Digits);

         if(NewStop>=OrderStopLoss() && OrderStopLoss()!=0) return;

         if(!OrderModify(OrderTicket(),0,NewStop,0,0)) ShowError;

         return;

        }

      if(Bid>OrderOpenPrice()+Range*Point)

        if(!OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"Order by Pipser "+Symbol(),Magic)) ShowError;

      return;

     }

//------ A;8 >@45@>2 1>;LH5 >4=>3>

   if(Orders_Quant > 1)

     {

      if(!OrderSelect(Orders_Find_max(),SELECT_BY_TICKET)) ShowError;

      if(Ask<OrderOpenPrice()-(TS+Range/2.0)*Point)

        {

         double NewStop=NormalizeDouble(Ask+TS*Point,Digits);

         if(NewStop>=OrderStopLoss() && OrderStopLoss()!=0) return;

         Set_StopLoss(NewStop);

         return;

        }

      if(Bid>OrderOpenPrice()+Range/2.0*Point)

        {

         if(!OrderSend(Symbol(),OP_SELL,Orders_SumLots(),Bid,Slippage,0,0,"Order by Pipser "+Symbol(),Magic)) ShowError;

         return;

        }

     }

  }

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

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

// #AB0=02;8205< >48= " =0 2A5 >@45@0

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

void Set_StopLoss(double NewSL)

  {

   for(int i=Orders_Quant-1; i>=0; i--)

     {  

      if(!OrderSelect(Tickets[i],SELECT_BY_TICKET)) ShowError;

      if(NormalizeDouble(OrderStopLoss()-NewSL,Digits) == 0) continue;

      if(!OrderModify(OrderTicket(),0,NewSL,0,0)) ShowError;

     }

  }

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

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