Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй свой счет через PayPal
Alexey Viktorov
6889
Alexey Viktorov 2015.01.25 21:33 

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

Вот, после первого знакомства с 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
6889
Alexey Viktorov 2015.01.26 08:22  

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

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

Sergey Dzyublik
4817
Sergey Dzyublik 2015.01.26 08:32  
МОЛОДЕЦь.
Koldun Zloy
228
Koldun Zloy 2015.01.26 10:29  
Вам бы почитать книжки по C++.
В Вашем примере абсолютно бессмысленное использование классов.
Хотя классы позволяют делать удивительные вещи.
Evgeniy Ledovskih
2394
Evgeniy Ledovskih 2015.01.26 10:52  
Zloy_Koldun:
Хотя классы позволяют делать удивительные вещи.
Не все сразу, человек, можно сказать только знакомится с ООП. И когда дойдет, то будет в шоке, в хорошем смысле конечно.
Alexey Viktorov
6889
Alexey Viktorov 2015.01.26 11:05  

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

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


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

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

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

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

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

Evgeniy Ledovskih
2394
Evgeniy Ledovskih 2015.01.26 12:25  
AlexeyVik:

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

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

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

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

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

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

Alexey Viktorov
6889
Alexey Viktorov 2015.01.26 13:34  
svds75:

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

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

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

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

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

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

Evgeniy Ledovskih
2394
Evgeniy Ledovskih 2015.01.26 13:49  

AlexeyVik:

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

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

AlexeyVik:

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

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