Algoritmos, métodos de solução, comparação de seu desempenho

 

Nesta linha, discutiremos diferentes maneiras de resolver estes ou aqueles problemas e compararemos o desempenho das soluções propostas.

Todos são bem-vindos para discutir problemas e métodos para resolvê-los ;)

 

Proponho a solução de um problema:

  1. Escreva uma função que em cada chamada aceite e escreva um número pseudo-aleatório, que será um"honeyjack" condicional.

2. Escreva uma segunda função que chame a primeira função de um número pseudo-aleatória de vezes e a passe o "medjic" condicional (gerado).

3. escrever uma terceira função que retornará o número"medjic" pelo número"transação" (qualquer número ordinal) passado pelo usuário.


Exigências:

  1. O consumo de memória para escrever "medjic" deve ser o mais próximo possível do número de "medjic", cujo número é desconhecido antecipadamente.
  2. As funções devem funcionar rapidamente.

//--------------------------------------------------------

Acho que a biblioteca em discussão tem as ferramentas para resolver este problema.


ZS. Todas as três funções simulam o trabalho com ordens da EA, cujo número não é conhecido antecipadamente. Portanto, a tarefa se enquadra em nosso tema.

 
Реter Konow:

Proponho a solução de um problema:

  1. Escreva uma função que em cada chamada aceite e escreva um número pseudo-aleatória, que será um"medjic" condicional.

2. Escreva uma segunda função que chame a primeira função de um número pseudo-aleatória de vezes e a passe de um "medjic" condicional (gerado).

3. para escrever a terceira função, que retornará o número de"medjik" pelo número de"deal" (qualquer número de série), que é transferido pelo usuário.

Exigências:

  1. O consumo de memória para escrever os "medgies" deve ser o mais próximo possível do número de "medgies", cujo número não é conhecido antecipadamente.
  2. As funções têm que funcionar rapidamente.

Acho que a biblioteca em questão tem as ferramentas para resolver este problema.

SZY. Todas as três funções imitam o trabalho com ordens de Expert Advisor, cujo número não é conhecido antecipadamente. Portanto, o problema se enquadra em nosso tema.

Piotr, acredito que qualquer função deve ter algum benefício. Eu não entendo bem o bem que sai de qualquer uma das três funções ?

 
Victor Ziborov:

Peter, acho que cada função deve ter algum benefício. Não estou bem certo do efeito positivo que qualquer uma destas três funções tem ?

Este é um lançamento de https://www.mql5.com/ru/forum/221917

Aqui estamos testando a eficácia das soluções propostas pela biblioteca na prática.

Nessa linha, foi sugerido que a solução de escrever ordens de medjic a um fio e depois colocá-las em uma matriz era ineficiente.

A nova biblioteca genérica também tem uma solução para este problema.

Interessante confirmar ou refutar a afirmação de que escrever para uma corda é uma solução ineficaz.

Penso que será útil e interessante ver o que a prática mostrará.


Todos que quiserem, podem tentar resolver esta tarefa com a ajuda do kit de ferramentas da biblioteca.

Vou tentar resolver esta tarefa à minha própria maneira.

Em seguida, compararemos o desempenho.

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.07
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 

Reg Konow, se você estiver organizando algo, por favor, faça-o em um nível decente, não espontaneamente e de.....stand.

Os termos devem ser claros, inequívocos e com exemplos concretos....
Aqui está uma lista de perguntas que surgiram de uma leitura atenta de todo o primeiro parágrafo.

  1. Написать функцию, которая на каждом обращении будет принимать и записывать некоторое псевдо-случайное число, которое будет условным "меджиком".

1) Por que negrito o texto que não é significativo?
2) Levar um ponteiro é uma "chamada" para uma função ou ainda não? A função é chamada.
3) O termo "escrever um número" é normalmente usado quando se trabalha com arquivos. É uma imprecisão e refere-se ao trabalho com dados em memória, ou ainda requer salvar dados entre as execuções do programa?
4) Se você quiser, um número pseudo-aleatória pode ser negativo, mas magia não é. Então o que temos: magia ou pseudo-aleatória dentro de uma certa faixa? Qual deles?

 
Sergey Dzyublik:

Reg Konow, se você estiver organizando algo, por favor, faça-o em um nível decente, não espontaneamente e de.....stand.

Os termos devem ser claros, inequívocos e com exemplos concretos....
Aqui está uma lista de perguntas que surgiram de uma leitura atenta de todo o primeiro parágrafo.

1) Por que negrito o texto que não é significativo?
2) Levar um ponteiro é uma "chamada" para uma função ou ainda não? A função é chamada.
3) O termo "escrever um número" é normalmente usado quando se trabalha com arquivos. É uma imprecisão e refere-se ao trabalho com dados em memória, ou ainda requer salvar dados entre as execuções do programa?
4) Se você quiser, um número pseudo-aleatória pode ser negativo, mas magia não é. Então o que temos: magia ou pseudo-aleatória dentro de uma certa faixa? Qual deles?

