Simple_Price_EA

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

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

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

//| Trade classes                                                    |

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

#include <Trade/Trade.mqh> // 2:;NG8< D09; Trade.mqh

CTrade trade; // >1JO28< ?5@5<5==CN 4;O C?@>I5==>3> 4>ABC?0 : B>@3>2K< DC=:F8O<

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

//| Input variables                                                  |

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

input ushort Check_Bars=60; //>;8G5AB2> 10@>2 4;O 0=0;870 ?>2545=8O F5=K

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

//| Global variables                                                 |

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

static double move_up, move_down; // >1JO28< AB0B8G5A:85 ?5@5<5==K5 move_up 8 move_down

double Lots=0.1; // >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O >1JQ<0 ?>78F88

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

//| Expert initialization function                                   |

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

int OnInit()

  {

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

   return(INIT_SUCCEEDED); // 5A;8 4>H;8 AN40, B> 8=8F80;870F8O ?@>H;0 CA?5H=>

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

   EventKillTimer(); // >AB0=>28< 35=5@0F8N A>1KB89 >B B09<5@0

  }

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

//| Timer function                                                   |

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

void OnTimer()

  {

   if(Check_Trading()) // 5A;8 ?@>945=0 ?@>25@:0 2A5E CA;>289, @07@5H0NI8E B>@3>2;N

     {

      int symb_spread=(int)SymbolInfoInteger(_Symbol,SYMBOL_SPREAD); // >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O A?@540

      double symb_point=SymbolInfoDouble(_Symbol,SYMBOL_POINT); // >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O ?C=:B0

      if(Signal_Up()) // 5A;8 5ABL A83=0; 4;O >B:@KB8O 4;8==>9 ?>78F88

        {

         double price_buy=SymbolInfoDouble(_Symbol,SYMBOL_BID); // >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O F5=K Bid

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

            price_buy>0 && // 5A;8 ?>;CG8;8 F5=C Bid 8 >=0 1>;LH5 =C;O

            price_buy==move_up) // 5A;8 F5=0 Bid 4>AB83;0 7=0G5=8O F5=K move_up

            trade.Buy(Lots,_Symbol,price_buy,0,price_buy+(50+symb_spread)*symb_point); // >B:@>5< 4;8==CN ?>78F8N

        }

      if(Signal_Down())

        {

         double price_sell=SymbolInfoDouble(_Symbol,SYMBOL_ASK); // >1JO28< 8 8=8F80;878@C5< ?5@5<5==CN 4;O F5=K Ask

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

            price_sell>0 && // 5A;8 ?>;CG8;8 F5=C Sell 8 >=0 1>;LH5 =C;O

            price_sell==move_down) // 5A;8 F5=0 Ask 4>AB83;0 7=0G5=8O F5=K move_down

            trade.Sell(Lots,_Symbol,price_sell,0,price_sell-(50+symb_spread)*symb_point); // >B:@>5< :>@>B:CN ?>78F8N

        }

     }

  }

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

//|                                                                  |

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

