Автор#1

Урок 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");
    }
 }

 

Автор#2

Урок  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  не отвечает. Сам я ошибку найти не могу. Если код не начнет работать, то и д/з нет смысла делать, так как оно на этом же коде.

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

#3

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

 

@xbms 

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

Изменено 12 мая, 2020 пользователем pavlus777

#4

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

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

 

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

заменить на 

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

 

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

Автор#5

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

#6

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

 

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

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

 

Автор#7

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

 

Спойлер

#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;
}

 

Автор#8

Урок 3.

 

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

 

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

TMA_Fair_.mq43 скач.

Изменено 15 мая, 2020 пользователем eBaykal

Автор#9

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

 

Спойлер

//+------------------------------------------------------------------+
//|                                                        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);
}   

 

Автор#10

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

 

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

Спойлер

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

 

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

 

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

#11

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

 

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

Автор#12

Урок 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
 

#13

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

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

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

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

Автор#14

Домашнее задание к 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
не знаю, как убрать).

#15
5 часов назад, eBaykal сказал:

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

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

#16
В 14.05.2020 в 08:53, xbms сказал:

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

 

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

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

 

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

#17
1 час назад, Stranger80 сказал:

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

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

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

Перейти к списку тем
Форум · 2.0.20260627.0025