Изучаем MQL5.

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Виртуальные функции

Сообщение Рэндом » 11 сен 2013, 04:35

Виртуальные функции предназначены для динамического, на этапе выполнения, выбора функции при использовании механизмов наследования. Они применяются только для функций класса.
Виртуальная функция определяется путем ключевого слова virtual перед описанием функции. Причем при переопределении виртуальной функции так же необходимо использовать это ключевое слово.
Пример:
Код: выделить все
class Shape
{
      public:
           virtual void Draw();
};
class Triangle: public Shape
{
      public:
           virtual void Draw();
};
class Circle: public Shape
{
      public:
          virtual void Draw();
};

При реализации этих классов, в классе Shape можно определить функцию Draw как ничего не делающую. Действительно при реализации класса Shape мы не знаем какие фигуры будут использованы, поэтому и не можем определить эту функцию. В производных классах мы уже можем это сделать, более того должны это сделать.
А теперь пример использования:
Код: выделить все
Shape *m_shape;
switch(i)
{
    case 1: m_shape=new Triangle;
               break;
    case 2: m_shape=new Circle;
               break;
    default: m_shape=NULL;
}
if(m_shape!=NULL) m_shape.Draw();

Разберемся как работает этот код. Сначала мы создаем ссылку на базовый класс, это нужно для того чтобы присвоить ей значение производного класса. Использование ссылки это единственный способ это сделать. Далее в операторе switch выбирается какой производный класс будет присвоен переменной или присваиваем ей значение NULL (нет значения). Далее проверяем присвоенно ли m_shape значение и если присвоено вызываем метод Draw. Какой конкретно метод будет вызван зависит от того какой производный класс использован. Если использован Triangle, то будет вызван метод Draw для этого класса. Если Circle, то соответственно для него.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Заключение и продолжение.

Сообщение Рэндом » 12 сен 2013, 04:07

Вот вообщем все основы MQL5. Я постарался все изложить сжато, чтобы не тратить ваше время на чтение большого "талмуда" и вы быстро смогли приступить к практическому использованию языка. Естественно у вас остались вопросы. Но я рад этому. Потому что вы их можете задать мне. А я в свою очередь постараюсь на них ответить. Регистрируйтесь, и пользуйтесь возможностью интерактивного изучения языка, а так же моим большим опытом в программировании. Программировать - это круто и интересно, а программирование в трейдинге интересно вдвойне.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Несколько слов о справке.

Сообщение Рэндом » 16 сен 2013, 03:49

В МТ5 есть множество встроенных функций и все они описаны в справке. Более того в справке описан синтаксис языка. Поэтому пользоваться справкой просто необходимо.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Изучаем MQL5.

Сообщение Paramon » 18 сен 2013, 11:44

Ну справка вапШЭ вещь необходимая. Только некоторые справки составлены таким языком что и читать не хочется. Непонятно для кого такое пишут. Новичек ничерта не поймет а профи эта справка и ни к чему :ne_vi_del:
Аватар пользователя
Paramon
 
Сообщений: 730
Зарегистрирован: 15 авг 2013, 07:55
Средств на руках: 147.03 Доллар
Награды: 1
Ветеран II (1)
Группа: Базовая
Благодарил (а): 224 раз.
Поблагодарили: 75 раз.

Re: Изучаем MQL5.

Сообщение Рэндом » 19 сен 2013, 03:06

Никто без справки не обойдется ни новичок ни профи. В MQL5 много всяких разных встроенных функций, все их не упомнишь, поэтому приходиться пользоваться справкой. Я не призываю ее читать как книгу, а использовать только для поиска ответов на вопросы. А если что не понятно, то всегда можно спросить у меня.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Изучаем MQL5.

Сообщение Haos » 07 июн 2015, 19:51

Я сейчас всё-таки решил переходить (или одновременно и с 4-кой работать для заказов) на 5-ку потому, что преимущества всё-таки очевидны. Основным тормозом был навязчивый страх, что могут понадобиться локи, а их нельзя в 5-ке. Ну это прошло. Итак, после ознакомления с получением котировок в коде советника у меня возник вопрос и давай посоветуемся: :-):
есть получение Bid, Ask и т.п. через
Код: выделить все
SymbolInfoTick(... , ...)
дает информацию о последнем тике.
а что означает в справке по этой команде
Код: выделить все
SymbolInfoDouble(Symbol(), SYMBOL_ASK)

фраза: "где Ask - лучшее предложение на покупку"?
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Изучаем MQL5.

Сообщение Рэндом » 08 июн 2015, 09:40

Используйте то что больше нравиться. Функции взаимозаменяемы. Но вторая по моему может выдавать больше информации.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Изучаем MQL5.

Сообщение Alexandeer » 01 дек 2016, 11:28

Помогите, пожалуйста, треллинг не работает
Код: выделить все
//+------------------------------------------------------------------+
//|                                                       SoveTT.mq4 |
//|                                                    MagistrSanich |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "MagistrSanich"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum Stop  // Режим
  {
   Tralling, // Треллинг
   NoDamage, // Безубыток
   TrallDamage, // Треллинг и безубыток
   No        // Ничего

  };


