Скачать MetaTrader 5

Мой первый класс.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alexey Viktorov
12637
Alexey Viktorov  

Всем доброго...

Вот, после первого знакомства с mql5 и написав 2 простеньких индикатора я решил продолжить изучение и 2 дня бился над созданием класса. Всё вроде-бы нормально, но есть одна проблема. Если в советнике не объявить MqlTradeRequest request; и вызвать присутствующую в классе функцию IsNewBar() то советник не компилируется из-за не объявленной структуры. А если её объявить повторно в классе, то советник не открывает ордера из-за ошибки структуры...

В принципе, для личного использования пойдёт. Но хотелось-бы понять как сделать правильно.

Текст класса:

/********************************************************************\
//|                                                     Viktorov.mqh |
//|                                                         Viktorov |
//|                                                   v4forex@qip.ru |
\********************************************************************/
#property copyright "Viktorov"
#property link      "v4forex@qip.ru"


/*********************************************************************
               Алгоритмы для торговых операций
*********************************************************************/
class cTradeAlgoritm
{
 public:

 // 6 ---- конструктор класса удаления отложенного ордера Delete Pending Order
  cTradeAlgoritm(MqlTradeRequest &request
               , ENUM_TRADE_REQUEST_ACTIONS  Action
               , ulong                       Ticket
                )
 {
   //ZeroMemory(request);
    request.action =  Action;
   request.order   =  Ticket;
 }

 // 5 ---- конструктор класса Modify Pending Order
 cTradeAlgoritm(MqlTradeRequest &request
              , ENUM_TRADE_REQUEST_ACTIONS Action
              , ulong                      Ticket
              , double                     Price
              , double                     StopLoss
              , double                     TakeProfit
              , ENUM_ORDER_TYPE_TIME       TypeTime
              , datetime                   Expiration
               )
 {
   //ZeroMemory(request);
    request.action         =  Action;
     request.order          =  Ticket;
      request.price          =  Price;
       request.sl             =  StopLoss;
      request.tp             =  TakeProfit;
     request.type_time      =  TypeTime;
    request.expiration     =  Expiration;
 };

 // 4 ---- конструктор класса открытия отложенного ордера Pending Order
  cTradeAlgoritm(MqlTradeRequest &request
               , ENUM_TRADE_REQUEST_ACTIONS  Action
               , string                      Symbol_
               , double                      LotVolume
               , double                      Price
               , double                      LevelStopLimit
               , double                      StopLoss
               , double                      TakeProfit
               , ulong                       SlipPage
               , ENUM_ORDER_TYPE             OrderType
               , ENUM_ORDER_TYPE_FILLING     TypeFilling
               , ENUM_ORDER_TYPE_TIME        TypeTime
               , datetime                    Expiration
               , string                      OrderComment
               )
 {
  //ZeroMemory(request);
   request.action         =  Action;
      request.symbol         =  Symbol_;
       request.volume         =  LotVolume;
        request.price          =  Price;
         request.stoplimit      =  LevelStopLimit;
          request.sl             =  StopLoss;
         request.tp             =  TakeProfit;
        request.deviation      =  SlipPage;
       request.type           =  OrderType;
      request.type_filling   =  TypeFilling;
     request.type_time      =  TypeTime;
    request.expiration     =  Expiration;
   request.comment        =  OrderComment;
 };

 // 3 ---- конструктор класса SL & TP Modification
  cTradeAlgoritm(MqlTradeRequest &request
               , ENUM_TRADE_REQUEST_ACTIONS  Action
               , string                      Symbol_
               , double                      StopLoss
               , double                      TakeProfit
               )
 {
   //ZeroMemory(request);
    request.action         =  Action;
     request.symbol         =  Symbol_;
    request.sl           =  StopLoss;
   request.tp             =  TakeProfit;
 };

 // 2 ---- конструктор класса открытия ордера Market Execution или Exchange Execution
  cTradeAlgoritm(MqlTradeRequest &request
               , ENUM_TRADE_REQUEST_ACTIONS  Action
               , string                      Symbol_
               , double                      LotVolume
               , ENUM_ORDER_TYPE             OrderType
               , ENUM_ORDER_TYPE_FILLING     TypeFilling
               , string                      OrderComment
               )
 {
   //ZeroMemory(request);
    request.action         =  Action;
     request.symbol         =  Symbol_;
      request.volume         =  LotVolume;
     request.type           =  OrderType;
    request.type_filling   =  TypeFilling;
   request.comment        =  OrderComment;
 };

