Перейти к содержанию

Изучение MQL4 по урокам на Tradelikeapro личный дневник


Рекомендуемые сообщения

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Урок 1.

Начал месяца четыре назад. Прослушал весь урок. Стал выполнять домашнее задание. Не получается. Никак не компилируется. Несколько дней искал ошибку. Пришел к выводу, что программирование это не мое. Забросил.

Примерно неделю назад понял, что программистская кавалерия особо не спешит решать мои хотелки с роботами, а мотивировать мне сейчас особо нечем, полез сам снова. Нашел эти долбанные точку с запятой, которые каким то образом оказались там, где вообще не должны были быть. Наконец заработало. Решил еще раз проверить дано мне или не дано в 40 лет снова.

 

Спойлер

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int x = 1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
 {
 
  if (x == 1)
    {
    Print ("Всем привет");
    Comment ("Tradelikeapro forever");
    }
  else 
    {
    Print ("Instamustdie");
    Comment ("Instamustdie");
    }
 }

 

Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Урок  2.

Неделю медитирую на второй урок. Пытаюсь понять, к чему каждая буковка и пробел. Просматриваю урок и сразу за xbms забиваю код. Все, вроде код такой же, а код также не работает. Он компилируется. Встает на график, но через раз, либо совсем виснет терминал, либо ничего не происходит, а потом когда, я уже запарюсь ждать и отвлекусь куда-то он начинает открывать ордера на каждом тике.

Спойлер