input double         Lots=1.0;// Объем лота
input int            Slip=30;// Слип
input int            Magic=0;// Магик
input int            CoundClose=5;//На какой свече закрывать

input Stop           ImagTrall = Tralling;// Режим

input int            Distance=100; //Пройденные пункты от цены открытия
input int            indent=50; // Отступ от цены открытия

                                    //Глобальные переменные
double price=-1;  // Текущая цена
int Ticket= 0;
int count = 0;
datetime  timeStop=0;
int       timee=Day();
int       i=0;
double    min,stopLoss,test,dayModify=0;

//+------------------------------------------------------------------+
//|                                                                  |

int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---ACCOUNT_BALANCE

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(timeStop == Time[0]) return;
   else timeStop=Time[0];

//-----------------------------------------------------

   price=MarketInfo(_Symbol,MODE_BID);

   int b = Counter(OP_BUY);
   int s = Counter(OP_SELL);

//Открытие ордеров
   if(b==0 && s==0 )
     {
      int type =(int) rand()%2;
         Ticket=OrderSend(_Symbol,type,Lots,Ask,Slip,0,0,"",Magic,0,clrBlue);
         count = 0;
     }


//Закрытие ордера
   if(Ticket)
     {
      count++;
      if(count==CoundClose)
        {
         for(i=0;i<OrdersTotal();i++)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET))
              {
               if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
                 {
                  if(!OrderClose(Ticket,Lots,price,Slip,clrGreen))
                     Print("НЕ УДАЛОСЬ ЗАКРЫТЬ ОРДЕР");
                     Ticket = 0;
                 }

              }

           }
        }
     }

//Треллинг

   if( timee != Day() &&(b != 0 || s != 0) ) { dayModify++; timee = Day();}
   if (b ==0 && s == 0) dayModify =0;
   
   if((ImagTrall==Tralling || ImagTrall==TrallDamage) && dayModify >= 2 ) //dayModify - в какой денб треллить
     {

      for(i=0;i<=OrdersTotal();i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderType()==OP_BUY && OrderMagicNumber()==Magic)
              {
               min=320000;
               for( i = 1; i <= ( 1440/Period() ); i++ )
                 {
                  if(Low[i]<min) min=Low[i];
                 }

              }
            else if(OrderMagicNumber()==Magic)
              {
               min=0;
               for(i=1;i<=(1440/Period());i++)
                 {
                  if(High[i]>min) min=High[i];
                 }

              }

             Print("Trall ",OrderType()," ",OrderTicket()," ",min);
            if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
              {
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),min,0,0,clrYellow))
                  Print("Ошибка модификации ",TimeCurrent(),OrderType()," ",OrderOpenPrice()," min=",min);
                 
              }

           }
        }
     }



//Comment(" Now time= ",time);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Counter(int type)// ФУНЦИЯ ПОДСЧЕТА ОРДЕРА, РЕАЛЬНО РАБОТАЕТ
  {
   int n=0;
   for(i=0;i<=(OrdersTotal()+1);i++)
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
            if(OrderType()==type)
               n++;
   return n;
  }
//+------------------------------------------------------------------+
Аватар пользователя
Alexandeer
 
Сообщений: 17
Зарегистрирован: 04 ноя 2016, 04:54
Средств на руках: 8.00 Доллар
Группа: Новые пользователи
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.

Re: Изучаем MQL5.

Сообщение Рэндом » 01 дек 2016, 11:43

min=320000;
for( i = 1; i <= ( 1440/Period() ); i++ )
{
if(Low[i]<min) min=Low[i];
}
Вот это можно заменить функцией iLowest, смотрите справку.
OrderModify(OrderTicket(),OrderOpenPrice(),min,0,0,clrYellow) Вот здесь не правильно
У вас открытая позиция, а вы пытаетесь модифицировать ее цену. Это можно делать только с отложенными ордерами. Надо изменять стоп лосс.

OrderModify

Изменяет параметры ранее открытых или отложенных ордеров.



bool OrderModify(
int ticket, // номер ордера
double price, // цена открытия
double stoploss, // stop loss
double takeprofit, // take profit
datetime expiration, // время истечения ордера
color arrow_color // цвет
);


Параметры

ticket

[in] Уникальный порядковый номер ордера для модификации.

price

[in] Новая цена открытия отложенного ордера.

stoploss

[in] Новое значение StopLoss.

takeprofit

[in] Новое значение TakeProfit.

expiration

[in] Время истечения отложенного ордера.

arrow_color

[in] Цвет стрелок модификации StopLoss и/или TakeProfit на графике. Если параметр отсутствует, или его значение равно CLR_NONE, то стрелка на графике не отображается.

Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Изучаем MQL5.

Сообщение Рэндом » 01 дек 2016, 11:46

Вопросы просьба задавать здесь mql-teoriya-i-praktika/voprosi-po-programmirovaniu-v-mt4-t62-70.html
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron