Isto não é nada de novo, é a forma como sempre funcionou desde o nascimento.
Apenas se os dados forem maiores do que __atómicos__ deve ser embalado/protegido com secções críticas (ou mutex para terminal std::thread)
Bem, eu não conhecia este comportamento, e esperava um processo separado aquando da importação. Pensei que os apontadores DLL globais seriam novos, em cada programa MT5 carregado. Com o que tive de suar para compreender a lógica, perguntando-me porque é que o erro vai aparecer na memória. Mas quando descobri a razão pelo método de tentativa (impressão), então todo o plano arquitectónico de trabalhar com DLL será construído de forma diferente. Meu, tens razão sobre os mutexes, não pensei nisso. Obrigado pela dica.
Isto seria perfeito se funcionasse. Entretanto, quando colado em um script .mq5 e executado infelizmente seu código lança o(s) seguinte(s) erro(s):
declarações de modelo não são permitidas nas classes locais ArraySortStruct.mq5 87 4
(depois de alterar ligeiramente seu código): declarações de modelo são permitidas apenas em âmbito global, namespace ou classe ArraySortStruct.mq5 90 4 )
Você poderia, por favor, consertar isso? Para você provavelmente é fácil, enquanto eu não saberia por onde começar :-)
Ao usar ArrayInsert, você pode economizar memória quando Array_Destination[] for menor do que Array_Source[] a partir do qual os elementos são adicionados.
Para fazer isso, você deve aplicar o ArraySwap duas vezes: antes e depois do ArrayInsert.
Por exemplo, isso é relevante ao trabalhar com grandes arquivos MqlTick, etc.
Houve um erro no método Partition. Versão corrigida.
Para um caso especial em que um campo numérico é usado para classificação (a situação mais comum), escrevi uma variante que é várias ordens de magnitude mais rápida do que a anterior. Mas ela consome o dobro de memória. Ela é relevante para matrizes grandes.
// Сортировка массива структур и указателей на объекты по ЧИСЛОВОМУ полю.#define ArraySortStruct2_Define(FIELD) \
namespace SortOnField_##FIELD \
{ \
class SORT2 \
{ \
private: \
template <typename T, typename T2> \
staticvoid Sort( T &Array[], const T2& ) \
{ \
T2 SortIndex[][2]; \
\
constint Size = ::ArrayResize(SortIndex, ::ArraySize(Array)); \
\
for (int i = Size - 1; i >= 0; i--) \
{ \
SortIndex[i][0] = (T2)Array[i].##FIELD; \
SortIndex[i][1] = (T2)i; \
} \
\
::ArraySort(SortIndex); \
\
T Sort_Array[]; \
\
for (int i = ::ArrayResize(Sort_Array, Size) - 1; i >= 0; i--) \
Sort_Array[i] = Array[(int)SortIndex[i][1]]; \
\
::ArraySwap(Sort_Array, Array); \
\
return; \
} \
\
public: \
template <typename T> \
staticvoid Sort( T &Array[] ) \
{ \
if (::ArraySize(Array)) \
SORT2::Sort(Array, Array[0].##FIELD); \
\
return; \
} \
}; \
}
#define ArraySortStruct2(ARRAY, FIELD) SortOnField_##FIELD::SORT2::Sort(ARRAY)
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Isto não é nada de novo, é a forma como sempre funcionou desde o nascimento.
Apenas se os dados forem maiores do que __atómicos__ deve ser embalado/protegido com secções críticas (ou mutex para terminal std::thread)
Bem, eu não conhecia este comportamento, e esperava um processo separado aquando da importação.
Pensei que os apontadores DLL globais seriam novos, em cada programa MT5 carregado.
Com o que tive de suar para compreender a lógica, perguntando-me porque é que o erro vai aparecer na memória.
Mas quando descobri a razão pelo método de tentativa (impressão), então todo o plano arquitectónico de trabalhar com DLL será construído de forma diferente.
Meu, tens razão sobre os mutexes, não pensei nisso. Obrigado pela dica.
Sim. Embora se o método não tiver parâmetros, pode fazê-lo:
Aplicação:
Com a execução parcial das ordens o campoORDER_TIME_SETUP_MSC muda.
Como conseqüência, o DEAL_TIME_MSC pode ser inferior ao ORDER_TIME_SETUP_MSC de seu pedido.
Que tal usar uma função de comparação personalizada?
Você está certo, obrigado! Eu exagerei em um ponto plano. Vou deixar sua variante para a triagem.
Aplicação.
ZZY É uma pena, por subcampo ou método, não funciona.
Aqui está o QuickSort otimizado de minha biblioteca, ligeiramente adaptado às suas exigências.
Ele pode classificar matrizes enormes sem transbordamento de pilha (devido à recursividade descontrolada).
Olá e obrigado por compartilhar!
Isto seria perfeito se funcionasse. Entretanto, quando colado em um script .mq5 e executado infelizmente seu código lança o(s) seguinte(s) erro(s):
Você poderia, por favor, consertar isso? Para você provavelmente é fácil, enquanto eu não saberia por onde começar :-)
Ao usar ArrayInsert, você pode economizar memória quando Array_Destination[] for menor do que Array_Source[] a partir do qual os elementos são adicionados.
Para fazer isso, você deve aplicar o ArraySwap duas vezes: antes e depois do ArrayInsert.
Por exemplo, isso é relevante ao trabalhar com grandes arquivos MqlTick, etc.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Peculiaridades da linguagem mql5, sutilezas e técnicas de trabalho
fxsaber, 2022.02.20 15:00
Você está certo, obrigado! Eu tenho overmudryl em um lugar reto. Deixarei sua variante para classificação.
Aplicativo.
Houve um erro no método Partition. Versão corrigida.
Houve um erro no método Partition. Versão corrigida.
Para um caso especial em que um campo numérico é usado para classificação (a situação mais comum), escrevi uma variante que é várias ordens de magnitude mais rápida do que a anterior. Mas ela consome o dobro de memória. Ela é relevante para matrizes grandes.
Aplicativo (com medição do tempo de execução).
Resultado.