Обсуждение статьи "Работа с сетевыми функциями, или MySQL без DLL: Часть II - программа для мониторинга изменения свойств сигналов"
Классная и практичная приложуха получилась в итоге!
Жаль, MQ сами не собирают эти данные (или не дают к ним доступ?) по всем сигналам. Полезная база получилась бы.
Классная и практичная приложуха получилась в итоге!
Жаль, MQ сами не собирают эти данные (или не дают к ним доступ?) по всем сигналам. Полезная база получилась бы.
В каком смысле "не собирают", если база формируется из их API? Они не только не собирают, но и раздают.
Меня больше "прикалывает", что теперь можно обойтись без зависимости от MySQL и адаптировать проект под встроенный SQLite.
![Документация по MQL5: Управление сигналами Документация по MQL5: Управление сигналами](https://c.mql5.com/36/32/dokumentaciya-po-mql5-upravlenie.png)
- www.mql5.com
Связанная статья: SQLite: нативная работа с базами данных на SQL в MQL5
Теперь работать с базами данных и оперировать большими объемами можно штатно в MQL5 в десятки раз быстрее, чем со внешними SQL серверами. Это
достигается за счет бесшовной интеграции быстрого движка SQLite в подсистему MQL5 и полному избавлению от сетевых операций.
Все это хорошо но одно НО!
При тестировании в Тесторе через сокет отключается, как я понимаю, и данные не будут сбрасываться. А использовать данные при тестировании продуктов очень важный момент.
Все это хорошо но одно НО!
При тестировании в Тесторе через сокет отключается, как я понимаю, и данные не будут сбрасываться. А использовать данные при тестировании продуктов очень важный момент.
![SQLite: нативная работа с базами данных на SQL в MQL5 SQLite: нативная работа с базами данных на SQL в MQL5](https://c.mql5.com/36/40/sqlite-nativnaya-rabota-s-bazami.jpg)
- www.mql5.com
I implemented it in my EA without any problems, it compiles perfectly, but sometimes an error occurs and the EA closes.
array out of range in 'MySQLTransaction.mqh' (365,36)
//+------------------------------------------------------------------+
//| Parse received data |
//+------------------------------------------------------------------+
ENUM_TRANSACTION_STATE CMySQLTransaction::Incoming(uchar &data[], uint len)
{
int ptr=0; // index of the current byte in the 'data' buffer
ENUM_TRANSACTION_STATE result=MYSQL_TRANSACTION_IN_PROGRESS; // result of handling accepted data
while(len>0)
{
if(m_packet.total_length==0)
{
//--- If the amount of data in the packet is unknown
while(m_rcv_len<4 && len>0)
{
m_hdr[m_rcv_len] = data[ptr];
m_rcv_len++;
ptr++;
len--;
}
//--- Received the amount of data in the packet
if(m_rcv_len==4)
{
//--- Reset error codes etc.
m_packet.Reset();
m_packet.total_length = reader.TotalLength(m_hdr);
m_packet.number = m_hdr[3];
//--- Length received, reset the counter of length bytes
m_rcv_len = 0;
//--- Highlight the buffer of a specified size
if(ArrayResize(m_packet.data,m_packet.total_length)!=m_packet.total_length)
return MYSQL_TRANSACTION_ERROR; // internal error
}
else // if the amount of data is still not accepted
return MYSQL_TRANSACTION_IN_PROGRESS;
}
//--- Collect packet data
while(len>0 && m_rcv_len<m_packet.total_length)
{
m_packet.data[m_rcv_len] = data[ptr];
m_rcv_len++;
ptr++;
len--;
}
//--- Make sure the package has been collected already
if(m_rcv_len<m_packet.total_length)
return MYSQL_TRANSACTION_IN_PROGRESS;
//--- Handle received MySQL packet
m_packet.index = 0;
m_packet.type = MYSQL_PACKET_NONE;
if(m_packet.total_length>0)
{
if(m_packet.data[0]==0)
{
//--- Ok packet
m_packet.type = MYSQL_PACKET_OK;
m_packet.index++;
m_packet.affected_rows = reader.GetDataFieldLen(&m_packet);
m_packet.last_id = reader.GetDataFieldLen(&m_packet);
m_packet.server_status = reader.Uint16(&m_packet);
m_packet.warnings = reader.Uint16(&m_packet);
if(m_packet.index<m_packet.total_length)
m_packet.message = reader.DfString(&m_packet);
if((result = PacketOkHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
break;
}
else
if(m_packet.data[0]==0xfe)
{
//--- End Of File packet
m_packet.type = MYSQL_PACKET_EOF;
m_packet.index++;
m_packet.warnings = reader.Uint16(&m_packet);
m_packet.server_status = reader.Uint16(&m_packet);
if((result = PacketEOFHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
break;
}
else
if(m_packet.data[0]==0xff)
{
//--- Error packet
m_packet.type = MYSQL_PACKET_ERROR;
m_packet.index++;
m_packet.error.code = reader.Uint16(&m_packet);
if((result = PacketErrorHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
break;
}
else
if(!m_packet.number && m_packet.data[0]==0x0a)
{
//--- Greeting packet
m_packet.type = MYSQL_PACKET_GREETING;
if((result = PacketGreetingHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
break;
}
else
{
//--- Data packet
m_packet.type = MYSQL_PACKET_DATA;
if((result = PacketDataHandler(&m_packet))==MYSQL_TRANSACTION_ERROR)
break;
}
}
m_rcv_len = 0;
m_packet.total_length = 0;
}
return result;
}
This error happens even when Algotrading is disabled.
I implemented it in my EA without any problems, it compiles perfectly, but sometimes an error occurs and the EA closes.
array out of range in 'MySQLTransaction.mqh' (365,36)
This error happens even when Algotrading is disabled.
I am just trying to use the MySQL part of the system, but I keep getting a "No database selected" error - even if I issue a "use `mytable`" command.
Do you have any thoughts on why that is happening?
I am just trying to use the MySQL part of the system, but I keep getting a "No database selected" error - even if I issue a "use `mytable`" command.
Do you have any thoughts on why that is happening?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Работа с сетевыми функциями, или MySQL без DLL: Часть II - программа для мониторинга изменения свойств сигналов:
В предыдущей части статьи мы ознакомились с реализацией коннектора MySQL. В этой части мы рассмотрим его применение на примере реализации сервиса сбора свойств сигналов и программы для просмотра их изменения с течением времени. Кроме того, реализованный пример может иметь практический смысл в том случае, если пользователю нужно наблюдать изменения свойств, которые не отображаются на веб-странице сигнала.
Демонстрация работы приложения представлена на рисунке 6.
Автор: Serhii Shevchuk