Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 223

 
Добрый день. Пожалуйста  помогите начинающему трейдеру в  поиске подходящего  советника для  автоматизированной торговли, который  способен  открывать локированные ордера в  валютных парах с возможностью произвольной установки  тейк-профитов. Спасибо вам.
 
abcxyzabcxyz:
Добрый день. Пожалуйста  помогите начинающему трейдеру в  поиске подходящего  советника для  автоматизированной торговли, который  способен  открывать локированные ордера в  валютных парах с возможностью произвольной установки  тейк-профитов. Спасибо вам.
Если Вам действительно нужно локирование - то Вас сюда. На MetaTrader 5 локирования нет, так как платформа MetaTrader 5 - неттинговая.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
Как вариант: объявите во всех из них метод Type в котором возвращайте идентификатор типа.

Хех, если бы можно было править исходники... Не надо все так упрощать. А все-таки - есть ли на mql5 узнать имя класса??? 

 
YAndrey:

Хех, если бы можно было править исходники... Не надо все так упрощать. А все-таки - есть ли на mql5 узнать имя класса??? 

Смотрите в сторону шаблонов. Этот код вернет  имя класса или примитивного типа.

#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 
   CTrade trade;   
   double d_value=M_PI;
   int i_value=INT_MAX;
   Print("d_value: type=",GetTypeName(d_value), ",   value=", d_value);
   Print("i_value: type=",GetTypeName(i_value), ",   value=", i_value);
   Print("trade: type=",GetTypeName(trade));
//--- 
  }
//+------------------------------------------------------------------+
//| Возвращает в строковом виде тип                                  |
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T &t)
  {
//--- вернем тип в виде строки
   return(typename(T));
//---
  }

  

 
C-4:

Смотрите в сторону шаблонов. Этот код вернет  имя класса или примитивного типа.

#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- 
   CTrade trade;   
   double d_value=M_PI;
   int i_value=INT_MAX;
   Print("d_value: type=",GetTypeName(d_value), ",   value=", d_value);
   Print("i_value: type=",GetTypeName(i_value), ",   value=", i_value);
   Print("trade: type=",GetTypeName(trade));
//--- 
  }
//+------------------------------------------------------------------+
//| Возвращает в строковом виде тип                                  |
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T &t)
  {
//--- вернем тип в виде строки
   return(typename(T));
//---
  }

  

Во! Ужу что-то! Но с new не работает - в коде пример, чего мне нужно - может кто подскажет какие способы?

class a{
public:
virtual void Print(){Print("Print class a");}
};

class b:public a{
public:
virtual void Print(){Print("Print class b");}
};

class c:public a{
public:
virtual void Print(){Print("Print class c");}
void Print2(){Print("!Print2! class c");}
};


void add(a *&arr[], bool var)
{
   ArrayResize(arr, ArraySize(arr)+1);
   if (var)
      arr[ArraySize(arr)-1] = new b;
   else
      arr[ArraySize(arr)-1] = new c;
   
}

void OnStart()
  {
//--- 
   
   
   a *arr[];

   add(arr, true); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
   add(arr, false); // Это потомок класса а или сам класс а, исходный код которого я править не могу.
   for (int i = 0; i < ArraySize(arr); i++)
   {
      // Вот тут то мне и надо узнать, что за класс там
      // шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в с
      if (i == 1) // Вот тут должна быть проверка на имя класса
      {
         c *tmp = arr[i];
         tmp.Print2();
      }
    }  
   
   
   
   
   
//--- 
  }
 
YAndrey:

Во! Ужу что-то! Но с new не работает - в коде пример, чего мне нужно - может кто подскажет какие способы?

Это проблема шаблонного метода. К сожалению шаблонный метод возвращает название класса ссылающегося на экземпляр. Тип самого экзепляра по-прежнему неизвестен.
 

Кто-нибудь может мне объяснить почему приведенный код не работает в тестере, в то время как в реал-тайм он работает!!? Конкретно интересует, почему в тестере после HistorySelect(0, TimeCurrent()) не доступны свойства HistoryOrderGetInteger...

#include <Trade\Trade.mqh>

CTrade trade;

int OnInit()
{
   trade.LogLevel(LOG_LEVEL_NO);
   return INIT_SUCCEEDED;
}
void OnTick()
{
   if(!DetectNewBar())return;
   trade.Sell(0.1);
   HistorySelect(0, TimeCurrent());
   for(; dealsCount < HistoryDealsTotal(); dealsCount++)
   {
      ulong ticket = HistoryDealGetTicket(dealsCount);
      RecalcDeal(ticket);
   }
}

bool DetectNewBar(void)
{
   MqlRates bars[1];
   CopyRates(Symbol(), PERIOD_M1, 0, 1, bars);
   if(bars[0].time != timeLastBar)
   {
      timeLastBar = bars[0].time;
      //printf(expertName + " new bar detected: " + TimeToString(bars[0].time));
      return true;
   }
   return false;
}