#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  = 11;
extern double Lots       = 0.1;
extern int    StopLoss   = 300;
extern int    Takeprofit = 200;
extern int    Magic      = 12345;

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 ("не удалось открыть лимитный ордер на покупку");
     }
     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 ("не удалось открыть лимитный ордер на продажу");
     }
           
  }
  
  Comment("minprice: " + DoubleToStr(minprice, 5) + "\n"+
          "maxprice: " + DoubleToStr(maxprice, 5));
}
//+------------------------------------------------------------------+
int BuyLimitCount()
{
   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 SellLimitCount()
{
   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 BuyCount()
{
   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 SellCount()
{
   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);
}
//+------------------------------------------------------------------+
void getminprice()
{
for(int i=0; i<barcount; i++) 
  {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp < minprice)
       minprice = mp; 
  } 
  return;
}
//+------------------------------------------------------------------+
void getmaxprice()
{
for(int i=0; i<barcount; i++)
  {
    mp = iHigh(Symbol(), PERIOD_CURRENT, i);
    if(mp > maxprice)
       maxprice = mp;
  } 
  return;
}

xbms  не отвечает. Сам я ошибку найти не могу. Если код не начнет работать, то и д/з нет смысла делать, так как оно на этом же коде.

Может кто посмотрит, что не так с кодом? Так как уроки сделаны давно, терминал много раз обновлялся, может и код слегка изменился?

Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Я проверить не могу, но в целом мы уроки, которые устарели обновляли. 

 

@xbms 

я предлагал продолжить работу над уроками в начале года, сказал что занят другими делами....

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Внесите изменения в функции подсчета ордеров, у вас их четыре. В настоящем виде они уходят в бесконечный цикл, поэтому виснет терминал.

Необходимо поправить цикл for. Цикл повторяется, пока выражение (i<=0) не станет ложным, если оно ложно, цикл заканчивается. В вашем случае, выражение всегда истинно, т.к. OrdersTotal() = 0.

 

for(int i=OrdersTotal()-1; i<=0; i--)

заменить на 

for(int i=OrdersTotal()-1; i>0; i--)

 

Постараюсь следить за веткой и оказывать посильную помощь. 

  • Лайк 4
  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Все заработало. Спасибо! Естественно никакие обновления терминала тут не при чем, проблема в моей невнимательности и непонимании кода, еще.

  • Огонь! 1
Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Павел, коллеги, день добрый!

 

Прошу прощения, был очень занят, навалилось всякого...

Попробуем продолжить уроки через недельку, осталось вроде не так много разгрести.

 

  • Лайк 3
  • Спасибо 1
  • Огонь! 3
Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Со вторым домашним заданием получилось быстрее, чем с первым. Значительно. Работает.

 

Спойлер

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern bool   LimitTrueStopFalse = false;
extern int    PipStop            = 20;
extern int    Intend             = 20;
extern int    barcount           = 10;
extern int    HourStart          = 11;
extern double Lots               = 0.1;
extern int    StopLoss           = 300;
extern int    Takeprofit         = 200;
extern int    Magic              = 12345;

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 && LimitTrueStopFalse == true)
  {
     if(BuyLimitCount() == 0 && BuyCount() == 0)
     {
        SL = NormalizeDouble(minprice + Intend*Point - StopLoss*Point, 5);
        TP = NormalizeDouble(minprice + Intend*Point + Takeprofit*Point, 5);
        Ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, minprice + Intend*Point, 3, SL, TP, "", Magic, 0, Blue);
     
        if (Ticket < 0)
           Print ("не удалось открыть лимитный ордер на покупку");
     }
     if(SellLimitCount() == 0 && SellCount() == 0)
     {
        SL = NormalizeDouble(maxprice - Intend*Point + StopLoss*Point, 5);
        TP = NormalizeDouble(maxprice - Intend*Point - Takeprofit*Point, 5);
        Ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, maxprice - Intend*Point, 3, SL, TP, "", Magic, 0, Red);
     
        if (Ticket < 0)
           Print ("не удалось открыть лимитный ордер на продажу");
     }
  }
  
  if(TimeHour(TimeCurrent()) == HourStart && LimitTrueStopFalse == false)  
  {
     if(BuyStopCount() == 0 && BuyCount() == 0)
     {
        SL = NormalizeDouble(maxprice + PipStop*Point - StopLoss*Point, 5);
        TP = NormalizeDouble(maxprice + PipStop*Point + Takeprofit*Point, 5);
        Ticket = OrderSend(Symbol(), OP_BUYSTOP, Lots, maxprice + PipStop*Point, 3, SL, TP, "", Magic, 0, Blue);
     
        if (Ticket < 0)
           Print ("не удалось открыть лимитный ордер на покупку");
     }
     if(SellStopCount() == 0 && SellCount() == 0)
     {
        SL = NormalizeDouble(minprice - PipStop*Point + StopLoss*Point, 5);
        TP = NormalizeDouble(minprice - PipStop*Point - Takeprofit*Point, 5);
        Ticket = OrderSend(Symbol(), OP_SELLSTOP, Lots, minprice - PipStop*Point, 3, SL, TP, "", Magic, 0, Red);
     
        if (Ticket < 0)
           Print ("не удалось открыть лимитный ордер на продажу");
     }      
  }
  
  Comment("minprice: " + DoubleToStr(minprice, 5) + "\n"+
          "maxprice: " + DoubleToStr(maxprice, 5));
}
//+------------------------------------------------------------------+
int BuyLimitCount()
{
   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 SellLimitCount()
{
   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 BuyStopCount()
{
   int count = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && 
          OrderMagicNumber() == Magic && 
          OrderType() == OP_BUYSTOP)
         {
            count++;
         }
   }
   
   return(count);
}
//+------------------------------------------------------------------+
int SellStopCount()
{
   int count = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && 
          OrderMagicNumber() == Magic && 
          OrderType() == OP_SELLSTOP)
         {
            count++;
         }
   }
   
   return(count);
}
//+------------------------------------------------------------------+
int BuyCount()
{
   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 SellCount()
{
   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);
}
//+------------------------------------------------------------------+
void getminprice()
{
for(int i=0; i<barcount; i++) 
  {
    mp = iLow(Symbol(), PERIOD_CURRENT, i);
    if(mp < minprice)
       minprice = mp; 
  } 
  return;
}
//+------------------------------------------------------------------+
void getmaxprice()
{
for(int i=0; i<barcount; i++)
  {
    mp = iHigh(Symbol(), PERIOD_CURRENT, i);
    if(mp > maxprice)
       maxprice = mp;
  } 
  return;
}

 

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано (изменено)

Урок 3.

 

AAa - aa. mq4 файл индикатора TMA_fair не компилируется, выдает ошибки. При этом скачанный ex.4 файл работает нормально.

 

Переменная char в конце кода, видимо была зарезервирована в последних версиях терминала. Изменил название переменной, все заработало, вроде.

TMA_Fair_.mq4

Изменено пользователем eBaykal
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Домашнее задание к третьему уроку.

 

Спойлер

//+------------------------------------------------------------------+
//|                                                        Test4.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

//------------------------------------------------------------------
extern double Lots                            = 0.1;
extern int    TakeProfit                      = 300;
extern int    StopLoss                        = 50;
extern int    TakeProfitStop                  = 5;
extern int    StopLossStop                    = 20;
extern int    Magic                           = 111;
extern int    MagicStop                       = 112;
extern int    Slippage                        = 3;
extern bool   BorderCloseTrueMediomCloseFalse = True;
extern bool   AddStopOrdersFalse              = True;
extern int    StopOrdersShift                 = 20;
//------------------------------------------------------------------
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56;
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
//------------------------------------------------------------------
double PriceHigh, PriceLow, PriceMedium, SL, TP, BuyStopPrice, SellStopPrice;
int Ticket, Ticket2, Ticket3;

