Home Work 02.mq4 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. //+------------------------------------------------------------------+
  2. //| Class Work 02.mq4 |
  3. //| Copyright 2018, MetaQuotes Software Corp. |
  4. //| https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. /*
  7. Home Work Lesson 02.
  8. Используя знания, которые Вы приобрели после просмотра этого видео, прошу
  9. Вас дописать советник, который мы разбирали в видеоматериале следующим образом:
  10. • Необходимо добавить внешнюю переменную Indent, которая будет являться отступом
  11. (выше/ниже) от экстремумов цены и учитывая этот параметр уже устанавливать
  12. лимитные ордера.
  13. • Выше/ниже экстремумов, на расстоянии PipStop(добавить внешнюю переменную)
  14. установить стоп-ордера, учитывая StopLoss и TakeProfit, указанные в параметрах
  15. эксперта.
  16. */
  17. #property copyright "Copyright 2018, MetaQuotes Software Corp."
  18. #property link "https://www.mql5.com"
  19. #property version "1.00"
  20. #property strict
  21. extern int BarCount = 10;
  22. extern int HourStart = 7;
  23. extern double Lots = 0.01;
  24. extern int StopLoss = 300;
  25. extern int TakeProfit = 600;
  26. extern int Magic = 12345;
  27. extern int Indent = 10;
  28. extern int PipStop = 10;
  29. double minprice=999999, mp, maxprice=-999999, SL, TP;
  30. int ticket;
  31. //+------------------------------------------------------------------+
  32. //| Expert initialization function |
  33. //+------------------------------------------------------------------+
  34. int OnInit()
  35. {
  36. //---
  37. //---
  38. return(INIT_SUCCEEDED);
  39. }
  40. //+------------------------------------------------------------------+
  41. //| Expert deinitialization function |
  42. //+------------------------------------------------------------------+
  43. void OnDeinit(const int reason)
  44. {
  45. }
  46. //+------------------------------------------------------------------+
  47. //| Expert tick function |
  48. //+------------------------------------------------------------------+
  49. void OnTick()
  50. {
  51. GetMinPrice();
  52. GetMaxPrice();
  53. if(TimeHour(TimeCurrent()) == HourStart)
  54. {
  55. if(BuyLimitCount() == 0 && BuyCount() == 0)
  56. {
  57. SL = NormalizeDouble(minprice - StopLoss*Point, 5);
  58. TP = NormalizeDouble(minprice + TakeProfit*Point, 5);
  59. ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice, 3, SL, TP, "", Magic, 0, Blue);
  60. if(ticket < 0)
  61. Print("unsuccess open BUY order");
  62. }
  63. if(SellLimitCount() == 0 && SellCount() == 0)
  64. {
  65. SL = NormalizeDouble(maxprice + StopLoss*Point, 5);
  66. TP = NormalizeDouble(maxprice - TakeProfit*Point, 5);
  67. ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, maxprice, 3, SL, TP, "", Magic, 0, Red);
  68. if(ticket < 0)
  69. Print("unsuccess open SELL order");
  70. }
  71. }
  72. Comment(
  73. "MinPrice: " + DoubleToStr(minprice, 5) + "\n" +
  74. "MaxPrice: " + DoubleToStr(maxprice, 5) + "\n" +
  75. "Количество Лимитных ордеров BUY: " + IntegerToString(BuyLimitCount()) + "\n" +
  76. "Количество Лимитных ордеров SELL: " + IntegerToString(SellLimitCount()) + "\n" +
  77. "Количество открытых ордеров BUY: " + IntegerToString(BuyCount()) + "\n" +
  78. "Количество открытых ордеров SELL: " + IntegerToString(SellCount()));
  79. }
  80. //+------------------------------------------------------------------+
  81. int BuyLimitCount() // подсчёт количества лимитных ордеров Buy
  82. {
  83. int count = 0;
  84. for(int i = OrdersTotal()-1; i >= 0; i--)
  85. {
  86. if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUYLIMIT)
  87. {
  88. count++;
  89. }
  90. }
  91. return(count);
  92. }
  93. int BuyCount() // подсчёт количества открытых ордеров Buy
  94. {
  95. int count = 0;
  96. for(int i = OrdersTotal()-1; i >= 0; i--)
  97. {
  98. if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
  99. {
  100. count++;
  101. }
  102. }
  103. return(count);
  104. }
  105. int SellLimitCount() // подсчёт количества лимитных ордеров SELL
  106. {
  107. int count = 0;
  108. for(int i = OrdersTotal()-1; i >= 0; i--)
  109. {
  110. if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELLLIMIT)
  111. {
  112. count++;
  113. }
  114. }
  115. return(count);
  116. }
  117. int SellCount() // подсчёт количества открытых ордеров SELL
  118. {
  119. int count = 0;
  120. for(int i = OrdersTotal()-1; i >= 0; i--)
  121. {
  122. if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
  123. {
  124. count++;
  125. }
  126. }
  127. return(count);
  128. }
  129. double GetMinPrice() //Получение минимальной цены.
  130. {
  131. for(int i=0; i<BarCount; i++)
  132. {
  133. mp = iLow(Symbol(), PERIOD_CURRENT, i);
  134. if(mp < minprice)
  135. {
  136. minprice = mp;
  137. }
  138. }
  139. return(minprice);
  140. }
  141. double GetMaxPrice() //Получение максимальной цены.
  142. {
  143. for(int i=0; i<BarCount; i++)
  144. {
  145. mp = iHigh(Symbol(), PERIOD_CURRENT, i);
  146. if(mp > maxprice)
  147. {
  148. maxprice = mp;
  149. }
  150. }
  151. return(maxprice);
  152. }