 // 1 ---- конструктор класса открытия ордера Request Execution или Instant Execution
  cTradeAlgoritm(MqlTradeRequest &request
               , ENUM_TRADE_REQUEST_ACTIONS  Action
               , string                      Symbol_
               , double                      LotVolume
               , double                      Price
               , double                      StopLoss
               , double                      TakeProfit
               , ulong                       SlipPage
               , ENUM_ORDER_TYPE             OrderType
               , ENUM_ORDER_TYPE_FILLING     TypeFilling
               , string                      OrderComment
               )
 {
  //ZeroMemory(request);
   request.action         =  Action;
    request.symbol         =  Symbol_;
     request.volume         =  LotVolume;
      request.price          =  Price;
       request.sl             =  StopLoss;
      request.tp             =  TakeProfit;
     request.deviation      =  SlipPage;
    request.type           =  OrderType;
   request.type_filling   =  TypeFilling;
  request.comment        =  OrderComment;
 };
//protected:
//   MqlTradeRequest   request;         // request data
};/********************************************************************/

/*****************Определение появления нового бара******************/
class cNewBar
{
   public:
bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe, datetime &m_tOld)
 {
  datetime tNew = datetime(SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE));
   if(tNew != m_tOld)
    {
     m_tOld = tNew;
     return(true);
    }
   return(false);
 }
};
/********************************************************************/


И текст советника на котором проверялась работоспособность класса.

/********************************************************************\
//|                                                        !Test.mq5 |
//|                                                         Viktorov |
//|                                                   v4forex@qip.ru |
\********************************************************************/
#property copyright "Viktorov"
#property link      "v4forex@qip.ru"
#property version   "1.00"
#include <Viktorov.mqh>

enum kuda
{
   Buy,
   Sell
};

input kuda     bs       =  0;    // Куда пойдём
input double   lot      =  0.1;  // Лот ордера
input int      take     =  10;   // TakeProfit
input int      stop     =  60;   // StopLoss
ENUM_ORDER_TYPE FirstOrder;

double point;
/*******************Expert initialization function*******************/
int OnInit()
{
   FirstOrder = bs == 0
    ? ORDER_TYPE_BUY
     : ORDER_TYPE_SELL;

   point = MathMod(SymbolInfoInteger(_Symbol, SYMBOL_DIGITS), 2) > 0
    ? SymbolInfoDouble(_Symbol, SYMBOL_POINT)*10
     : SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   
   return(INIT_SUCCEEDED);
}/*******************************************************************/

/*****Объявление структур торгового запроса и результата запроса*****/
   MqlTradeRequest request;
   MqlTradeResult result;
/*****Объявление структуры результата проверки торгового запроса*****/
   MqlTradeCheckResult check;
/************************Expert tick function************************/
void OnTick()
{
 long PositionType;
  double CurrentPrice,StopLoss, TakeProfit, PositionPriceOpen;
   cNewBar nb;

   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check);

   CurrentPrice = bs == 0
    ? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
     : SymbolInfoDouble(_Symbol, SYMBOL_BID);
   
     ResetLastError();
      int er = 0;
    if(!OrderCheck(request, check)) er = GetLastError();
    uint Check = check.retcode;
   if(PositionsTotal() == 0)
    {
     cTradeAlgoritm algo(TRADE_ACTION_DEAL, _Symbol, lot, CurrentPrice, 0.0, 0.0, 20, FirstOrder, ORDER_FILLING_FOK, DoubleToString(CurrentPrice, _Digits));
     if(OrderSend(request, result))
      {
       if(!PositionSelect(_Symbol)) Alert("Стопики не встанут");
        PositionGetDouble(POSITION_PRICE_OPEN, PositionPriceOpen);
        PositionGetInteger(POSITION_TYPE, PositionType);
         StopLoss = PositionType == ORDER_TYPE_BUY
          ? PositionPriceOpen-stop*point
           : PositionPriceOpen+stop*point;
        TakeProfit = PositionType == ORDER_TYPE_BUY
         ? PositionPriceOpen+take*point
          : PositionPriceOpen-take*point;
           cTradeAlgoritm algoST(TRADE_ACTION_SLTP, _Symbol, StopLoss, TakeProfit);
          if(!OrderSend(request, result)) Alert("Стопики не поставили");
      }
     else er = GetLastError();
    }
      
  Comment("OrderCheck ", Check, "\n"
        , "Error ", er, "\n"
        );
}/*******************************************************************/

