123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- //+------------------------------------------------------------------+
- //| Class Work 02.mq4 |
- //| Copyright 2018, MetaQuotes Software Corp. |
- //| https://www.mql5.com |
- //+------------------------------------------------------------------+
- /*
- Home Work Lesson 02.
- Используя знания, которые Вы приобрели после просмотра этого видео, прошу
- Вас дописать советник, который мы разбирали в видеоматериале следующим образом:
- • Необходимо добавить внешнюю переменную Indent, которая будет являться отступом
- (выше/ниже) от экстремумов цены и учитывая этот параметр уже устанавливать
- лимитные ордера.
- • Выше/ниже экстремумов, на расстоянии PipStop(добавить внешнюю переменную)
- установить стоп-ордера, учитывая StopLoss и TakeProfit, указанные в параметрах
- эксперта.
- */
- #property copyright "Copyright 2018, MetaQuotes Software Corp."
- #property link "https://www.mql5.com"
- #property version "1.00"
- #property strict
- extern int BarCount = 10;
- extern int HourStart = 7;
- extern double Lots = 0.01;
- extern int StopLoss = 300;
- extern int TakeProfit = 600;
- extern int Magic = 12345;
- extern int Indent = 10;
- extern int PipStop = 10;
- double minprice=999999, mp, maxprice=-999999, SL, TP;
- int ticket;
- //+------------------------------------------------------------------+
- //| Expert initialization function |
- //+------------------------------------------------------------------+
- int OnInit()
- {
- //---
-
- //---
- return(INIT_SUCCEEDED);
- }
- //+------------------------------------------------------------------+
- //| Expert deinitialization function |
- //+------------------------------------------------------------------+
- void OnDeinit(const int reason)
- {
-
- }
- //+------------------------------------------------------------------+
- //| Expert tick function |
- //+------------------------------------------------------------------+
- void OnTick()
- {
- GetMinPrice();
- GetMaxPrice();
-
- if(TimeHour(TimeCurrent()) == HourStart)
- {
-
- if(BuyLimitCount() == 0 && BuyCount() == 0)
- {
- SL = NormalizeDouble(minprice - StopLoss*Point, 5);
- TP = NormalizeDouble(minprice + TakeProfit*Point, 5);
- ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice, 3, SL, TP, "", Magic, 0, Blue);
-
- if(ticket < 0)
- Print("unsuccess open BUY order");
- }
-
- if(SellLimitCount() == 0 && SellCount() == 0)
- {
- SL = NormalizeDouble(maxprice + StopLoss*Point, 5);
- TP = NormalizeDouble(maxprice - TakeProfit*Point, 5);
- ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, maxprice, 3, SL, TP, "", Magic, 0, Red);
-
- if(ticket < 0)
- Print("unsuccess open SELL order");
- }
-
- }
-
- Comment(
- "MinPrice: " + DoubleToStr(minprice, 5) + "\n" +
- "MaxPrice: " + DoubleToStr(maxprice, 5) + "\n" +
- "Количество Лимитных ордеров BUY: " + IntegerToString(BuyLimitCount()) + "\n" +
- "Количество Лимитных ордеров SELL: " + IntegerToString(SellLimitCount()) + "\n" +
- "Количество открытых ордеров BUY: " + IntegerToString(BuyCount()) + "\n" +
- "Количество открытых ордеров SELL: " + IntegerToString(SellCount()));
- }
- //+------------------------------------------------------------------+
- int BuyLimitCount() // подсчёт количества лимитных ордеров Buy
- {
- int count = 0;
-
- for(int i = OrdersTotal()-1; i >= 0; i--)
- {
- if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUYLIMIT)
- {
- count++;
- }
- }
-
- return(count);
- }
- int BuyCount() // подсчёт количества открытых ордеров Buy
- {
- int count = 0;
-
- for(int i = OrdersTotal()-1; i >= 0; i--)
- {
- if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
- {
- count++;
- }
- }
-
- return(count);
- }
- int SellLimitCount() // подсчёт количества лимитных ордеров SELL
- {
- int count = 0;
-
- for(int i = OrdersTotal()-1; i >= 0; i--)
- {
- if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELLLIMIT)
- {
- count++;
- }
- }
-
- return(count);
- }
- int SellCount() // подсчёт количества открытых ордеров SELL
- {
- int count = 0;
-
- for(int i = OrdersTotal()-1; i >= 0; i--)
- {
- if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
- {
- count++;
- }
- }
-
- return(count);
- }
- double GetMinPrice() //Получение минимальной цены.
- {
- for(int i=0; i<BarCount; i++)
- {
- mp = iLow(Symbol(), PERIOD_CURRENT, i);
- if(mp < minprice)
- {
- minprice = mp;
- }
- }
- return(minprice);
- }
-
- double GetMaxPrice() //Получение максимальной цены.
- {
- for(int i=0; i<BarCount; i++)
- {
- mp = iHigh(Symbol(), PERIOD_CURRENT, i);
- if(mp > maxprice)
- {
- maxprice = mp;
- }
- }
- return(maxprice);
- }
|