Author: Smirnov Pavel
Price Data Components
Series array that contains close prices for each bar
0 Views
0 Downloads
0 Favorites
gazonkos
ÿþ//+------------------------------------------------------------------+

//|                            gazonkos(barabashkakvn's edition).mq5 |

//|                                                    1H   EUR/USD  |

//|                                                    Smirnov Pavel |

//|                                                 www.autoforex.ru |

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

#property copyright "Smirnov Pavel"

#property link      "www.autoforex.ru"

#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\SymbolInfo.mqh>  

CPositionInfo  m_position;                   // trade position object

CTrade         m_trade;                      // trading object

CSymbolInfo    m_symbol;                     // symbol info object

input ulong  m_magic       = 12345; // magic number

input ushort InpTakeProfit = 16;    // #@>25=L B59:?@>D8B 2 ?C=:B0E

input ushort InpRollback   = 16;    // 5;8G8=0 >B:0B0 2 ?C=:B0E

input ushort InpStopLoss   = 40;    // #@>25=L AB>?;>AA 2 ?C=:B0E

input int    t1            = 3;

input int    t2            = 2;

input ushort InpDelta      = 40;    // iClose(t2)-iClose(t1)

input double lot           = 0.1;   //  07<5@ ?>78F88

input int    active_trades = 1;     // 0:A8<0;L=>5 :>;8G5AB2> >4=>2@5<5==> >B:@KBKE ?>78F89

//---

int STATE=0;

int Trade=0;

double maxprice=0.0;

double minprice=10000.0;

bool cantrade=true;

int LastTradeTime=0;

int LastSignalTime=0;

//---

double ExtTakeProfit       = 0.0;

double ExtRollback         = 0.0;

double ExtStopLoss         = 0.0;

double ExtDelta            = 0.0;

ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;

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

//|                                                                  |

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

bool OpenLong(double volume=0.1)

  {

   bool result=false;

   if(!RefreshRates())

      return(false);



   string comment="gazonkos expert (Long)";



   if(m_trade.Buy(volume,m_symbol.Name(),

      m_symbol.Ask(),

      m_symbol.Ask()-ExtStopLoss,

      m_symbol.Ask()+ExtTakeProfit,comment))

     {

      Print("Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),

            ", description of result: ",m_trade.ResultRetcodeDescription(),

            ", ticket of deal: ",m_trade.ResultDeal());

      result=true;

     }

   else

     {

      Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),

            ", description of result: ",m_trade.ResultRetcodeDescription(),

            ", ticket of deal: ",m_trade.ResultDeal());

      result=false;

     }

   return(result);

  }

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

//|                                                                  |

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

int OpenShort(double volume=0.1)

  {

   bool result=false;

   if(!RefreshRates())

      return(false);



   string comment="gazonkos expert (Short)";



   if(m_trade.Sell(volume,m_symbol.Name(),

      m_symbol.Bid(),

      m_symbol.Bid()+ExtStopLoss,

      m_symbol.Bid()-ExtTakeProfit,comment))

     {

      Print("Sell -> true. Result Retcode: ",m_trade.ResultRetcode(),

            ", description of result: ",m_trade.ResultRetcodeDescription(),

            ", ticket of deal: ",m_trade.ResultDeal());

      result=true;

     }

   else

     {

      Print("Sell -> false. Result Retcode: ",m_trade.ResultRetcode(),

            ", description of result: ",m_trade.ResultRetcodeDescription(),

            ", ticket of deal: ",m_trade.ResultDeal());

      result=false;

     }

   return(result);

  }

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

//| >4AGQB ?>78F89 =0 B5:CI5< A8<2>;5 8 A =C6=K< MagicValue         |

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

int PositionsTotalMagic(ulong MagicValue)

  {

   int total=0;

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions

      if(m_position.SelectByIndex(i))     // 2K18@05< ?>78F8N

         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)

            total++; // AG8B05< B>;L:> B5, C :>B>@KE A>2?0405B A8<2>; 8 magic

//--- >72@0I05< :>;8G5AB2> ?>4AG8B0==KE >@45@>2 A magic = MagicValue.  

   return(total);

  }

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