void RecalcDeal(ulong ticketDeal)
{
   //History is selected in OnTick()!
   ulong ticketOrder = HistoryDealGetInteger(ticketDeal, DEAL_ORDER);
   //if(!HistoryOrderSelect(ticketOrder))
   //   printf("order not select.");
   ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticketOrder, ORDER_TYPE);
   datetime time = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP); 
   ulong time_msc = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP_MSC); 
   printf("Order: " + (string)ticketOrder + " Type: " + EnumToString(type) + " Time: " + (string)time +
          " Time msc: " + (string)time_msc + " Total Orders: " + HistoryOrdersTotal());
}

int dealsCount;

datetime timeLastBar;

Скриншот в тестере стратегий:

 

Скриншот в реал-тайм на демо:

 

p.s. Что интересно, первый ордер в тестере обрабатывается корректно, а остальные уже нет. И еще, если расскоментировать HistroryOrderSelect(ticketOrder) то в реал-тайм начнет вываливаться соообщение что ордер не был выбран, а в тестере стратегий наоборот, все начнет работать, за исключением первого ордера. 

 

И у меня какая-то проблема с HistorySelect(). Открываю скриптом позицию отправкой маркет-ордера, и если сделка открылась, тут же смотрю количество сделок в истории с момента запуска скрипта, причём проверяю его 10 раз с интервалом в секунду. Должна быть, понятное дело, одна сделка. Вот скрипт:

void OnStart()
{
        // время запуска скрипта
        datetime dtStartTime = TimeCurrent();
        
        // структуры запроса
        MqlTradeRequest oRequest = {0};
        MqlTradeResult oResult = {0};
        
        // формируем запрос
        oRequest.action = TRADE_ACTION_DEAL;
        oRequest.magic  = 15;
        oRequest.symbol = _Symbol;
        oRequest.volume = 0.1;
        oRequest.type   = ORDER_TYPE_BUY;
        oRequest.type_filling = ORDER_FILLING_FOK;
        oRequest.price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
        oRequest.deviation = 1000;
        
        // шлём ордер
        bool bResult = OrderSend(oRequest, oResult);
        
        // если позиция успешно открыта
        if(bResult == true && oResult.retcode == 10009) // если позиция открыта
        {
                for(int i = 0; i < 10; i++)
                {
                        // запрашиваем историю за время работы скрипта
                        HistorySelect(dtStartTime, TimeCurrent());
                
                        // количество сделок за время работы скрипта (должна быть одна)
                        Print("Шаг: ", i, " Совершено сделок: ", HistoryDealsTotal());
                        
                        Sleep(1000);
                }
        }
}

А вот результат в Альфа-форекс:

Сделка реально совершена, а в истории её нет даже через 10 секунд. Что это? Баг МТ? Глюк Альфы? Какая-то фича, которую я не знаю? У Альпари этот же скрипт работает нормально, только изредка на первом (нулевом) шаге проскакивает ноль (ну, это понятно - не успела ещё обновиться история), все остальные шаги - единица. Но через десять-то секунд почему нет сделки в истории?

 
Algo:

И у меня какая-то проблема с HistorySelect(). Открываю скриптом позицию отправкой маркет-ордера, и если сделка открылась, тут же смотрю количество сделок в истории с момента запуска скрипта, причём проверяю его 10 раз с интервалом в секунду. Должна быть, понятное дело, одна сделка. Вот скрипт:

А вот результат у Альфа-брокера:

Сделка реально совершена, а в истории её нет даже через 10 секунд. Что это? Баг МТ? Глюк Альфы? Какая-то фича, которую я не знаю? У Альпари этот же скрипт работает нормально, только изредка на первом (нулевом) шаге проскакивает ноль (ну, это понятно - не успела ещё обновиться история), все остальные шаги - единица. Но через десять-то секунд почему нет сделки в истории?

Напрягает строка

datetime dtStartTime = TimeCurrent();

Вы уверены что   dtStartTime и TimeCurrent() не одно и тоже число к моменту for? Возможно округление в одну секунду выставляет совершенную сделку за пределы  dtStartTime. 

 
C-4:

Напрягает строка

datetime dtStartTime = TimeCurrent();

Вы уверены что   dtStartTime и TimeCurrent() не одно и тоже число к моменту for? Возможно округление в одну секунду выставляет совершенную сделку за пределы  dtStartTime. 

А даже если одно, разве МТ не должен выдать историю за эту секунду? Т.е. разве он не выдаёт историю в указанных границах, ВКЛЮЧАЯ сами границы?

Но в любом случае, я пробовал писать и  dtStartTime = TimeCurrent() - 1, и dtStartTime = TimeCurrent() - 10. Не помогает.

Причина обращения: