Можно ли программно определить тип пиременной ? - страница 2

 

Вот мой класс

//+------------------------------------------------------------------+
//|                                                      C_Trade.mqh |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property strict
//+------------------------------------------------------------------+
//| Voldemar https://login.mql5.com/ru/users/voldemar                |
//+------------------------------------------------------------------+
#include  "C_Symbol.mqh"
#include  "C_Terminal.mqh"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class C_Trade
  {
private:
   C_Symbol          Sy;
   C_Terminal        Te;
   double            FreezeLevel;
public:

   string            SetSymbol;
   int               SetType;
   double            SetLots;
   double            SetPrice;
   int               SetSlippage;
   double            SetStoploss;
   double            SetTakeprofit;
   string            SetComment;
   int               SetMagic;
   datetime          SetExpiration;
   color             SetArcolor;
   int               SetTicket;

   double            GetAsk;
   double            GetBid;
   string            GetSymbol;
   int               GetType;
   int               GetError;
   double            GetLots;
   double            GetPrice;
   int               GetSlippage;
   double            GetStoploss;
   double            GetTakeprofit;
   string            GetComment;
   int               GetMagic;
   datetime          GetExpiration;
   color             GetArcolor;
   int               GetTicket;
   double            GetProfit;
   string            GetCommentError;


   bool              SetOrderModify(C_Trade  &str);
                     C_Trade();
                    ~C_Trade();
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
C_Trade ::  C_Trade(){  }
C_Trade :: ~C_Trade(){  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool C_Trade :: SetOrderModify(C_Trade  &str)
  {
   ResetLastError();
   int p=0;

   while(!IsTradeContextBusy() && p++<5)
      if(OrderSelect(str.SetTicket,SELECT_BY_TICKET)==true)
        {
         str.SetSymbol=OrderSymbol();
         str.GetMagic=OrderMagicNumber();
         Sy.GetSymbolInfo(str.SetSymbol);
         str.GetAsk=SymbolInfoDouble(str.SetSymbol,SYMBOL_ASK);
         str.GetBid=SymbolInfoDouble(str.SetSymbol,SYMBOL_BID);
         RefreshRates();
         if(str.SetType==OP_BUY || str.SetType==OP_BUYLIMIT || str.SetType==OP_BUYSTOP)
           {
            str.GetType=OP_BUY;

            str.GetTakeprofit=str.SetTakeprofit>0?NormalizeDouble(str.GetAsk+str.SetTakeprofit*Sy.GetMIPoint,Sy.GetMIDigits):0;
            str.GetStoploss  =str.SetStoploss>0?NormalizeDouble(str.GetAsk-str.SetStoploss  *Sy.GetMIPoint,Sy.GetMIDigits):0;
           }
         if(str.SetType==OP_SELL || str.SetType==OP_SELLLIMIT || str.SetType==OP_SELLSTOP)
           {
            str.GetType=OP_SELL;
            str.GetTakeprofit=str.SetTakeprofit>0?NormalizeDouble(str.GetBid-str.SetTakeprofit*Sy.GetMIPoint,Sy.GetMIDigits):0;
            str.GetStoploss=str.SetStoploss>0?NormalizeDouble(str.GetBid+str.SetStoploss  *Sy.GetMIPoint,Sy.GetMIDigits):0;
           }
         if(str.SetLots==0 || str.SetLots==NULL) str.GetLots=OrderLots();

         if(str.GetStoploss!=NormalizeDouble(OrderStopLoss(),Sy.GetMIDigits) || str.GetTakeprofit!=NormalizeDouble(OrderTakeProfit(),Sy.GetMIDigits) || str.SetPrice!=NormalizeDouble(OrderOpenPrice(),Sy.GetMIDigits))
           {
            if(OrderModify(str.SetTicket,str.SetPrice,str.GetStoploss,str.GetTakeprofit,str.SetExpiration,str.SetArcolor)==true)
              {
               str.GetTicket     = str.SetTicket;
               str.GetSymbol     = str.SetSymbol;
               str.GetType       = str.SetType;
               str.GetPrice      = str.SetPrice;
               str.GetSlippage   = str.SetSlippage;
               str.GetMagic      = str.SetMagic;
               str.GetArcolor    = str.SetArcolor;
               str.GetError=GetLastError();
               return true;
              }
            else
              {
               str.GetError=GetLastError();
               Sleep(500);
               if(p==5)
                  return false;
              }
           }
        }
   return false;
  }
//+------------------------------------------------------------------+
 

Часть кода я удалил так как речь не о нем

if(counter==0)
  {

   Order.SetType=OP_BUY;
   Order.SetTakeprofit=TakeProfit;
   Order.SetStoploss=StopLoss;
   if(Order.SetOrderModify(Order)==false)
      Print(" OrderType ",OrderType()," OrderTicket ",OrderTicket()," Error ",Order.GetError);
  }

Так я использую вызовы

Обратите внимание что в параметрах

   Order.SetTakeprofit=TakeProfit;  
   Order.SetStoploss=StopLoss;

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

 
Какие будут Варианты ?
 
Зря вы так относитесь к перегрузке функций. Это неотъемлемая часть ООП. И вас вопрос с помощью перегрузки очень просто решается и много простора для дальнейшего расширения функциональности класса.
 
Vladimir Pastushak:

Вот мой класс

Жёстко! Заполнять значениями один экземпляр класса и отдавать его в другой экземпляр класс. Это как сидеть за столом, и ложкой кормить товарища, а товарищ при этом тебя кормит. Это конечно сближает, но не очень удобно.

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

Для перегрузки не нужно полностью копировать функцию. Одна основная функция, а остальные делают незначительные расчеты и вызывают основную функцию. Удобно, наглядно, понятно.

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

 
Vitalii Ananev:
Зря вы так относитесь к перегрузке функций. Это неотъемлемая часть ООП. И вас вопрос с помощью перегрузки очень просто решается и много простора для дальнейшего расширения функциональности класса.
по ссылке масса непонятных вещей, я изучаю и хочу понять, но изучить можно только методом тыка..
 
Vladimir Pastushak:
 

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

В данном случае - я бы это сделал с помощью флага, что-то типа bool bNeedCount, устанавливаем его, если нужен пересчет, или сбрасываем, если пересчет не нужен.

Но, вобще говоря, я считаю более верным передвать ценовые уровни только прямым значением double - так код отвязывается от значности пункта.

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

 
Dmitry Fedoseev:
 

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

Друзья, вы учитывайте разный уровень подготовки участников.

Вы еще какой-нибудь Визитор предложите, вот уж где перегрузка и полиморфизм используется "на всю катушку"... Рано это еще ему.

 
Dmitry Fedoseev:

Жёстко! Заполнять значениями один экземпляр класса и отдавать его в другой экземпляр класс. Это как сидеть за столом, и ложкой кормить товарища, а товарищ при этом тебя кормит. Это конечно сближает, но не очень удобно.

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

Для перегрузки не нужно полностью копировать функцию. Одна основная функция, а остальные делают незначительные расчеты и вызывают основную функцию. Удобно, наглядно, понятно.

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

:)

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

 
Vladimir Pastushak:
по ссылке масса непонятных вещей, я изучаю и хочу понять, но изучить можно только методом тыка..
Пишем две функции с одинаковым названием, но с разным типом параметра. У одной инт, у второй дабл. Имя функций одинаковое, а какая будет отрабатываться при вызове определяется автоматически без нашего участия в зависимости от типа переданного в нее параметра. 
Причина обращения: