Simple_Three_Inside_Pattern_EA

Author: Copyright 2024, MrBrooklin
0 Views
0 Downloads
0 Favorites
Simple_Three_Inside_Pattern_EA
ÿþ//+------------------------------------------------------------------+

//|                               Simple_Three_Inside_Pattern_EA.mq5 |

//|                                       Copyright 2024, MrBrooklin |

//|                         https://www.mql5.com/ru/users/mrbrooklin |

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

#property copyright "Copyright 2024, MrBrooklin"

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

#property version   "1.00"

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

//| Input parameters                                                 |

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

input ushort Stop_Loss    = 500;  // !B>?-;>AA

input ushort Take_Profit  = 500;  // "59:-?@>D8B

input double Lot          = 0.1;  // >B

input ulong  Magic_Number = 3119; // 038G5A:89 =><5@

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

//| Global variables                                                 |

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

MqlTick             mql_tick;

MqlRates            mql_rates[];

MqlTradeRequest     request;

MqlTradeResult      result;

MqlTradeCheckResult check_result;

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

//|                                                                  |

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

int OnInit()

  {

   EventSetTimer(60); // 70?CAB8< 35=5@0F8N A>1KB89 >B B09<5@0 A C:070==>9 ?5@8>48G=>ABLN (60 A5:C=4)

   ArraySetAsSeries(mql_rates, true); // 704048< =0?@02;5=85 8=45:A0F88 M;5<5=B>2 2 <0AA825

   return(INIT_SUCCEEDED); // 4>H;8 AN40, 7=0G8B 8=8F80;870F8O A>25B=8:0 ?@>H;0 C40G=>

  }

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

//|                                                                  |

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

void OnDeinit(const int reazon)

  {

   EventKillTimer(); // >AB0=>28< 35=5@0F8N A>1KB89 >B B09<5@0 4;O 40==>3> A>25B=8:0

  }

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

//|                                                                  |

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

void OnTimer()

  {

   Trade_Three_Inside_Pattern(); // B>@3C5< ?@8 ?>O2;5=88 ?0BB5@=0 ""@8 87=CB@8"

  }

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

//|                                                                  |

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

void Trade_Three_Inside_Pattern()

  {

   if(PositionsTotal() == 0 && // 5A;8 >1I55 :>;8G5AB2> ?>78F89 @02=> =C;N

      !PositionSelect(_Symbol)) // 8 5A;8 ?> B5:CI5<C A8<2>;C =5B >B:@KBKE ?>78F89

     {

      int copy_rates = CopyRates(_Symbol, PERIOD_H1, 0, 4, mql_rates); // :>?8@C5< 8AB>@8G5A:85 40==K5 2 <0AA82 mql_rates

      if(copy_rates > 0) // 5A;8 8AB>@8G5A:85 40==K5 2 <0AA82 mql_rates A:>?8@>20=K

        {

         // 5A;8 AD>@<8@>20;AO 1KG89 ?0BB5@= ""@8 87=CB@8"

         if(mql_rates[3].open  >  mql_rates[3].close &&

            mql_rates[2].open  <  mql_rates[2].close &&

            mql_rates[2].open  >  mql_rates[3].low   &&

            mql_rates[2].close <  mql_rates[3].high  &&

            mql_rates[1].open  <  mql_rates[1].close &&

            mql_rates[1].open  >  mql_rates[2].open  &&

            mql_rates[1].open  <  mql_rates[2].close &&

            mql_rates[1].close >  mql_rates[3].high)

            Open_Pos(ORDER_TYPE_BUY); // >B:@K205< 4;8==CN ?>78F8N



         // 5A;8 AD>@<8@>20;AO <5425689 ?0BB5@= ""@8 87=CB@8"

         if(mql_rates[3].open  <  mql_rates[3].close &&

            mql_rates[2].open  >  mql_rates[2].close &&

            mql_rates[2].open  <  mql_rates[3].high  &&

            mql_rates[2].close >  mql_rates[3].low   &&

            mql_rates[1].open  >  mql_rates[1].close &&

            mql_rates[1].open  <  mql_rates[2].open  &&

            mql_rates[1].open  >  mql_rates[2].close &&

            mql_rates[1].close <  mql_rates[3].low)

            Open_Pos(ORDER_TYPE_SELL); // >B:@K205< :>@>B:CN ?>78F8N

        }

     }

  }

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

//|                                                                  |

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

