Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1378
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Ну вот. Вы получаете значение перечисления.
...
Если особенность известна, то учитывать её не сложно. Я использую PeriodSeconds();
...
Если бы использовали - то и вопрос бы не возник.
Объясните, пожалуйста..
В библии написано: В переменной _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
Да, но это медленно работает. Для сравнения набросал небольшой скрипт: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);
//---
}
//+------------------------------------------------------------------+
и
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Скрытый смысл таймфреймов в MQL5
Renat Fatkhullin, 2017.02.26 23:37
Это сделано для внутренней оптимизации.Ну вот. Вы получаете значение перечисления.
Если бы использовали - то и вопрос бы не возник.
Я не согласен.
Полагаю, это не оправдание и не объяснение даже.
Общая логика предопределённых переменных состоит в том, что к ним можно обратиться напрямую, и они отдают свои значения.
Так можно обращаться, например, к _Point, _Digits и т.п. И это - нормально.
Интуитивно ожидается, что и все другие предопределённые переменные обладают подобными свойствами.
Но в случае с _Period это не так.
--
Ещё раз всем спасибо. Будем считать, что вопрос снят.
Всем хороших выходных!)
для чего шифратор встроен в mql? не могу найти ему разумное применение
от самого себя нет смысла шифровать, а для второго пользователя видится только глобальные переменные терминалы
Сохранять на диск своё состояние, обмениваться данными через инет.
Исхожу из того, что если уж имеется индекс текущего бара со своим временем, то это сочетание никогда не изменится.
Или возможен вариант, при котором в результате подкачки истории этот индекс будет присвоен какому-то историческому бару, а текущий бар получит новый индекс, больший на количество подкачаных баров?
То же другими словами:
правильно ли понимать, что текущий бар становится доступен (индекс, цена и время) только после полной подкачки истории и в дальнейшем его параметры никогда не изменяются?
Подскажите пожалуйста как получить количество строк в таблице таблицы MySQL
Возвращает ошибку
Задача получить последний ID
также пробую и так, не могу получить количество строк
Что не так , почему не могу получить значение от запроса?
Если проверяю запрос по базе , то возвращает как есть
Точно
int id= DatabaseRead(request);Database же bool , а id int
Как вытащить результат запроса???
Все получилось. создал дополнительный класс 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);
}
На каждом тике открывается ордер. Как исправить, чтобы открывался только один?
Использую этот блок, взятый из документации (обавил тп и сл)
//+------------------------------------------------------------------+
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);
}
Решено.