int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      StopLoss       *= 10;
      Slippage       *= 10;
      TakeProfitStop *= 10;
      StopLossStop   *= 10;
   } 
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   PriceHigh   = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
   PriceLow    = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);
   PriceMedium = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 0, 0);
   
   Comment("PriceMedium: " + DoubleToStr(PriceMedium, 5));
   
   if(CountSell() == 0 && Bid >= PriceHigh)
   {
      Ticket = OrderSend(OrderSymbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
      if (Ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(Ticket, SELECT_BY_TICKET))
             if(!OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0))
                Print("Ошибка модификации ордера на продажу");
               
      } else Print("Ошибка открытия ордера на продажу");
   }
    
    if(CountBuy() == 0 && Ask <= PriceLow)
    {
      Ticket = OrderSend(OrderSymbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
      if (Ticket > 0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(Ticket, SELECT_BY_TICKET))
             if(!OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0))
                Print("Ошибка модификации ордера на покупку");  
      } else Print("Ошибка открытия ордера на покупку");
     } 
      if (Ask <= PriceLow && CountSell() > 0 && BorderCloseTrueMediomCloseFalse == True)
      {
         for (int i = OrdersTotal() - 1; i>=0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderMagicNumber() == Magic && OrderType() == OP_SELL)
                  if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
                     Print("Ошибка закрытия ордера");
            }
         }
      }
      
      if (Ask <= PriceMedium && CountSell() > 0 && BorderCloseTrueMediomCloseFalse == False)
      {
         for (int i = OrdersTotal() - 1; i>=0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderMagicNumber() == Magic && OrderType() == OP_SELL)
                  if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
                     Print("Ошибка закрытия ордера");
            }
         }
      }
      
      if (Bid >= PriceHigh && CountBuy() > 0 && BorderCloseTrueMediomCloseFalse == True)
      {
         for (int i = OrdersTotal() - 1; i>=0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderMagicNumber() == Magic && OrderType() == OP_BUY)
                  if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
                     Print("Ошибка закрытия ордера на покупку");
            }
         }
      }
      
      if (Bid >= PriceMedium && CountBuy() > 0 && BorderCloseTrueMediomCloseFalse == False)
      {
         for (int i = OrdersTotal() - 1; i>=0; i--)
         {
            if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if(OrderMagicNumber() == Magic && OrderType() == OP_BUY)
                  if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
                     Print("Ошибка закрытия ордера на покупку");
            }
         }
      }
      
      if(CountSell() > 0 && BuyStopCount() == 0 && exBuyStopCount() == 0 && AddStopOrdersFalse == False && OrderSelect(Ticket, SELECT_BY_TICKET) == true)
      {
         BuyStopPrice = NormalizeDouble(OrderOpenPrice() + StopOrdersShift*Point, Digits);
         SL           = NormalizeDouble(BuyStopPrice - StopLossStop*Point, Digits);
         TP           = NormalizeDouble(BuyStopPrice + TakeProfitStop*Point, Digits);
         
         Ticket2 = OrderSend(OrderSymbol(), OP_BUYSTOP, Lots, BuyStopPrice, Slippage, SL, TP, "TMA robot stoporder", MagicStop, 0, Blue);
         
         //if(Ticket2 > 0)
         //{
           // if (OrderSelect(Ticket2, SELECT_BY_TICKET))
             //if(!OrderModify(Ticket2, OrderOpenPrice(), SL, TP, 0))
               // Print("Ошибка модификации стопордера на продажу");
         //}else Print("Ошибка открытия стопордера на продажу");
      }
       if(CountBuy() > 0 && SellStopCount() == 0 && exSellStopCount() ==0 && AddStopOrdersFalse == False && OrderSelect(Ticket, SELECT_BY_TICKET) == true)
      {
         SellStopPrice = NormalizeDouble(OrderOpenPrice() - StopOrdersShift*Point, Digits);
         SL            = NormalizeDouble(SellStopPrice + StopLossStop*Point, Digits);
         TP            = NormalizeDouble(SellStopPrice - TakeProfitStop*Point, Digits);
         
         Ticket3 = OrderSend(OrderSymbol(), OP_SELLSTOP, Lots, SellStopPrice, Slippage, SL, TP, "TMA robot stoporder", MagicStop, 0, Red);
         
         //if(Ticket3 > 0)
         //{
           // if (OrderSelect(Ticket3, SELECT_BY_TICKET))
             //if(!OrderModify(Ticket3, OrderOpenPrice(), SL, TP, 0))
               // Print("Ошибка модификации стопордера на продажу");
         //}else Print("Ошибка открытия стопордера на продажу");
      }           
}
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            count++;
      }   
   }
   return(count); 
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   
   for (int trade = OrdersTotal()-1; trade >= 0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            count++;
      }   
   }
   return(count); 
}  
//+------------------------------------------------------------------+
int BuyStopCount()
{
   int scount = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && 
          OrderMagicNumber() == MagicStop && 
          OrderType() == OP_BUYSTOP)
         {
            scount++;
         }
   }
   
   return(scount);
}
//+------------------------------------------------------------------+
int SellStopCount()
{
   int scount = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && 
          OrderMagicNumber() == MagicStop && 
          OrderType() == OP_SELLSTOP)
         {
            scount++;
         }
   }
   
   return(scount);
}
//+------------------------------------------------------------------+
int exSellStopCount()
{
   int exscount = 0;
   
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicStop && OrderType() == OP_SELL)
            exscount++;
      }   
   }
   return(exscount);
}
//+------------------------------------------------------------------+
int exBuyStopCount()
{
   int exscount = 0;
   
   for (int trade = OrdersTotal()-1; trade >= 0; trade--)
   {
      if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicStop && OrderType() == OP_BUY)
            exscount++;
      }   
   }
   return(exscount);
}   

 

Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Пара вопросов по третьему уроку:

 

