Как вариант, таким образом можно записывать и считывать из глобальных переменных строки, простые структуры и даже массивы (например, обмениваться результатами CopyTicks)
Возможно, стоит причесать в виде библиотеки.
атомарность нарушается и можно наступить на крепкие грабли
for (int i = 0; i < Size; i++) \
GlobalVariableSet(GetName(Name, i), Array[i]);
есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.
есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.
Для этого есть GlobalVariableSetOnCondition, а альтернативу ей было влом писать.
Честно говоря, никогда не использовал глобальные переменные. Поэтому даже не знаю, для чего они нужны.
есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.
fxsaber: Не владею терминологией. Поясните.
самый технически правильный способ - это к вашей библиотеки TypeToBytes (так кажется называется) привесить опциональный интерфейс к любой key-value базе. Да, это будет DLL, но зато это будет круто.
Maxim Kuznetsov: самый технически правильный способ - это к вашей библиотеки TypeToBytes (так кажется называется) привесить опциональный интерфейс к любой key-value базе. Да, это будет DLL, но зато это будет круто.
Тут терминологическое невежество снова не позволяет мне понять смысл сказанного.
Крутость не преследуется. Библиотеку используют < 1%. Еще бОльшие навороты будут использовать < 1% от этих использующих. Поэтому видится правильным, что должна быть просто база. И она есть. Уже этого оказалось достаточным, чтобы легко писать ранее сложные вещи. Код выше - из таких вещей.
Тут терминологическое невежество снова не позволяет мне понять смысл сказанного.
Крутость не преследуется. Библиотеку используют < 1%. Еще бОльшие навороты будут использовать < 1% от этих использующих. Поэтому видится правильным, что должна быть просто база. И она есть. Уже этого оказалось достаточным, чтобы легко писать ранее сложные вещи. Код выше - из таких вещей.
key-value база - минималистичная СУБД которая хранит произвольные данные по произвольным-же уникальным ключам и гарантирует атомарность чтения-записи.
Просто постановка вопроса - "а может стоит хранить строки?" намекает что стоит хранить вообще произвольные данные. Да и вместо ключей удобно использовать структуры. А это и есть key-value база. А ваша библиотека как раз и работает с произвольными данными (по крайней мере их конвертирует). То есть возможность внешнего хранения данных - логичное развитие.
PS/ ещё раз - код который выше несёт в себе ошибку. А то сейчас не подумавши начнут тягать к себе в проекты :-)
В чем ошибка _GlobalVariableSet, по сравнению со штатной GlobalVariableSet? Обе не обладают атомарным доступом.
Прошу показать в кодобазе библиотеку, обладающую атомарным доступом. Или в том же MQL, акромя упомянутой GlobalVariableSetOnCondition.
File-функции - нет, включая Memory Mapping. Где такой функционал?
Как раз все стандартные GlobalVariableXXX атомарны. GlobalVariableGet гарантирует что ты получишь значение записанное GlobalVariableSet целиком в том виде в каком оно в последний раз записано.
А вот если использовать вашу _GlobalVariableGet то получается ай-яай :-) В двух потоках (советниках) запустился _GlobalVariableSet, а в третьем одновременно _GlobalVariableGet получит мусор, часть данных от одного, часть от другого. Затейливая такая ошибка, сложно имитируется в тестировании, но в реальной жизни проявится в самый неподходящий момент.
fxsaber, хм... Век живи, век учись - можно темплейты вот прямо так использовать, без угловых скобок ?
Я всегда использовал только так:
Print(_GlobalVariableGet<MqlTick>(Name).time);
Как вариант, таким образом можно записывать и считывать из глобальных переменных строки, простые структуры и даже массивы (например, обмениваться результатами CopyTicks)
Возможно, стоит причесать в виде библиотеки.
атомарность нарушается и можно наступить на крепкие грабли
Не владею терминологией. Поясните.
к примеру в внутри цикла
есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.
к примеру в внутри цикла
есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.
Для этого есть GlobalVariableSetOnCondition, а альтернативу ей было влом писать.
Честно говоря, никогда не использовал глобальные переменные. Поэтому даже не знаю, для чего они нужны.
к примеру в внутри цикла
есть шанс что массив (структура) будет одновременно изменяться от другой стороны (советника) и вы часть массива получите прежним, а оставшуюся новым. То есть в результате будет тыква.
Не владею терминологией. Поясните.
самый технически правильный способ - это к вашей библиотеки TypeToBytes (так кажется называется) привесить опциональный интерфейс к любой key-value базе. Да, это будет DLL, но зато это будет круто.
Тут терминологическое невежество снова не позволяет мне понять смысл сказанного.
Крутость не преследуется. Библиотеку используют < 1%. Еще бОльшие навороты будут использовать < 1% от этих использующих. Поэтому видится правильным, что должна быть просто база. И она есть. Уже этого оказалось достаточным, чтобы легко писать ранее сложные вещи. Код выше - из таких вещей.
Тут терминологическое невежество снова не позволяет мне понять смысл сказанного.
Крутость не преследуется. Библиотеку используют < 1%. Еще бОльшие навороты будут использовать < 1% от этих использующих. Поэтому видится правильным, что должна быть просто база. И она есть. Уже этого оказалось достаточным, чтобы легко писать ранее сложные вещи. Код выше - из таких вещей.
key-value база - минималистичная СУБД которая хранит произвольные данные по произвольным-же уникальным ключам и гарантирует атомарность чтения-записи.
Просто постановка вопроса - "а может стоит хранить строки?" намекает что стоит хранить вообще произвольные данные. Да и вместо ключей удобно использовать структуры. А это и есть key-value база. А ваша библиотека как раз и работает с произвольными данными (по крайней мере их конвертирует). То есть возможность внешнего хранения данных - логичное развитие.
PS/ ещё раз - код который выше несёт в себе ошибку. А то сейчас не подумавши начнут тягать к себе в проекты :-)PS/ ещё раз - код который выше несёт в себе ошибку. А то сейчас не подумавши начнут тягать к себе в проекты :-)
В чем ошибка _GlobalVariableSet, по сравнению со штатной GlobalVariableSet? Обе не обладают атомарным доступом.
Прошу показать в кодобазе библиотеку, обладающую атомарным доступом. Или в том же MQL, акромя упомянутой GlobalVariableSetOnCondition.
File-функции - нет, включая Memory Mapping. Где такой функционал?
В чем ошибка _GlobalVariableSet, по сравнению со штатной GlobalVariableSet? Обе не обладают атомарным доступом.
Прошу показать в кодобазе библиотеку, обладающую атомарным доступом. Или в том же MQL, акромя упомянутой GlobalVariableSetOnCondition.
File-функции - нет, включая Memory Mapping. Где такой функционал?
Как раз все стандартные GlobalVariableXXX атомарны. GlobalVariableGet гарантирует что ты получишь значение записанное GlobalVariableSet целиком в том виде в каком оно в последний раз записано.
А вот если использовать вашу _GlobalVariableGet то получается ай-яай :-) В двух потоках (советниках) запустился _GlobalVariableSet, а в третьем одновременно _GlobalVariableGet получит мусор, часть данных от одного, часть от другого. Затейливая такая ошибка, сложно имитируется в тестировании, но в реальной жизни проявится в самый неподходящий момент.