Доступны. Только следите за расположением базы. Они создаются так-же как и файлы.
#define DB_NAME "OHLC_DB"int db_handle;
string TableName;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit(){
db_handle = DatabaseOpen(DB_NAME, DATABASE_OPEN_READWRITE|DATABASE_OPEN_CREATE);
if (db_handle != INVALID_HANDLE){
Print(StringFormat("Database %s was opened", DB_NAME));
TableName = Symbol() + "_" + enumTimeFrameToString(Period());
if (DatabaseTableExists(db_handle, TableName)){
Print(StringFormat("Table %s is exist", TableName));
}else{
if (DatabaseExecute(db_handle, "CREATE TABLE " + TableName + "(""TIME TEXT PRIMARY KEY NOT NULL,""OPEN REAL NOT NULL,""HIGH REAL NOT NULL,""LOW REAL NOT NULL,""CLOSE REAL NOT NULL );")){
Print(StringFormat("Table %s was created", TableName));
string time = "'" + TimeToString(iTime(Symbol(), PERIOD_CURRENT, 0)) + "'";
double open = iOpen(Symbol(), PERIOD_CURRENT, 0);
double high = iHigh(Symbol(), PERIOD_CURRENT, 0);
double low = iLow(Symbol(), PERIOD_CURRENT, 0);
double close = iClose(Symbol(), PERIOD_CURRENT, 0);
if (!DatabaseExecute(db_handle,"INSERT INTO " + TableName + " (TIME,OPEN,HIGH,LOW,CLOSE) ""VALUES (" + StringFormat("%s,%.5f,%.5f,%.5f,%.5f", time, open, high, low, close) + ");")){
Print("Table: ", TableName, " insert failed with code ", GetLastError());
DatabaseClose(db_handle);
return(INIT_FAILED);
}elsePrint("New table started:");
}else{
Print(StringFormat("Could not create %s table. Error is: %d", TableName, GetLastError()));
DatabaseClose(db_handle);
return(INIT_FAILED);
}
}
return(INIT_SUCCEEDED);
}else{
Print("Could not open db. Error is: ", GetLastError());
return(INIT_FAILED);
}
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason){
DatabaseClose(db_handle);
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick(){
string time = "'" + TimeToString(iTime(Symbol(), PERIOD_CURRENT, 0)) + "'";
double open = iOpen(Symbol(), PERIOD_CURRENT, 0);
double high = iHigh(Symbol(), PERIOD_CURRENT, 0);
double low = iLow(Symbol(), PERIOD_CURRENT, 0);
double close = iClose(Symbol(), PERIOD_CURRENT, 0);
if (!DatabaseExecute(db_handle,"INSERT INTO " + TableName + " (TIME,OPEN,HIGH,LOW,CLOSE) ""VALUES (" + StringFormat("%s,%.5f,%.5f,%.5f,%.5f", time, open, high, low, close) + ");")){
Print("Table: ", TableName, " insert failed with code ", GetLastError());
DatabaseClose(db_handle);
}
}
//+------------------------------------------------------------------+string enumTimeFrameToString(ENUM_TIMEFRAMES frame){
switch(frame){
casePERIOD_M1: return"M1";
casePERIOD_M2: return"M2";
casePERIOD_M3: return"M3";
casePERIOD_M4: return"M4";
casePERIOD_M5: return"M5";
casePERIOD_M6: return"M6";
casePERIOD_M10: return"M10";
casePERIOD_M12: return"M12";
casePERIOD_M15: return"M15";
casePERIOD_M20: return"M20";
casePERIOD_M30: return"M30";
casePERIOD_H1: return"H1";
casePERIOD_H2: return"H2";
casePERIOD_H3: return"H3";
casePERIOD_H4: return"H4";
casePERIOD_H6: return"H6";
casePERIOD_H8: return"H8";
casePERIOD_D1: return"D1";
casePERIOD_W1: return"W1";
default: return"MN1";
}
}
Вот мой код. В инициализации он создает в таблице одну запись. В теле OnTick он сразу же должен вернуть ошибку, так как я пытаюсь добавить запись с таким же PRIMARY KEY, и после этого база сразу закрывается. Но при этом я при ее открытии должен увидеть хотя бы ту первую запись, но при запуске в тестере ее нет. И даже таблица не создается. А если запускаю просто в терминале то все нормально. Первая запись есть.
Вот мой код. В инициализации он создает в таблице одну запись. В теле OnTick он сразу же должен вернуть ошибку, так как я пытаюсь добавить запись с таким же PRIMARY KEY, и после этого база сразу закрывается. Но при этом я при ее открытии должен увидеть хотя бы ту первую запись, но при запуске в тестере ее нет. И даже таблица не создается. А если запускаю просто в терминале то все нормально. Первая запись есть.
В который раз убеждаюсь, что тестер и сам терминал - суть разные ипостаси...
HistorySelect(xxx,TimeCurrent()) miss the latest history order / deal sometimes. Now you have to use HistorySelect(xxx,TimeCurrent()+1) To get a more accurate result.
Одна секунда - это частая потеря последней сделки/ордера на реале. Например, на многих бриджах ордер уходит на исполнение на TTL-время, которое может быть равно пяти секундам. Если за пять секунд не исполнился - реджект. Либо исполнился, но секунды за три.
В случае, если от акцепта до исполнения не было тиков, такой вызов HistorySelect не получит об этом информацию.
Возможно, TimeCurrent стоит делать равным MathMax(LastOrder_time, MarketWatch_Time). Тогда HistorySelect будет корректный. Но TimeCurrent, возможно, слишком дорогой.
ЗЫ Кстати, такая схема работа HistorySelect будет пропускать часть истории торгов.
voidOnStart()
{
staticMqlTick PrevTick = {0};
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
{
if (HistorySelect(PrevTick.time, INT_MAX))
// Учитываем новые ордера/сделки в Истории торгов
PrevTick = Tick;
}
}
Хотя, на первый взгляд, все чисто.
Написать дешевый DealsTotal() не просто в MT5. Это не элементарный (и бесплатный) OrdersHistoryTotal() в MT4.
мысли вслух, не претендую на актуальность и компетентность:
fxsaber:
В случае, если от акцепта до исполнения не было тиков, такой вызов HistorySelect не получит об этом информацию.
Вы не решите эту проблему, модель взаимодействия сервер - терминал - MQL изначально такая была заложена
в МТ5 еще не дошел до момента проверок, но в МТ4 точно знаю, что бывают ситуации когда на в окне обзор рынка на символе происходят изменения цен по нашему символу, а вот тиков в ЕА может не поступить или поступает меньше
ладно не суть, так работает значит так, Вам просто нужно в ТС выбрать решение, что происходит с ордером при отсутствии информации от сервера с момента отправки ордера - т.е. априори ордер будет выставлен или отклонен, а получив ответ подтверждать это предварительное решение или отменять - т.е. работать с неподтвержденной информацией или ждать все таки ответ от сервера - это предлагают MQ и Вас скорее всего не устраивает
fxsaber:
сать дешевый DealsTotal() не просто в MT5. Это не элементарный (и бесплатный) OrdersHistoryTotal() в MT4.
а не напишите ;)
вернее, скорее всего напишите и будете тратить ресурсы ЕА на сопровождение алгоритма, думаю нужно выяснить как работает SQLite, MQ тесты производительности заявляла, работа с большими таблицами и выборками это как раз и назначение БД - код ЕА будет минималистическим, всю работу БД будет Вам делать, вся работа сведется к заполнению данных при выставлении ордера и актуализации при ответе от сервера (синхронизация, понятное дело при запуске ЕА, БД в памяти)
вернее, скорее всего напишите и будете тратить ресурсы ЕА на сопровождение алгоритма, думаю нужно выяснить как работает SQLite, MQ тесты производительности заявляла, работа с большими таблицами и выборками это как раз и назначение БД - код ЕА будет минималистическим, всю работу БД будет Вам делать, вся работа сведется к заполнению данных при выставлении ордера и актуализации при ответе от сервера (синхронизация, понятное дело при запуске ЕА, БД в памяти)
Изначально был написан и выложен. Вряд ли получится быстрее.
Assume that, in a few cases, the result of running this code is to return "Not Found."
I don't quite understand why.
Why can't it find itself in the events it triggers?
The transaction event sent by the server to the terminal has arrived, but the server cannot simultaneously synchronize the correct time to the terminal?
My understanding is that a second's increase in the value of TimeCurrent() is more than enough.
Объем импорта г/г (Imports y/y) отражает изменение объема импорта товаров и услуг в отчетном месяце по сравнению с тем же месяцем прошлого года. Показатели импорта используются для оценки внешней торговой активности Японии и спроса на импортируемые товары внутри страны. Из-за последствий "финансового кризиса" США Япония также столкнулась с...
Доступны. Только следите за расположением базы. Они создаются так-же как и файлы.
Вот мой код. В инициализации он создает в таблице одну запись. В теле OnTick он сразу же должен вернуть ошибку, так как я пытаюсь добавить запись с таким же PRIMARY KEY, и после этого база сразу закрывается. Но при этом я при ее открытии должен увидеть хотя бы ту первую запись, но при запуске в тестере ее нет. И даже таблица не создается. А если запускаю просто в терминале то все нормально. Первая запись есть.
Вот мой код. В инициализации он создает в таблице одну запись. В теле OnTick он сразу же должен вернуть ошибку, так как я пытаюсь добавить запись с таким же PRIMARY KEY, и после этого база сразу закрывается. Но при этом я при ее открытии должен увидеть хотя бы ту первую запись, но при запуске в тестере ее нет. И даже таблица не создается. А если запускаю просто в терминале то все нормально. Первая запись есть.
В который раз убеждаюсь, что тестер и сам терминал - суть разные ипостаси...
Давно рекомендуется к TimeCurrent() добавлять одни сутки. Просто теперь, в ответ на Ваш не совсем корректный код, терминал даёт Вам совет.
Одна секунда - это частая потеря последней сделки/ордера на реале. Например, на многих бриджах ордер уходит на исполнение на TTL-время, которое может быть равно пяти секундам. Если за пять секунд не исполнился - реджект. Либо исполнился, но секунды за три.
В случае, если от акцепта до исполнения не было тиков, такой вызов HistorySelect не получит об этом информацию.
Возможно, TimeCurrent стоит делать равным MathMax(LastOrder_time, MarketWatch_Time). Тогда HistorySelect будет корректный. Но TimeCurrent, возможно, слишком дорогой.
ЗЫ Кстати, такая схема работа HistorySelect будет пропускать часть истории торгов.
Хотя, на первый взгляд, все чисто.
Написать дешевый DealsTotal() не просто в MT5. Это не элементарный (и бесплатный) OrdersHistoryTotal() в MT4.
мысли вслух, не претендую на актуальность и компетентность:
В случае, если от акцепта до исполнения не было тиков, такой вызов HistorySelect не получит об этом информацию.
Вы не решите эту проблему, модель взаимодействия сервер - терминал - MQL изначально такая была заложена
в МТ5 еще не дошел до момента проверок, но в МТ4 точно знаю, что бывают ситуации когда на в окне обзор рынка на символе происходят изменения цен по нашему символу, а вот тиков в ЕА может не поступить или поступает меньше
ладно не суть, так работает значит так, Вам просто нужно в ТС выбрать решение, что происходит с ордером при отсутствии информации от сервера с момента отправки ордера - т.е. априори ордер будет выставлен или отклонен, а получив ответ подтверждать это предварительное решение или отменять - т.е. работать с неподтвержденной информацией или ждать все таки ответ от сервера - это предлагают MQ и Вас скорее всего не устраивает
сать дешевый DealsTotal() не просто в MT5. Это не элементарный (и бесплатный) OrdersHistoryTotal() в MT4.
а не напишите ;)
вернее, скорее всего напишите и будете тратить ресурсы ЕА на сопровождение алгоритма, думаю нужно выяснить как работает SQLite, MQ тесты производительности заявляла, работа с большими таблицами и выборками это как раз и назначение БД - код ЕА будет минималистическим, всю работу БД будет Вам делать, вся работа сведется к заполнению данных при выставлении ордера и актуализации при ответе от сервера (синхронизация, понятное дело при запуске ЕА, БД в памяти)
а не напишите ;)
вернее, скорее всего напишите и будете тратить ресурсы ЕА на сопровождение алгоритма, думаю нужно выяснить как работает SQLite, MQ тесты производительности заявляла, работа с большими таблицами и выборками это как раз и назначение БД - код ЕА будет минималистическим, всю работу БД будет Вам делать, вся работа сведется к заполнению данных при выставлении ордера и актуализации при ответе от сервера (синхронизация, понятное дело при запуске ЕА, БД в памяти)
Изначально был написан и выложен. Вряд ли получится быстрее.
Изначально был написан и выложен. Вряд ли получится быстрее.
значит я задачу не правильно увидел
думал, что нужно актуализировать список ордеров из двух точек OnTradeTransaction() и OnTick() , поэтому и предложил в БД это выполнять