1) Кусок кода:

Спойлер

if (OrderSelect(Ticket, SELECT_BY_TICKET))
             if(!OrderModify(Ticket, OrderOpenPrice(), SL, TP, 0))
                Print("Ошибка модификации ордера на продажу");

 

почему то нет фигурных скобок, хотя везде,, где я еще видел в таких случаях, вложенные условия, они есть. Компилируется и с ними.

 

2) Отличный тест, дайте денег на памм по ценам открытия. Когда запустил тест на котировках  TDS2 сначала стал строчить покупки. По графику в визуальном режиме посмотрел, что верхние и нижние границы канала, он начинает считать не сразу, а через какое-то количество баров, в отличие от средней линии. Тогда как при тесте по контрольным точкам, границы канала показываются сразу. Как исправить?

Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

@eBaykal  если нет фигурных скобок, то выполняется 1 оператор или функция - и ошибок нет. Скобки позволяют сгруппировать несколько операторов.

 

Если тиковые котировки условно с 1.01.ХХ и тест начинаете с 1.01.ХХ, то из-за отсутствия истории "ДО" индикаторы могут некорректно работать. Советую сдвигать начало теста на месяц или подгружать лишний месяц до даты старта теста.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Урок 4.

 

Почему-то опять не получается сделать также идеально как в уроке. Ошибки и предупреждения, которые удалялись в конце урока удалил. Остались свои предупреждения.

 

Спойлер

//+------------------------------------------------------------------+
//|                                                       Martin.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lots       = 0.1;
extern int    TakeProfit = 50;
extern int    Step       = 50;
extern double Multiplier = 2;
extern int    Magic      = 123;