/******************Expert deinitialization function******************/
void OnDeinit(const int reason)
{
 Comment("");
}/*******************************************************************/
Alexey Viktorov
12637
Alexey Viktorov  

Решение найдено. Код класса в первом посте исправлен.

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

Sergey Dzyublik
5171
Sergey Dzyublik  
МОЛОДЕЦь.
Koldun Zloy
275
Koldun Zloy  
Вам бы почитать книжки по C++.
В Вашем примере абсолютно бессмысленное использование классов.
Хотя классы позволяют делать удивительные вещи.
Evgeniy Ledovskih
2458
Evgeniy Ledovskih  
Zloy_Koldun:
Хотя классы позволяют делать удивительные вещи.
Не все сразу, человек, можно сказать только знакомится с ООП. И когда дойдет, то будет в шоке, в хорошем смысле конечно.
Alexey Viktorov
12637
Alexey Viktorov  

Поздно мне книжки читать... И дойти я не успею... Программирование для меня хобби, скоротать время. Ну и если получится заработать чуток. Хотя всё заработанное на написании советников для МТ4 всё спущено теми-же советниками. Только вот последний пока радует...

И конечно-же спасибо за оценку.


ps; И вот ещё вопрос. Какие "удивительные вещи" позволяют делать классы? Конечно применительно, исключительно к торговле.

Koldun Zloy
275
Koldun Zloy  
Конечно, для начала, было бы неплохо изучить основы языка.
Но если просите про удивительные вещи, порекомендую эту: http://www.ozon.ru/context/detail/id/88891/
Только о торговле там ни слова. Это можно применить к чему угодно.
C++: Библиотека программиста
C++: Библиотека программиста
  • отзывов: 3
  • 205.00 None
  • Джефф Элджер, Автор не указан
  • www.ozon.ru
Искусство программирования на С++ отнюдь не сводится к знанию синтаксиса языка. Хорошая программа доставляет удовольствие - она проста и изящна одновременно. Однако переход от среднего, `ремесленного` уровня владения С++ к высотам мастерства практически не освещается в литературе. Большинство программистов действуют методом проб и ошибок...
Alexey Viktorov
12637
Alexey Viktorov  
Zloy_Koldun:

Только о торговле там ни слова. Это можно применить к чему угодно.

Вот именно поэтому я не искал никаких книжек.

Но всё равно большое спасибо. Может кому из молодых пригодится.

Evgeniy Ledovskih
2458
Evgeniy Ledovskih  
AlexeyVik:

Вот именно поэтому я не искал никаких книжек.

Но всё равно большое спасибо. Может кому из молодых пригодится.

Да, книги это хорошо, но Вам просто обязательно (если хотите конечно все же познать ООП хоть не начиная с нуля) надо прочесть эти статьи:

Основы объектно-ориентированного программирования.

Приобщаемся к объектно-ориентированному программированию в MQL5.

Да и еще там есть масса полезного на эту тему. Удачи!

Alexey Viktorov
12637
Alexey Viktorov  
svds75:

Да, книги это хорошо, но Вам просто обязательно (если хотите конечно все же познать ООП хоть не начиная с нуля) надо прочесть эти статьи:

Основы объектно-ориентированного программирования.

Приобщаемся к объектно-ориентированному программированию в MQL5.

Да и еще там есть масса полезного на эту тему. Удачи!

Да, спасибо. Первую ссылку читал. Интересно, полезно. посмотрю и вторую...

А вообще, что-то мне кажется нет задачи необходимой для трейдинга которую невозможно решить без ООП. Ну разве что для ускорения и экономии оперативки. Или я не прав?

Evgeniy Ledovskih
2458
Evgeniy Ledovskih  

AlexeyVik:

А вообще, что-то мне кажется нет задачи необходимой для трейдинга которую невозможно решить без ООП.

Да Вы правы, но есть задачи которые без ООП решать ну просто очень муторно. А расширять иной раз вообще проблематично, даже иногда невозможно. Проще плюнуть, и написать все заново.

AlexeyVik:

Ну разве что для ускорения и экономии оперативки. Или я не прав?

Не обязательно. Изучайте, и сами все поймете, хоть возможно и не сразу. Просто поверьте на слово и изучайте, даже не изучайте, а практикуйте и не забрасывайте. Результат не заставит себя ждать...
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий