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

[Удален]  
User_mt5 #:

Ну вот. Вы получаете значение перечисления.

User_mt5 #:

...

Если особенность известна, то учитывать её не сложно. Я использую PeriodSeconds();

...

Если бы использовали - то и вопрос бы не возник.

 
User_mt5 #:

Объясните, пожалуйста..

В библии написано:  В переменной _Period хранится значение таймфрейма текущего графика.

Фактические значения _Period для ТФ:

М1 = 1

М5 = 5

М15 = 15

М30 = 30

H1 = 16385

H4 = 16388

H6 = 16390

Объясните, пожалуйста, числа 60, 120 и т.д. что.. уже не в моде?

Если знаете, хотя бы намекните в чём тут фишка? 

И теперь я боюсь спросить.. а в каких местах нашего загадочного MQL ещё есть подобные фишки? :(

Источник:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Скрытый смысл таймфреймов в MQL5

Serhii Shevchuk, 2017.02.27 01:53

Да, но это медленно работает. Для сравнения набросал небольшой скрипт:

#property script_show_inputs

input long              InpCycles=1000000000;

ENUM_TIMEFRAMES TF_list[32]={
PERIOD_MN1, PERIOD_W1,  PERIOD_D1,  PERIOD_H12,
PERIOD_H8,  PERIOD_H6,  PERIOD_H4,  PERIOD_H3,  
PERIOD_H2,  PERIOD_H1,  PERIOD_M30, PERIOD_M20,
PERIOD_M15, PERIOD_M12, PERIOD_M10, PERIOD_M6,  
PERIOD_M5,  PERIOD_M4,  PERIOD_M3,  PERIOD_M2,  
PERIOD_M1,  PERIOD_MN1, PERIOD_W1,  PERIOD_D1,
PERIOD_M5,  PERIOD_M4,  PERIOD_M3,  PERIOD_M2,
PERIOD_H2,  PERIOD_H1,  PERIOD_M30, PERIOD_M20
};

int PeriodMinutes(ENUM_TIMEFRAMES tf)
{
      uint t = uint(tf);
      uint f = 0xc000&t;
      uint min = 0x00FF&t;
      if(f==0x4000) min*= 60;
      else if(f==0x8000) min*= 10080;
      else if(f==0xc000)  min*= 43200;
      return(int(min));  
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   ulong tmp = 0;
   //
   uint idx = 0;
   ulong t0 = GetMicrosecondCount();
   for(long i=0;i<InpCycles;i++)
      tmp+= PeriodMinutes(TF_list[0x1f&(idx++)]);  
   ulong t1 = GetMicrosecondCount();
   Print("1) tmp = ",tmp,"... dT = ",t1-t0);
//---
   tmp = 0;
   idx = 0;
   t0 = GetMicrosecondCount();
   for(long i=0;i<InpCycles;i++)
      tmp+= PeriodSeconds(TF_list[0x1f&(idx++)])/60;
   t1 = GetMicrosecondCount();
   Print("2) tmp = ",tmp,"... dT = ",t1-t0);
//---
  }    
//+------------------------------------------------------------------+
Как видно, примерно вдвое медленнее, чем на if-ах:



и

 
Сергей Таболин #:

Ну вот. Вы получаете значение перечисления.

Если бы использовали - то и вопрос бы не возник.

Я не согласен.

Полагаю, это не оправдание и не объяснение даже.

Общая логика предопределённых переменных состоит в том, что к ним можно обратиться напрямую, и они отдают свои значения.

Так можно обращаться, например, к _Point, _Digits и т.п. И это - нормально.

Интуитивно ожидается, что и все другие предопределённые переменные обладают подобными свойствами.

Но в случае с _Period это не так.

--

Ещё раз всем спасибо. Будем считать, что вопрос снят.
Всем хороших выходных!)

 
Fast235 #:

для чего шифратор встроен в mql? не могу найти ему разумное применение

от самого себя нет смысла шифровать, а для второго пользователя видится только глобальные переменные терминалы

Сохранять на диск своё состояние, обмениваться данными через инет.

 

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

То же другими словами:
правильно ли понимать, что текущий бар становится доступен (индекс, цена и время) только после полной подкачки истории и в дальнейшем его параметры никогда не изменяются?

 

Подскажите пожалуйста как получить количество строк в таблице таблицы MySQL

//--- Выставленные позиции
struct PositionFib
  {
   int               ID;            // Индификатор
   int               ur;            // Уровень
   int               per;           // Период
   int               type;          // Тип ордера
   double            price;         // Цена Открытия
   double            priceTP;       // Цена Профита
   double            priceSL;       // Цена Стопа
   double            lot;           // Лот
   datetime          time;          // Время
   string            key;           // Ключ
  } position_buff[];
//--- заблокируем базу данных перед выполнением транзакций
   DatabaseTransactionBegin(database);
   int request=DatabasePrepare(database, "SELECT COUNT(*) FROM POSITION");
   DatabaseReadBind(request, person)
   id=person.ID;
  

Возвращает ошибку

Задача получить последний ID

также пробую и так, не могу получить количество строк 

 int request=DatabasePrepare(database, "SELECT COUNT(*) FROM POSITION");
   id= DatabaseRead(request);
 

Что не так , почему не могу получить значение от запроса?