//| Expert initialization function                                   |

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

int OnInit()

  {

   SetMarginMode();

   if(!IsHedging())

     {

      Print("Hedging only!");

      return(INIT_FAILED);

     }

//---

   m_symbol.Name(Symbol());                  // sets symbol name

   if(!RefreshRates())

     {

      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),

            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));

      return(INIT_FAILED);

     }

   m_symbol.Refresh();

   m_trade.SetExpertMagicNumber(m_magic);    // sets magic number

//--- tuning for 3 or 5 digits

   int digits_adjust=1;

   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)

      digits_adjust=10;



   ExtTakeProfit  = InpTakeProfit * m_symbol.Point() * digits_adjust;

   ExtRollback    = InpRollback   * m_symbol.Point() * digits_adjust;

   ExtStopLoss    = InpStopLoss   * m_symbol.Point() * digits_adjust;

   ExtDelta       = InpDelta      * m_symbol.Point() * digits_adjust;

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---



  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

   if(!RefreshRates())

      return;



   MqlDateTime str1;

   TimeToStruct(TimeCurrent(),str1);



//--- STATE = 0  45< A83=0;0 : =0G0;C @01>BK A>25B=8:0

   if(STATE==0)

     {

      //---

      cantrade=true;

      //--- 70?@5I05< B>@3>20BL ?>:0 =5 =0ABC?8B =>2K9 G0A ?>A;5 ?>A;54=59 

      //--- >B:@KB>9 A45;:8 (GB>1K 871560BL <=>65AB25==KE >B:@K20=89 A45;>: =0 >4=>< 8 B>< 65 G0A>2>< 10@5)    

      if(str1.hour==LastTradeTime)

         cantrade=false;

      //--- ?@>25@O5< =0 4>?CAB8<>5 :>;8G5AB2> >B:@KBKE ?>78F89

      if(PositionsTotalMagic(m_magic)>=active_trades)

         cantrade=false;

      //--- 5A;8 =5 1K;> =8 >4=>3> 70?@5B0 =0 >B:@KB85 A45;>:, 

      //--- B> ?5@5E>48< : >6840=8N A83=0;>2 A8AB5<K =0 >B:@KB85 >@45@>2

      if(cantrade)

         STATE=1;

     }



//--- STATE = 1  45< 8<?C;LA0 (42865=8O) F5=K 

   if(STATE==1)

     {

      if((iClose(t2)-iClose(t1))>ExtDelta) // A83=0; 4;O 2E>40 2 4;8==CN ?>78F8N

        {

         Trade=1; //845=B8D8:0B>@ ?>78F88, 4;O :>B>@>9 ?>;CG5= A83=0; =0 >B:@KB85  "-1" - :>@>B:0O ?>78F8O, "1"-4;8==0O

         maxprice=m_symbol.Bid();   // 70?><8=05< B5:CI55 ?>;>65=85 F5=K (=5>1E>48<> 4;O >?@545;5=8O >B:0B0 2 STATE=2)

         LastSignalTime=str1.hour;  //0?><8=05< 2@5<O ?>;CG5=8O A83=0;0

         STATE=2; // ?5@59B8 2 A;54CNI55 A>AB>O=85

        }



      if((iClose(t1)-iClose(t2))>ExtDelta) // A83=0; 4;O 2E>40 2 :>@>B:CN ?>78F8N

        {

         Trade=-1; // 845=B8D8:0B>@ ?>78F88, 4;O :>B>@>9 ?>;CG5= A83=0; =0 >B:@KB85  "-1" - :>@>B:0O ?>78F8O, "1"-4;8==0O

         minprice=m_symbol.Bid();   // 70?><8=05< B5:CI55 ?>;>65=85 F5=K (=5>1E>48<> 4;O >?@545;5=8O >B:0B0 2 STATE=2)

         LastSignalTime=str1.hour;  //0?><8=05< 2@5<O ?>;CG5=8O A83=0;0

         STATE=2; // ?5@59B8 2 A;54CNI55 A>AB>O=85

        }

     }