bool Check_Trading()

  {

//---

   ResetLastError(); // A1@>A8< ?5@5<5==CN _LastError 2 =>;L

   if(trade.ResultRetcodeExternal()==TRADE_RETCODE_MARKET_CLOSED)

     {

      Print("H81:0: :>4 2>72@0B0  +  +"! ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))

     {

      Print("H81:0 @07@5H5=8O 02B><0B8G5A:>9 B>@3>2;8 =0 B5@<8=0;5! ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

//---

   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))

     {

      Print("H81:0 @07@5H5=8O 02B><0B8G5A:>9 B>@3>2;8 =0 A5@25@5! ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

//---

   if(!SymbolIsSynchronized(_Symbol))

     {

      Print("H81:0 A8=E@>=878@>20==>AB8 40==KE ?> C:070==><C A8<2>;C! ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

//--- ?@>25@:0 4>AB0B>G=>AB8 A@54AB2 4;O B>@3>2;8

   if(!CheckMoneyForTrade(_Symbol,Lots,ORDER_TYPE_SELL))

     {

      Print("H81:0 ?@>25@:8 4>AB0B>G=>AB8 A@54AB2 4;O B>@3>2;8! ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

//--- ?@>25@:8 :>@@5:B=>AB8 >1JQ<0 A45;:8

   string descript;

   if(!CheckVolumeValue(Lots,descript))

     {

      Print("H81:0 ?@>25@:8 :>@@5:B=>AB8 >1JQ<0 A45;:8! ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

   return(true); // 5A;8 4>H;8 AN40, B> 2>72@0B8< 7=0G5=85 "8AB8=0"

  }

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

//|                                                                  |

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

bool CheckMoneyForTrade(string symb,double lots,ENUM_ORDER_TYPE type)

  {

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

   MqlTick mqltick;

   SymbolInfoTick(symb,mqltick);

   double price=mqltick.ask;

   if(type==ORDER_TYPE_SELL)

      price=mqltick.bid;

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

   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);

//--- 2K7>25< DC=:F8N ?@>25@:8

   if(!OrderCalcMargin(type,symb,lots,price,margin))

     {

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

      Print("H81:0 2 ",__FUNCTION__," >4 >H81:8 = ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

//--- 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("5 E20B05B 45=53 =0 ",EnumToString(type)," ",lots," ",symb," >4 >H81:8 = ",GetLastError());

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

   return(true); // 5A;8 4>H;8 AN40, B> 2>72@0B8< 7=0G5=85 "8AB8=0"

  }

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

//|  @>25@O5B >1J5< >@45@0 =0 :>@@5:B=>ABL                          |

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

bool CheckVolumeValue(double volume,string &description)

  {

//--- <8=8<0;L=> 4>?CAB8<K9 >1J5< 4;O B>@3>2KE >?5@0F89

   double min_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);

   if(volume<min_volume)

     {

      description=StringFormat("1J5< <5=LH5 <8=8<0;L=> 4>?CAB8<>3> SYMBOL_VOLUME_MIN=%.2f",min_volume);

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

//--- <0:A8<0;L=> 4>?CAB8<K9 >1J5< 4;O B>@3>2KE >?5@0F89

   double max_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);

   if(volume>max_volume)

     {

      description=StringFormat("1J5< 1>;LH5 <0:A8<0;L=> 4>?CAB8<>3> SYMBOL_VOLUME_MAX=%.2f",max_volume);

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

//--- ?>;CG8< <8=8<0;L=CN 3@040F8N >1J5<0

   double volume_step=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);

//--- ?@>25@8< =0 :@0B=>ABL <8=8<0;L=>9 3@040F88

   int ratio=(int)MathRound(volume/volume_step);

   if(MathAbs(ratio*volume_step-volume)>0.0000001)

     {

      description=StringFormat("1J5< =5 O2;O5BAO :@0B=K< <8=8<0;L=>9 3@040F88 SYMBOL_VOLUME_STEP=%.2f, \n"

                               "1;8609H89 :>@@5:B=K9 >1J5< %.2f", volume_step,ratio*volume_step);

      return(false); // 2>72@0B8< 7=0G5=85 ";>6L"

     }

   description=">@@5:B=>5 7=0G5=85 >1J5<0";

   return(true); // 5A;8 4>H;8 AN40, B> 2>72@0B8< 7=0G5=85 "8AB8=0"

  }

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

//|                                                                  |

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

bool Signal_Up() // A>74048< DC=:F8N 4;O >B:@KB8O 4;8==>9 ?>78F88

  {

   int candles=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); // ?>;CG8< =><5@ ?5@2>3> 2848<>3> 10@0 =0 3@0D8:5

   double price_low[]; // A>74048< <0AA82 price_low

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

   CopyLow(_Symbol,PERIOD_M1,0,Check_Bars,price_low); // A:>?8@C5< <8=8<0;L=K5 7=0G5=8O F5=K 2 <0AA82

   int candle_low = ArrayMinimum(price_low,0,candles); // =094Q< A0<CN <8=8<0;L=CN F5=C

   MqlRates rates_low[]; // A>74048< <0AA82 rates_low

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

   int Data = CopyRates(_Symbol,PERIOD_M1,0,Check_Bars,rates_low); // A:>?8@C5< =5>1E>48<K5 40==K5 2 <0AA82

   ObjectDelete(0,"SupprtLine"); // C40;8< >1J5:B A 8<5=5< SupprtLine A B5:CI53> 3@0D8:0

   ObjectCreate(0,"SupprtLine",OBJ_HLINE,0,

                rates_low[candle_low].time,rates_low[candle_low].low, // >?@545;8< =0G0;L=CN B>G:C ;8=88

                rates_low[0].time,rates_low[0].low); // >?@545;8< :>=5G=CN B>G:C ;8=88

   ObjectSetInteger(0,"SupprtLine",OBJPROP_COLOR,clrForestGreen); // 704048< F25B ;8=88

   ObjectSetInteger(0,"SupprtLine",OBJPROP_STYLE,STYLE_SOLID); // 704048< AB8;L ;8=88

   ObjectSetInteger(0,"SupprtLine",OBJPROP_WIDTH,3); // 704048< B>;I8=C ;8=88

   ObjectSetInteger(0,"SupprtLine",OBJPROP_RAY_RIGHT,true); // 704048< =0?@02;5=85 ;CG0 @8ACNI53> ;8=8N

   move_up=rates_low[candle_low].low; // ?@8A2>8< ?5@5<5==>9 move_up B5:CI55 7=0G5=85 F5=K low

   return(true);  // 5A;8 4>H;8 AN40, B> 2>72@0B8< 7=0G5=85 "8AB8=0"

  }

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

//|                                                                  |

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

bool Signal_Down() // A>74048< DC=:F8N 4;O >B:@KB8O :>@>B:>9 ?>78F88

  {

   int candles=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0); // ?>;CG8< =><5@ ?5@2>3> 2848<>3> 10@0 =0 3@0D8:5

   double price_high[]; // A>74048< <0AA82 price_high

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

   CopyHigh(_Symbol,PERIOD_M1,0,Check_Bars,price_high); // A:>?8@C5< <0:A8<0;L=K5 7=0G5=8O F5=K 2 <0AA82

   int candle_high = ArrayMaximum(price_high,0,candles); // =094Q< A0<CN <0:A8<0;L=CN F5=C

   MqlRates rates_high[]; // A>74048< <0AA82 rates_high

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

   int Data = CopyRates(_Symbol,PERIOD_M1,0,Check_Bars,rates_high); // A:>?8@C5< =5>1E>48<K5 40==K5 2 <0AA82

   ObjectDelete(0,"ResistanceLine"); // C40;8< >1J5:B A 8<5=5< ResistanceLine A B5:CI53> 3@0D8:0

   ObjectCreate(0,"ResistanceLine",OBJ_HLINE,0,

                rates_high[candle_high].time,rates_high[candle_high].high, // >?@545;8< =0G0;L=CN B>G:C ;8=88

                rates_high[0].time,rates_high[0].high); // >?@545;8< :>=5G=CN B>G:C ;8=88

   ObjectSetInteger(0,"ResistanceLine",OBJPROP_COLOR,clrDarkOrange); // 704048< F25B ;8=88

   ObjectSetInteger(0,"ResistanceLine",OBJPROP_STYLE,STYLE_SOLID); // 704048< AB8;L ;8=88

   ObjectSetInteger(0,"ResistanceLine",OBJPROP_WIDTH,3); // 704048< B>;I8=C ;8=88

   ObjectSetInteger(0,"ResistanceLine",OBJPROP_RAY_RIGHT,true); // 704048< =0?@02;5=85 ;CG0 @8ACNI53> ;8=8N

   move_down=rates_high[candle_high].high; // ?@8A2>8< ?5@5<5==>9 move_down B5:CI55 7=0G5=85 F5=K high

   return(true); // 5A;8 4>H;8 AN40, B> 2>72@0B8< 7=0G5=85 "8AB8=0"

  }

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

Comments