bool Open_Pos(ENUM_ORDER_TYPE type)

  {

   if(Check_Margin()) // 5A;8 A2>1>4=KE A@54AB2 2 20;NB5 45?>78B0 4>AB0B>G=> 4;O >B:@KB8O ?>78F88

     {

      int k = type == ORDER_TYPE_BUY ? 1 : -1;

      double price = type == ORDER_TYPE_BUY ? SymbolInfoDouble(Symbol(), SYMBOL_ASK) :

                     SymbolInfoDouble(Symbol(), SYMBOL_BID);

      ZeroMemory(request);      // >1=C;8< ?5@5<5==CN request

      ZeroMemory(result);       // >1=C;8< ?5@5<5==CN result

      ZeroMemory(check_result); // >1=C;8< ?5@5<5==CN check_result

      //--- CAB0=>28< ?0@0<5B@K 70?@>A0 4;O A>25@H5=8O B>@3>2>9 >?5@0F88

      request.action    = TRADE_ACTION_DEAL;                // B8? B>@3>2>9 >?5@0F88

      request.symbol    = _Symbol;                          // A8<2>;

      request.volume    = GetLot();                         // >1J5< 2 ;>B0E

      request.type      = type;                             // B8? >@45@0

      request.price     = price;                            // F5=0 4;O >B:@KB8O

      request.sl        = price - Stop_Loss * _Point * k;   // AB>?-;>AA

      request.tp        = price + Take_Profit * _Point * k; // B59:-?@>D8B

      request.deviation = 5;                                // 4>?CAB8<>5 >B:;>=5=85 >B F5=K

      request.magic     = Magic_Number;                     // MagicNumber >@45@0

      //---?@>25@:0 >@45@0 =0 4>AB0B>G=>ABL A@54AB2 4;O A>25@H5=8O B>@3>2>9 >?5@0F88

      bool check_order = OrderCheck(request,check_result);

      if(check_result.retcode != TRADE_RETCODE_DONE)        // 5A;8 70O2:0 =5 2K?>;=5=0

         Print(check_result.retcode, ":_", check_result.comment); // 2K2545< :>4 >H81:8

      //--- >B?@02:0 70?@>A0 =0 A>25@H5=85 B>@3>2>9 >?5@0F88

      if(!OrderSend(request,result)) // 5A;8 >B?@028BL 70?@>A =5 C40;>AL,

         PrintFormat("OrderSend error %d",GetLastError());  // 2K2545< :>4 >H81:8

      //--- 8=D>@<0F8O >1 >?5@0F88

      PrintFormat("retcode=%u  deal=%I64u  order=%I64u", result.retcode, result.deal, result.order);

      //--- ?@>25@:0 ?@>H;0 CA?5H=>

     }

   return(true);

  }

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

//|                                                                  |

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

double GetLot()

  {

   double lot = Lot; // >1JO28< 8 8=8F0;878@C5< ?5@5<5==CN lot

   double min_volume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN); // ?>;CG8< min 7=0G5=85 ;>B0

   double max_volume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX); // ?>;CG8< max 7=0G5=85 ;>B0

   if(lot < min_volume) // 5A;8 7040==K9 ;>B <5=LH5 <8=8<0;L=>3> 7=0G5=8O

      lot = min_volume; // ?5@5<5==>9 lot ?@8A2>8< min 7=0G5=85 ;>B0

   if(lot > max_volume) // 5A;8 7040==K9 ;>B 1>;LH5 <0:A8<0;L=>3> 7=0G5=8O

      lot = max_volume; // ?5@5<5==>9 lot ?@8A2>8< max 7=0G5=85 ;>B0

   return(lot); // 25@=Q< 7=0G5=85 ;>B0

  }

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

//|                                                                  |

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

bool Check_Margin()

  {

//--- ?>;CG8< F5=C >B:@KB8O

   SymbolInfoTick(_Symbol, mql_tick);

   double price = mql_tick.ask;

//--- 7=0G5=8O =5>1E>48<>9 8 A2>1>4=>9 <0@68

   double margin, free_margin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);

   if(!OrderCalcMargin(ORDER_TYPE_BUY, _Symbol, GetLot(), price, margin))

     {

      // GB>-B> ?>H;> =5 B0:, A>>1I8< 8 25@=5< false

      Print("Error in ", __FUNCTION__, " code=", GetLastError());

      return(false);

     }

//--- 5A;8 =5 E20B05B A@54AB2 =0 ?@>2545=85 >?5@0F88

   if(margin > free_margin)

     {

      // A>>1I8< >1 >H81:5 8 25@=5< false

      Print("Not enough money! ", "Error code=", GetLastError());

      return(false);

     }

   return(true);

  }

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

Comments