int ticket, tp, price, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit *= 10;
      Step       *= 10;
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double ima = iMA(Symbol(), PERIOD_H1, 14, 0,MODE_SMA, PRICE_CLOSE, 1);
   
   if(CountTrades() == 0)
   {
   
      if(Ask < ima)
        {
           tp = NormalizeDouble(Ask + TakeProfit*Point, Digits);
           ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, 0, tp, "1 ордер", Magic, 0, Blue);
        }
        else
        {
           tp = NormalizeDouble(Bid - TakeProfit*Point, Digits);
           ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, 0, tp, "1 ордер", Magic, 0, Red);
        }
    }
    else
    {
       int order_type = FindLastOrderType();
       if(OrderType() == OP_BUY)
       {
          price = FindLastOrderPrice(OP_BUY);
          if (Ask <= price - Step*Point)
          { 
             lastlot = FindLastLots(OP_BUY);
             lastlot = NormalizeDouble(lastlot*Multiplier, 2);
             ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0, 0, "", Magic, 0, Blue);
             if(ticket<1)
                Print("Ошибка открытия ордера на покупку");
             ModifyOrders(OP_BUY);
          }
       }
       if(OrderType() == OP_SELL)
       {
          price = FindLastOrderPrice(OP_SELL);
          if (Bid >= price + Step*Point)
          { 
             lastlot = FindLastLots(OP_SELL);
             lastlot = NormalizeDouble(lastlot*Multiplier, 2);
             ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0, 0, "", Magic, 0, Red);
             if(ticket<1)
                Print("Ошибка открытия ордера на продажу");
             ModifyOrders(OP_SELL);
          }
       }
    }
   
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
   double avg_price, order_lots = 0;
   price = 0;
   
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots(); 
            order_lots += OrderLots();
         }
      }
   }
   avg_price = NormalizeDouble(price / order_lots, Digits);
   if (otype == OP_BUY)  tp = NormalizeDouble(avg_price + TakeProfit*Point, Digits);
   if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits); 
   
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
               Print("Ордера успешно модифицированы!");
            else Print("Ошибка модификации ордеров!");   
         }
      }
   }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   int oldticket;
   double oldlots=0;
   ticket = 0;
  
   for (int cnt=OrdersTotal()-1; cnt>=0; cnt--)
   {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
                  ticket = oldticket;
                  oldlots = OrderLots();
               }
         }
      }
   }
   return(oldlots);
}

//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   int oldticket;
   double oldopenprice=0;
   ticket = 0;
  
   for (int cnt=OrdersTotal()-1; cnt>=0; cnt--)
   {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
                  ticket = oldticket;
                  oldopenprice = OrderOpenPrice();
               }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           return(OrderType()); 
      }
   }
   return(-1);
}
//+------------------------------------------------------------------+
int CountTrades()
{
  int count=0;
  for(int i=OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
         count++; 
      
     }
  }
  return(count); 
}

Почему то не нравится знак =. 

Пишет: 

result of expression not used    Martin.mq4    50    15

Это одно предупреждение и еще 10

possible loss of data due to type conversion    Martin.mq4    55    15
 

Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

@eBaykal  знак "=" ему нравится, он предупреждает, что (перевод с МТ-шного): "Что-то посчитал, но не используешь - непорядок!". У меня это предупреждение не возникло...

possible loss of data due to type conversion = "возможная потеря точности при конвертации", это если пытаться в int запихнуть double:

вместо int ticket, tp, price, lastlot;

пиши   int ticket;  double tp, price, lastlot;

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано

Домашнее задание к 4 уроку:

 

Спойлер

//+------------------------------------------------------------------+
//|                                                       Martin.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Lots       = 0.1;
extern int    TakeProfit = 50;
extern int    Step       = 50;
extern double Multiplier = 2;
extern int    Magic      = 123;
extern int    MaxOrders  = 10;
extern int    MaxLoss    = 200;

