Общее создание класса C_Trade для мета трейдера 4 - страница 3

 
VOLDEMAR:

Чуть перебрал

Ну правильно. Я просто не стал исправлять, у меня она работает давно со старым MarketInfo()
 

Я не могу понять этого

protected:
   bool              m_is_initiated;           // флаг инициализации
   //---
   STradeElements    m_trade_elements;         // торговые элементы
   bool   


у меня получается что нужно делать так

 Order.m_trade_elements;
   Order.m_trade_elements.magic=227;
   Order.m_trade_elements.type=OP_BUY;

Я думаю это не правильно, но как сделать по другому не пойму..

 

В общем вот мой финал, если есть предложения пишите и предлагйте

Конечно этот финал не идеал и часть кода было бы в другие классы засунуть, но пока так

class Trade
  {
private:

   double            m_fl;
   int               digits;
   double            point;
   double            ask;
   double            bid;
   
public:

   string            symbol;
   int               type;
   int               error;
   double            lots;
   double            price;
   double            Get_price;
   int               slippage;
   double            stoploss;
   double            takeprofit;
   string            comment;
   int               magic;
   datetime          expiration;
   color             arcolor;
   int               ticket;
   bool              rezult;
   bool              SendOrder(Trade  &str);
                     Trade();
                    ~Trade();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Trade ::  Trade(){  }
Trade :: ~Trade(){  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Trade :: SendOrder(Trade  &str)
  {
   ResetLastError();
//--------------- Проверка на разрешение советнику торговать --------------//
   int p=0,c=0;string txt=NULL;
   bool Lan=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian");
// Разрешение на торговлю кнопка в терминале   
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
     {
      c++;
      if(Lan)txt=(string)c+"-Отключена кнопка Авто-Торговля    ";
      else txt=(string)c+"-Disable button Auto-Trading    ";
     }
// Свойства терминала     
   if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
     {
      c++;
      if(Lan)txt=txt+(string)c+"-В настройках терминала включите \"Разрешить автоматическую торговлю\", запустите советник в термнале";
      else txt=txt+(string)c+"-In the terminal settings include \"Allow automated trading \", run counselor in termnale";
     }
// Наличие связи с стервером брокера  
   if(!IsConnected())
     {
      c++;
      if(Lan)txt=txt+(string)c+"-Отсутсвует связь с интернетом / сервером брокера";
      else txt=txt+(string)c+"-Not available Internet connection / server broker";
     }
// алерт с инструкциями
   if(txt!=NULL)
     {
      Alert(txt);
      return false;
     }
//-------------------------------------------------------------------------//
//----------------------------- Неучтенка ---------------------------------//
   if(str.symbol==NULL || str.symbol=="")str.symbol=_Symbol;
   if(str.magic==NULL)str.magic=0;
   if(str.comment==NULL || str.comment=="")str.comment=StringConcatenate(WindowExpertName()," ",str.magic);
   if(str.arcolor==clrNONE)
      if(str.type==OP_BUY ||str.type==OP_BUYLIMIT || str.type==OP_BUYSTOP )
         str.arcolor=clrBlue; else str.arcolor=clrRed;
   str.digits=(int)SymbolInfoInteger(str.symbol,SYMBOL_DIGITS);
   str.point =SymbolInfoDouble (str.symbol,SYMBOL_POINT);

   m_fl=NormalizeDouble(SymbolInfoInteger(str.symbol,SYMBOL_TRADE_FREEZE_LEVEL)*str.point,str.digits);
//-------------------------------------------------------------------------//
//------------------ Проверка и нормализация лота--------------------------//
   str.lots=NormalizeDouble(str.lots,(int)MathAbs(MathLog10(SymbolInfoDouble(str.symbol,SYMBOL_VOLUME_STEP))));

   if(str.lots<SymbolInfoDouble(str.symbol,SYMBOL_VOLUME_MIN))str.lots=SymbolInfoDouble(str.symbol,SYMBOL_VOLUME_MIN);
   if(str.lots>SymbolInfoDouble(str.symbol,SYMBOL_VOLUME_MAX))str.lots=SymbolInfoDouble(str.symbol,SYMBOL_VOLUME_MAX);
   if(MarketInfo(str.symbol,MODE_MARGINREQUIRED)*str.lots>AccountEquity()) //  ПО НОВОМУ НЕ НАШОЛ
     {
      str.comment="Not enough money to open a position";
      str.error=GetLastError();
      return false;
     }
//-------------------------------------------------------------------------//
//------------------ запускаем цикл на 5 попыток --------------------------//
   while(!IsTradeContextBusy() && p++<5)
     {
      RefreshRates();
      str.ask=SymbolInfoDouble(str.symbol,SYMBOL_ASK);
      str.bid=SymbolInfoDouble(str.symbol,SYMBOL_BID);
      if(str.type==OP_BUY)
        {
         if(str.takeprofit>0)
           {
            str.takeprofit=NormalizeDouble(str.ask+str.takeprofit*str.point,str.digits);
            if((str.takeprofit-m_fl)<=str.ask)
              {
               str.comment="Error open buy TP freeze level";
               str.error=GetLastError();
               return false;
              }
           }
         if(str.stoploss>0)
           {
            str.stoploss=NormalizeDouble(str.ask-str.stoploss  *str.point,str.digits);
            if((str.stoploss+m_fl)>=str.ask)
              {
               str.comment="Error open buy SL freeze level";
               str.error=GetLastError();
               return false;
              }
           }
         str.price=NormalizeDouble(str.ask,str.digits);
        }
      if(str.type==OP_SELL)
        {
         if(str.takeprofit>0)
           {
            str.takeprofit=NormalizeDouble(str.bid-str.takeprofit*str.point,str.digits);
            if((str.takeprofit+m_fl)<=str.bid)
              {
               str.comment="Error open sell TP freeze level";
               str.error=GetLastError();
               return false;
              }
           }
         if(str.stoploss>0)
           {
            str.stoploss=NormalizeDouble(str.bid+str.stoploss  *str.point,str.digits);
            if((str.stoploss-m_fl)<=str.bid)
              {
               str.comment="Error open sell SL freeze level";
               str.error=GetLastError();
               return false;
              }
           }
         str.price=NormalizeDouble(str.bid,str.digits);
        }

      str.ticket=OrderSend(
                           str.symbol,
                           str.type,
                           str.lots,
                           str.price,
                           str.slippage,
                           str.stoploss,
                           str.takeprofit,
                           str.comment,
                           str.magic,
                           str.expiration,
                           str.arcolor );
      if(str.ticket<0)
         Sleep(500);
      else
         break;
     }

   if(str.ticket>=0)
     {
      str.rezult=true;
      str.Get_price=str.price;
      str.error=GetLastError();
      return true;
     }
   else
     {
      str.rezult=false;
      str.error=GetLastError();
      return false;
     }
   return false;
  }
 
VOLDEMAR:

Разве это не проверка на дробность лота ?

А откуда такая уверенность что всегда на всех ДЦ шаг лота будет меняться с кратностью 10???

if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==0.001) str.lots=NormalizeDouble(str.lots,3);
   if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==0.01) str.lots=NormalizeDouble(str.lots,2);
   if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==0.1) str.lots=NormalizeDouble(str.lots,1);
   if(SymbolInfoDouble (str.symbol,SYMBOL_VOLUME_STEP)==1) str.lots=NormalizeDouble(str.lots,0);
 