//--- открываем/создаем базу данных в общей папке терминалов
   int database=DatabaseOpen(filename+".sqlite", DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE | DATABASE_OPEN_COMMON);
   if(database==INVALID_HANDLE)
     {
      Print("SaveStats: ", filename, " открываем/создаем базу данных в общей папке терминалов ", GetLastError());
      return;
     }

//--- заблокируем базу данных перед выполнением транзакций
   DatabaseTransactionBegin(database);
   int request=DatabasePrepare(database, "SELECT COUNT(*) FROM POSITION");
   int id= DatabaseRead(request);

Если проверяю запрос по базе , то возвращает как есть



Точно 

 int id= DatabaseRead(request);

Database же bool , а id int


Как вытащить результат запроса???


Все получилось. создал дополнительный класс sql

//--- заблокируем базу данных перед выполнением транзакций
   DatabaseTransactionBegin(database);
   int request=DatabasePrepare(database, "SELECT COUNT(*) FROM POSITION");
   DatabaseReadBind(request,sql);
 

С момента выгрузки индикатора до вызова DeInit проходит несколько секунд.

Почему возникает пауза и можно ли её избежать?

 
На каждом тике открывается ордер. Как исправить, чтобы открывался только один? 

Использую этот блок, взятый из документации (обавил тп и сл)

//+------------------------------------------------------------------+

void Open_order_BUY()

  {

    double bid = SymbolInfoDouble(Symbol(),SYMBOL_BID),

      ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);

    //--- объявление и инициализация запроса и результата

   MqlTradeRequest request={};

   MqlTradeResult  result={};

//--- параметры запроса

   request.action   =TRADE_ACTION_DEAL;                     // тип торговой операции

   request.symbol   =Symbol();                              // символ

   request.volume   =0.01;                                   // объем в 0.1 лот

   request.type     =ORDER_TYPE_BUY;                        // тип ордера

   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия

   request.sl       =bid-SL*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // SL

   request.tp       =ask+TP*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // TP

   request.deviation=5;                                     // допустимое отклонение от цены

   request.magic    =EXPERT_MAGIC;                          // MagicNumber ордера

//--- отправка запроса

   if(!OrderSend(request,result))

       PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

//--- информация об операции

   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

  }

  

//+------------------------------------------------------------------+ 

void Open_order_SELL()

  {

  

    double bid = SymbolInfoDouble(Symbol(),SYMBOL_BID),

      ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);

//--- объявление и инициализация запроса и результата

   MqlTradeRequest request={};

   MqlTradeResult  result={};

//--- параметры запроса

   request.action   =TRADE_ACTION_DEAL;                     // тип торговой операции

   request.symbol   =Symbol();                              // символ

   request.volume   =0.01;                                   // объем в 0.2 лот

   request.type     =ORDER_TYPE_SELL;                       // тип ордера

   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); // цена для открытия

   request.sl       =ask+SL*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // SL

   request.tp       =bid-TP*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // TP

   request.deviation=5;                                     // допустимое отклонение от цены

   request.magic    =EXPERT_MAGIC;                          // MagicNumber ордера

//--- отправка запроса

   if(!OrderSend(request,result))

      PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

//--- информация об операции

   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

  }


 
Ivan Butko #:
На каждом тике открывается ордер. Как исправить, чтобы открывался только один? 

Использую этот блок, взятый из документации (обавил тп и сл)

//+------------------------------------------------------------------+

void Open_order_BUY()

  {

    double bid = SymbolInfoDouble(Symbol(),SYMBOL_BID),

      ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);

    //--- объявление и инициализация запроса и результата

   MqlTradeRequest request={};

   MqlTradeResult  result={};

//--- параметры запроса

   request.action   =TRADE_ACTION_DEAL;                     // тип торговой операции

   request.symbol   =Symbol();                              // символ

   request.volume   =0.01;                                   // объем в 0.1 лот

   request.type     =ORDER_TYPE_BUY;                        // тип ордера

   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия

   request.sl       =bid-SL*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // SL

   request.tp       =ask+TP*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // TP

   request.deviation=5;                                     // допустимое отклонение от цены

   request.magic    =EXPERT_MAGIC;                          // MagicNumber ордера

//--- отправка запроса

   if(!OrderSend(request,result))

       PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

//--- информация об операции

   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

  }

  

//+------------------------------------------------------------------+ 

void Open_order_SELL()

  {

  

    double bid = SymbolInfoDouble(Symbol(),SYMBOL_BID),

      ask = SymbolInfoDouble(Symbol(),SYMBOL_ASK);

//--- объявление и инициализация запроса и результата

   MqlTradeRequest request={};

   MqlTradeResult  result={};

//--- параметры запроса

   request.action   =TRADE_ACTION_DEAL;                     // тип торговой операции

   request.symbol   =Symbol();                              // символ

   request.volume   =0.01;                                   // объем в 0.2 лот

   request.type     =ORDER_TYPE_SELL;                       // тип ордера

   request.price    =SymbolInfoDouble(Symbol(),SYMBOL_BID); // цена для открытия

   request.sl       =ask+SL*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // SL

   request.tp       =bid-TP*SymbolInfoDouble(Symbol(),SYMBOL_POINT);                                   // TP

   request.deviation=5;                                     // допустимое отклонение от цены

   request.magic    =EXPERT_MAGIC;                          // MagicNumber ордера

//--- отправка запроса

   if(!OrderSend(request,result))

      PrintFormat("OrderSend error %d",GetLastError());     // если отправить запрос не удалось, вывести код ошибки

//--- информация об операции

   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

  }


Решено.