int ticket; 
double tp, sl, price, lastlot;
bool DoFlush;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit *= 10;
      Step       *= 10;
      MaxLoss    *= 10;
   }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double ima = iMA(Symbol(), PERIOD_H1, 14, 0,MODE_SMA, PRICE_CLOSE, 1);
   
   if(CountTrades() == 0)
   {
   
      if(Ask < ima)
        {
           tp = NormalizeDouble(Ask + TakeProfit*Point, Digits);
           ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, 0, tp, "1 ордер", Magic, 0, Blue);
        }
        else
        {
           tp = NormalizeDouble(Bid - TakeProfit*Point, Digits);
           ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, 0, tp, "1 ордер", Magic, 0, Red);
        }
    }
    else
    {
       int order_type = FindLastOrderType();
       if(CountTrades() < MaxOrders && OrderType() == OP_BUY)
       {
          price = FindLastOrderPrice(OP_BUY);
          if (Ask <= price - Step*Point)
          { 
             lastlot = FindLastLots(OP_BUY);
             lastlot = NormalizeDouble(lastlot*Multiplier, 2);
             ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, 5, 0, 0, "", Magic, 0, Blue);
             if(ticket<1)
                Print("Ошибка открытия ордера на покупку");
             ModifyOrders(OP_BUY);
          }
       }
       if(CountTrades() < MaxOrders && OrderType() == OP_SELL)
       {
          price = FindLastOrderPrice(OP_SELL);
          if (Bid >= price + Step*Point)
          { 
             lastlot = FindLastLots(OP_SELL);
             lastlot = NormalizeDouble(lastlot*Multiplier, 2);
             ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, 5, 0, 0, "", Magic, 0, Red);
             if(ticket<1)
                Print("Ошибка открытия ордера на продажу");
             ModifyOrders(OP_SELL);
          }
       }
       
       
       for(int i=0;i<OrdersTotal();i++)
       {
          if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
             if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
                switch(OrderType())
                {
                   case OP_BUY:
                      if(OrderType() == OP_BUY && Ask <= Findsl(OP_BUY))
                         DoFlush = CloseAll();
                      break;
                   case OP_SELL:
                      if(OrderType() == OP_SELL && Bid >= Findsl(OP_SELL))
                         DoFlush = CloseAll();
                }
       }
       
    }
   
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype)
{
   double avg_price, order_lots = 0;
   price = 0;
   
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots(); 
            order_lots += OrderLots();
         }
      }
   }
   avg_price = NormalizeDouble(price / order_lots, Digits);
   if (otype == OP_BUY)  tp = NormalizeDouble(avg_price + TakeProfit*Point, Digits);
   if (otype == OP_SELL) tp = NormalizeDouble(avg_price - TakeProfit*Point, Digits); 
   
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
               Print("Ордера успешно модифицированы!");
            else Print("Ошибка модификации ордеров!");   
         }
      }
   }
}
//+------------------------------------------------------------------+
double Findsl(int otype)
{
   double avg_price, order_lots = 0;
   price = 0;
   
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots(); 
            order_lots += OrderLots();
         }
      }
   }
   avg_price = NormalizeDouble(price / order_lots, Digits);
   if (otype == OP_BUY)  sl = NormalizeDouble(avg_price - MaxLoss*Point, Digits);
   if (otype == OP_SELL) sl = NormalizeDouble(avg_price + MaxLoss*Point, Digits); 
   
   return(sl);
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   int oldticket;
   double oldlots=0;
   ticket = 0;
  
   for (int cnt=OrdersTotal()-1; cnt>=0; cnt--)
   {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
                  ticket = oldticket;
                  oldlots = OrderLots();
               }
         }
      }
   }
   return(oldlots);
}

//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   int oldticket;
   double oldopenprice=0;
   ticket = 0;
  
   for (int cnt=OrdersTotal()-1; cnt>=0; cnt--)
   {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            oldticket = OrderTicket();
            if (oldticket > ticket)
               {
                  ticket = oldticket;
                  oldopenprice = OrderOpenPrice();
               }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for(int i = OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           return(OrderType()); 
      }
   }
   return(-1);
}
//+------------------------------------------------------------------+
int CountTrades()
{
  int count=0;
  for(int i=OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
       if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         if(OrderType() == OP_BUY || OrderType() == OP_SELL)
         count++; 
      
     }
  }
  return(count); 
}
//+------------------------------------------------------------------+
bool CloseAll()
{
    bool rval = false;
    int i;
    
    for (i=OrdersTotal()-1; i>=0; i--) 
    {
        if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES));
        {
           if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
               switch(OrderType()) 
               {
                   case OP_BUY:
                       if(OrderClose(OrderTicket(),OrderLots(),Bid,5,Navy))
                          rval = true;
                           break;
                   case OP_SELL:
                       if(OrderClose(OrderTicket(),OrderLots(),Ask,5,Maroon))
                           rval = true;
                          break;
               }
        }
    }
    return(rval);
}

Подсмотрел код в другом роботе. Стырил пару кусочков.

Работает.

Но предупреждение:

empty controlled statement found    Martin.mq4    257    48
не знаю, как убрать).

Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано
5 часов назад, eBaykal сказал:

не знаю, как убрать).

@eBaykal в конце строки ";" убери. МТ ругается, что после проверки условия стоит ";" - пустой оператор, типа: "зачем сыр-бор, если ничего делать не нужно?"

  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

  • 1 month later...
Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано
В 14.05.2020 в 08:53, xbms сказал:

Павел, коллеги, день добрый!

 

Прошу прощения, был очень занят, навалилось всякого...

Попробуем продолжить уроки через недельку, осталось вроде не так много разгрести.

 

Павел, благодарю за "Курс молодого бойца. Сам я не молодой, но программист очень начинающий.
Написал советник на средней скользящей, но не види индикатор. Открывает покупку независимо от положения цены. И не могу понять в чём дело.

Ссылка на сообщение
Поделиться на другие сайты

Изучение MQL4 по урокам на Tradelikeapro личн… Опубликовано
1 час назад, Stranger80 сказал:

И не могу понять в чём дело.

Мы тоже не сможем понять... если код не увидим. 

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...