Торговые элементы - это набор параметров, к-рые нужны для торговли. Можно, но конечно не обязательно, это дело оформить в виде структуры. Пример привёл выше.

Тогда свойства члена-данные m_trade_elements по умолчанию задаются при создании объекта, здесь CTrade. Как правило, это методы:

  • конструктор -  CTrade::CTrade();
  • инициализация - CTrade::Init(const ulong _Magic,const STradeElements &_elements).

m_trade_elements - публичного доступа к нему нет. Поэтому перед совершением торговой операции можно воспользоваться уже готовой структурой типа STradeElements, либо создать set-метод доступа к m_trade_elements для изменения торговых элементов. Например так: CTrade::SetTradeElements(const STradeElements &_elements).

В методах класса CTrade() доступ к m_trade_elements получаем свободно. Как-то так:

ulong slippage=this.m_trade_elements.slippage;
uint trade_attempts=this.m_trade_elements.attempts;
uint trade_pause=this.m_trade_elements.pause;

Почему торговые элементы объединены в структуру? Да чтобы не плодить члены-данные класса CTrade и скомпоновать всё в какую-то совокупность...

 
denkir:

Торговые элементы - это набор параметров, к-рые нужны для торговли. Можно, но конечно не обязательно, это дело оформить в виде структуры. Пример привёл выше.