Tarefa principal:

Para implementar acesso rápido a um mágico específico através de um número de transação.

É necessário escrever mágicos em um "dicionário" e acessá-los através do número da transação.

O número de pedidos não é conhecido antecipadamente, portanto o tamanho do dicionário é desconhecido.

Entretanto, o acesso tem que ser rápido e a quantidade de memória alocada tem que ser aceitável.

A tarefa que eu sugiro é imitar o trabalho de um EA que faz pedidos e depois recebe seus magos pelo número do comércio para continuar trabalhando com eles.

Você pode resolver o problema da maneira que quiser.

Um número específico de um mágico não importa. Pode ser qualquer número. É apenas uma simulação.


Adicionado:

Corrigido acima"Implementar acesso rápido a uma magia específica via número de transação ". " .

 

Se acrescentarmos três números mágicos: 10, 11, 12
Então, quais são os números de suas transações? 0, 1, 2?

 
Sergey Dzyublik:

Se acrescentarmos três números mágicos: 10, 11, 12
Então, quais são os números de suas transações? 0, 1, 2?

Em outro tópico, as pessoas com conhecimento disseram que é impossível fazer uma solução eficaz para escrever mágicos a uma corda e obtê-los rapidamente "na mosca" a partir da corda.

Entretanto, na minha opinião, se o número de mandatos futuros for desconhecido, então a única boa solução é escrever mágicos para a corda.

Eu argumentei que não haveria perda de velocidade.

Aqui está uma prova prática:

//+------------------------------------------------------------------+
//|                                                        Magic.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
string All_magics;
int    order_number;
int    Random_orders_of_strategy;
//+------------------------------------------------------------------+
void Save_magic(int magic)
{
 order_number++;
 //---------------------------------
 //Записываем каждый магик вместе с порядковым номером ордера.
 //---------------------------------
 All_magics +=  "_" + (string)order_number + "_" + (string)magic;
 //---------------------------------
}
//+------------------------------------------------------------------+
void Trading()
{
 Random_orders_of_strategy = MathRand();
 
 //----------------------------------------
 //Имитируем открытие неопределенного количества ордеров стратегии.
 //----------------------------------------
 for(int a1 =  0; a1 < Random_orders_of_strategy; a1++)
   {
    int this_magic = MathRand();
    //----------------------------
    Save_magic(this_magic);
    //----------------------------
   }
 //----------------------------------------
}
//+------------------------------------------------------------------+
int Get_magic(int deal_number)
{
 //--------------------------------------------
 //Получаем начало строки магика.
 //--------------------------------------------
 int Magic_position_start =  StringFind(All_magics,"_" + (string)deal_number + "_",0) + 3;
 //--------------------------------------------
 //Получаем конец строки магика.
 //--------------------------------------------
 int Magic_position_end   =  StringFind(All_magics,"_" + (string)(deal_number + 1) + "_",0);
 //--------------------------------------------
 //Получаем количество цифр из которых состоит магик.
 //--------------------------------------------
 int Magic_lenght         =  Magic_position_end - Magic_position_start;
 //--------------------------------------------
 //Извлекаем магик из общей строки.
 //--------------------------------------------
 string Magic             =  StringSubstr(All_magics,Magic_position_start,Magic_lenght);
 //--------------------------------------------
 //Возвращаем цифровое значение магика.
 //--------------------------------------------
 return((int)Magic);
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Trading();
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   Get_magic(1);
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время исполнения функции Get_magic() при количестве ордеров ",Random_orders_of_strategy," равно ",t2 - t1);
   //--------------------------
   Print("Random_orders_of_strategy  ",Random_orders_of_strategy);
   Print("magic 1:  ",Get_magic(1),"  magic 2: ",Get_magic(2),"  magic 3: ",Get_magic(3));
   
  }
//+------------------------------------------------------------------+


Talvez alguém ache útil minha solução...

(o código encontra a magia certa em mais de 24.000 pedidos mágicos em 15 microssegundos!)

(Além disso, não se desperdiça um byte de memória extra).

Se alguém puder fazer isso mais rápido, por favor.
 
Sergey Dzyublik:

Se acrescentarmos três números mágicos: 10, 11, 12
Então, quais são os números de suas transações? 0, 1, 2?

Não. Os números das transações devem começar com um.
 

Esta é uma pergunta interessante sobre o assunto:

Por exemplo, existe uma EA com várias moedas na qual o próximo lote do próximo pedido é baseado em resultados de pedidos já abertos em diferentes pares


condição de abertura de uma ordem - se houver um sinal para abri-la, o lote total não excede 0,1 e o saque total não é superior a 101% do depósito

Opção um: preencher todos os dados na matriz e recuperá-los quando o próximo pedido for solicitado (não devemos abrir novos pedidos a cada tick)


opção dois - cada vez que emitimos um pedido para abrir o próximo pedido, devemos verificar todos os dados disponíveis no momento atual para todos os pares



Qual solução será mais rápida e menos dispendiosa?

 

Quebra-cabeças )