//--- STATE = 2 - 45< >B:0B0 F5=K    

   if(STATE==2)

     {

      //--- A;8 =0 10@5 =0 :>B>@>< ?>;CG5= A83=0; =5 ?@>87>H;> >B:0B0,B> ?5@5E>48< 2 A>AB>O=85 STATE=0

      if(LastSignalTime!=str1.hour)

        {

         STATE=0;

         return;

        }

      if(Trade==1) // >68405< >B:0B0 4;O 4;8==>9 ?>78F88

        {

         //--- 5A;8 F5=0 ?>H;0 5I5 2KH5, B> <5=O5< 7=0G5=85 maxprice =0 B5:CI55 7=0G5=85 F5=K

         if(m_symbol.Bid()>maxprice)

            maxprice=m_symbol.Bid();

         //--- ?@>25@O5< =0;8G85 >B:0B0 F5=K ?>A;5 8<?C;LA0 

         if(m_symbol.Bid()<(maxprice-ExtRollback))

            STATE=3; // 5A;8 ?@>87>H5; >B:0B =0 25;8G8=C ExtRollback, B> ?5@5E>48< 2 A>AB>O=85 >B:@KB8O 4;8==>9 ?>78F88

        }

      if(Trade==-1) // >68405< >B:0B0 4;O :>@>B:>9 ?>78F88

        {

         //--- 5A;8 F5=0 ?>H;0 5I5 =865, B> <5=O5< 7=0G5=85 minprice =0 B5:CI55 7=0G5=85 F5=K

         if(m_symbol.Bid()<minprice)

            minprice=m_symbol.Bid();

         //--- ?@>25@O5< =0;8G85 >B:0B0 F5=K ?>A;5 8<?C;LA0

         if(m_symbol.Bid()>(minprice+ExtRollback))

            STATE=3; // 5A;8 ?@>87>H5; >B:0B =0 25;8G8=C ExtRollback, B> ?5@5E>48< 2 A>AB>O=85 >B:@KB8O :>@>B:>9 ?>78F88

        }

     }



//--- STATE = 3 - >B:@K205< ?>78F88 A>3;0A=> ?5@5<5==>9 Trade ("-1" - :>@>B:CN, "1" - 4;8==CN)  

   if(STATE==3)

     {

      if(Trade==1) // >B:@K205< 4;8==CN ?>78F8N

        {

         if(OpenLong(lot)) // 5A;8 ;8==0O ?>78F8O >B:@KB0 C40G=>

           {

            LastTradeTime=str1.hour;   // 70?><8=05< 2@5<O A>25@H5=8O ?>A;54=59 A45;:8

            STATE=0;                   // ?5@5E>48< 2 A>AB>O=85 >6840=8O

           }

        }

      if(Trade==-1) // >B:@K205< :>@>B:CN ?>78F8N

        {

         if(OpenShort(lot)) // 5A;8 :>@>B:0O ?>78F8O >B:@KB0 C40G=>  

           {

            LastTradeTime=str1.hour;   //70?><8=05< 2@5<O A>25@H5=8O ?>A;54=59 A45;:8

            STATE=0;                   //?5@5E>48< 2 A>AB>O=85 >6840=8O

           }

        }

     }

   return;

  }

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

//| Refreshes the symbol quotes data                                 |

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

bool RefreshRates()

  {

//--- refresh rates

   if(!m_symbol.RefreshRates())

      return(false);

//--- protection against the return value of "zero"

   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)

      return(false);

//---

   return(true);

  }

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

//|                                                                  |

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

void SetMarginMode(void)

  {

   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);

  }

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

//|                                                                  |

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

bool IsHedging(void)

  {

   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);

  }

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

//| Get Close for specified bar index                                | 

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

double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)

  {

   if(symbol==NULL)

      symbol=Symbol();

   if(timeframe==0)

      timeframe=Period();

   double Close[1];

   double close=0;

   int copied=CopyClose(symbol,timeframe,index,1,Close);

   if(copied>0) close=Close[0];

   return(close);

  }

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

Comments