Тогда свойства члена-данные m_trade_elements по умолчанию задаются при создании объекта, здесь CTrade. Как правило, это методы:

  • конструктор -  CTrade::CTrade();
  • инициализация - CTrade::Init(const ulong _Magic,const STradeElements &_elements).

m_trade_elements - публичного доступа к нему нет. Поэтому перед совершением торговой операции можно воспользоваться уже готовой структурой типа STradeElements, либо создать set-метод доступа к m_trade_elements для изменения торговых элементов. Например так: CTrade::SetTradeElements(const STradeElements &_elements).

В методах класса CTrade() доступ к m_trade_elements получаем свободно. Как-то так:

Почему торговые элементы объединены в структуру? Да чтобы не плодить члены-данные класса CTrade и скомпоновать всё в какую-то совокупность...

Вот бы небольшой пример от Вас типа

struct st

{

double per;

}

class cl

{

st strut;

}

cl rez;

 
VOLDEMAR:

В общем вот мой финал, если есть предложения пишите и предлагйте

Конечно этот финал не идеал и часть кода было бы в другие классы засунуть, но пока так

Вольдемар, зер гут!



А если серьёзно, то посмотрите на код в той же самой Стандартной библиотеке. Увидите разницу :-)

 
denkir:

Вольдемар, зер гут!



А если серьёзно, то посмотрите на код в той же самой Стандартной библиотеке. Увидите разницу :-)

В четверке нет...
 
VOLDEMAR:
В четверке нет...

А какая разница? Просто структура кода у Вас пёстрая какая-то...

Вот к примеру, взял из MQL5 сделал для MQL4:

#include <Object.mqh>
//+------------------------------------------------------------------+
//| Class CTrade.                                                    |
//| Appointment: Class trade operations.                             |
//|              Derives from class CObject.                         |
//+------------------------------------------------------------------+
class CTrade : public CObject
  {
protected:
   //MqlTradeRequest   m_request;         // request data
   //MqlTradeResult    m_result;          // result data
   //MqlTradeCheckResult m_check_result;  // result check data
   bool              m_async_mode;      // trade mode
   ulong             m_magic;           // expert magic number
   ulong             m_deviation;       // deviation default
   //ENUM_ORDER_TYPE_FILLING m_type_filling;
   //---
   //ENUM_LOG_LEVELS   m_log_level;

public:
                     CTrade(void);
                    ~CTrade(void);
  };
//+------------------------------------------------------------------+


  Теперь этот шаблон можно развивать. И даже можно определить структуры MqlTradeRequest, MqlTradeResult и MqlTradeCheckResult для MQL4. Может быть не все поля будут такими как в MQL5, но начало будет положено.

К пример прототип OrderSend() в MQL4 такой:

int  OrderSend(
   string   symbol,              // символ
   int      cmd,                 // торговая операция
   double   volume,              // количество лотов
   double   price,               // цена
   int      slippage,            // проскальзывание
   double   stoploss,            // stop loss
   double   takeprofit,          // take profit
   string   comment=NULL,        // комментарий
   int      magic=0,             // идентификатор
   datetime expiration=0,        // срок истечения ордера
   color    arrow_color=clrNONE  // цвет
   );

Прикиньте, как эти параметры можно завернуть в структуру...

OrderSend - Документация на MQL4
  • docs.mql4.com
OrderSend - Документация на MQL4
 
VDev:

А откуда такая уверенность что всегда на всех ДЦ шаг лота будет меняться с кратностью 10???

Кратно настройке, пофиг на 10:

str.lots = floor(str.lots / SymbolInfoDouble(str.symbol, SYMBOL_VOLUME_STEP)) * SymbolInfoDouble(str.symbol, SYMBOL_VOLUME_STEP);
Причина обращения: