rabanik: Boa tarde. Por favor, ajude-me a escrever o seguinte código, para um EA. Eu quero fazer através de uma matriz (se você tiver uma opção melhor, por favor, ajude-me). Em geral, a EA envia mensagens, mas eu quero que ela as envie através de uma matriz (temporária). Isto é, quando o início do envio da mensagem, o Expert Advisor verifica se a mensagem foi enviada mais cedo (verifica se a mensagem está armazenada na matriz), se não, ele envia a mensagem, se a mensagem é encontrada, então o envio é omitido. Espero que seja claro) Muito obrigado!
Você tem certeza sobre a declaração do problema?
Simplesmente, há opções:
- Não repita a última mensagem
- para ignorar o desatualizado (algum tempo de atraso é definido), ou seja, a mensagem deve ser repetida.
P.S. A primeira variante é um caso especial da segunda, mas é muito mais fácil de implementar. Sua definição do problema é também um caso especial da segunda variante com retardo infinito.
Se isso lhe interessa, aqui está a solução de seu problema.
Definimos duas matrizes: uma de texto, que armazena as mensagens, e uma de índice, para a busca de mensagens.
A matriz de índice é do tipo int. Na primeira dimensão, escrevemos o checksum da mensagem de texto. Na segunda - o número da linha da primeira matriz. Uma matriz de índices é classificada por primeira dimensão.
Recebemos uma nova mensagem. Leia seu checksum. Usando a função ArrayBsearch() encontre tal mensagem. Se não for encontrada, então a mensagem é original. Adicione-a à matriz de mensagens e, com referência à matriz de índice, lembrando-se de classificá-la.
Quais são as opções para o checksum? Eu levaria esta: levar em conta o número de caracteres e o checksum do texto. O checksum do texto, por exemplo, é a soma dos códigos de caracteres. Dadas as mudanças recentes, ele não pode exceder 65 536*256. Ou seja, o checksum da mensagem pode parecer como se segue:
o número de caracteres multiplicado por 10 milhões e adicionar o checksum do texto.
A ajuda diz que a linha criada pelo programa - o ângulo de ZERO está ok.
Eu corri o mesmo código novamente nas mesmas coordenadas sem tocar na linha - parece o número correto de graus, não zero. por quê, como posso fazer isso corretamente na primeira vez?
ou eu dei uma coordenada - peço ângulo - diz 0. depois dou outra - diz ângulo das coordenadas anteriores. besteira
K_i_r_i_t_o: Mudei este comentário para o início porque ninguém respondeu, mas eu realmente preciso dele =/ É possível implementar isto:se eu pressionar qualquer tecla, uma parte do código indicador é ligada (responsável por criar um objeto com um clique do mouse), então se um evento ocorre (a segunda parte do código, o evento pode ser, criando o mesmo objeto por exemplo), então a primeira parte do código é desativada (e se não fizer isto, o objeto é criado a cada clique), e também corre quando você pressiona a tecla, e assim por diante ao redor do círculo)
Você pode. Adicionar bloco OnChartEvent. Nele, acompanhe as prensas necessárias, as medidas e descreva a reação a elas de acordo com sua idéia.
SunnYtheDreamer: Você pode. Adicionar bloco OnChartEvent. Nele, acompanhe as prensas necessárias, as medidas e descreva a reação a elas, de acordo com sua idéia.
Para implementar a desativação de parte do código por um período de tempo antes de pressionar a tecla é impossível =/ Existe uma variante mais fácil, mas há um problema,ao pressionar a tecla eudevoretornar seu valor para o início da primeira se a declaração
#define VK_D 0x44voidOnChartEvent(constint id, // идентификатор события constlong& lparam, // параметр события типа long constdouble& dparam, // параметр события типа double conststring& sparam) // параметр события типа string
{
Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);
int y =(int)dparam;
datetime dt =0;
double price =0;
int window=0;
int i;
int x=(int)lparam;
if (id==CHARTEVENT_CLICK)
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
if(id==CHARTEVENT_KEYDOWN)
{ switch(int(lparam))
{ case VK_D:
i=rand();
}}}}
K_i_r_i_t_o: Não posso implementar a desativação de parte do código para o período anterior ao pressionamento da tecla =/ Existe uma maneira mais fácil, mas há um problema:euprecisoretornar seu valor ao início da primeira se declaração quando a tecla é pressionada.
if (id==CHARTEVENT_CLICK)
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
if(id==CHARTEVENT_KEYDOWN)
{
switch(int(lparam))
{
case VK_D: i=rand();
}
}
}
Este código será executado somente se o mouse for clicado. Neste caso, após 3 linhas de código, o evento de pressionar a tecla é verificado. E estas 3 linhas de código são executadas em alguns milissegundos, e mesmo que a identificação durante a chamada atual OnChartEvent seja capaz de mudar, a chance de que durante a execução de 3 linhas de código, a tecla seja pressionada = 0%. Obviamente, é inútil verificar a id, dentro de um bloco que é acionado a um determinado valor de id, e esperar lá por um valor diferente. Primeiro, verifique a tecla de pressão, em um bloco separado, salve em uma variável o número da tecla ou apenas o fato de pressionar a tecla desejada. E com esta variável, ative ou desative o pedaço de código localizado no bloco para clique do mouse.
char key = -1; //эта переменная должна быть объявлена за пределами блока OnCharEvent
if(id==CHARTEVENT_KEYDOWN)
key = lparam;
if (id==CHARTEVENT_CLICK && key == 'D')
{
ChartXYToTimePrice(0,x,y,window,dt,price);
ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
i=rand();
key = -1;
}
SunnYtheDreamer: Este código só será executado se o mouse for clicado, com 3 linhas de verificação de código para um evento de toque de tecla. E estas 3 linhas de código são executadas em alguns milissegundos, e mesmo que o id durante a chamada atual OnChartEvent seja capaz de mudar, a chance de que durante o tempo, execução de 3 linhas de código, a tecla será pressionada = 0%. Obviamente, é inútil verificar a id, dentro de um bloco que é acionado a um determinado valor de id, e esperar lá por um valor diferente. Primeiro, verifique a tecla de pressão, em um bloco separado, salve em uma variável o número da tecla ou apenas o fato de pressionar a tecla desejada. E com esta variável, ative ou desative o pedaço de código localizado no bloco para clique do mouse.
Muito obrigado!) Esta é a linha que eu estava procurando se (id===CHARTEVENT_CLICK && key == 'D'), não conseguisse conectar dois eventos, isto não funcionava se (id===CHARTEVENT_CLICK & id===CHARTEVENT_KEYDOWN), não conseguisse conectar dois eventos, isto não funcionava se (id===CHARTEVENT_CLICK & id===CHARTEVENT_KEYDOWN), muito obrigado mais uma vez)
Olá, tenho uma função que calcula o tamanho médio de uma vela a partir das últimas n velas. às vezes ela emite os seguintes valores: "5e-05.0". não preciso delas, para minha vergonha não sei quanto elas são e como cortá-las. NormalizeDouble() não ajuda. por favor me diga como calcular tais números de forma programática para cortá-los
Olá, tenho uma função que calcula o tamanho médio de uma vela a partir das últimas n velas. às vezes ela emite os seguintes valores: "5e-05.0". não preciso delas, para minha vergonha não sei quanto elas são e como cortá-las. NormalizeDouble() não ajuda. por favor me diga como calcular tais números de forma programática para cortá-los
5e-05 (5*10 a -5ª potência) = 0,00005. O que cortar, então:
if(val >= 0.00001)
Velas tão pequenas, 5 pips, somente em baixa latitude, em uma conta de 5 dígitos, em prazos baixos podem ocorrer. Se você não lida com o escalpe, mas a média às vezes é tão pequena para n velas, então a implementação da função deve ser desconfiada.
Boa tarde. Por favor, ajude-me a escrever o seguinte código, para um EA. Eu quero fazer através de uma matriz (se você tiver uma opção melhor, por favor, ajude-me). Em geral, a EA envia mensagens, mas eu quero que ela as envie através de uma matriz (temporária). Isto é, quando o início do envio da mensagem, o Expert Advisor verifica se a mensagem foi enviada mais cedo (verifica se a mensagem está armazenada na matriz), se não, ele envia a mensagem, se a mensagem é encontrada, então o envio é omitido. Espero que seja claro) Muito obrigado!
Você tem certeza sobre a declaração do problema?
Simplesmente, há opções:
- Não repita a última mensagem
- para ignorar o desatualizado (algum tempo de atraso é definido), ou seja, a mensagem deve ser repetida.
P.S. A primeira variante é um caso especial da segunda, mas é muito mais fácil de implementar. Sua definição do problema é também um caso especial da segunda variante com retardo infinito.
Se isso lhe interessa, aqui está a solução de seu problema.
Definimos duas matrizes: uma de texto, que armazena as mensagens, e uma de índice, para a busca de mensagens.
A matriz de índice é do tipo int. Na primeira dimensão, escrevemos o checksum da mensagem de texto. Na segunda - o número da linha da primeira matriz. Uma matriz de índices é classificada por primeira dimensão.
Recebemos uma nova mensagem. Leia seu checksum. Usando a função ArrayBsearch() encontre tal mensagem. Se não for encontrada, então a mensagem é original. Adicione-a à matriz de mensagens e, com referência à matriz de índice, lembrando-se de classificá-la.
Quais são as opções para o checksum? Eu levaria esta: levar em conta o número de caracteres e o checksum do texto. O checksum do texto, por exemplo, é a soma dos códigos de caracteres. Dadas as mudanças recentes, ele não pode exceder 65 536*256. Ou seja, o checksum da mensagem pode parecer como se segue:
o número de caracteres multiplicado por 10 milhões e adicionar o checksum do texto.
pro! há um problema com a linha no ângulo.
Eu construí umTRENDBYANGLE usando coordenadas.
- Eu preciso de um ângulo.
A ajuda diz que a linha criada pelo programa - o ângulo de ZERO está ok.
Eu corri o mesmo código novamente nas mesmas coordenadas sem tocar na linha - parece o número correto de graus, não zero. por quê, como posso fazer isso corretamente na primeira vez?
ou eu dei uma coordenada - peço ângulo - diz 0. depois dou outra - diz ângulo das coordenadas anteriores. besteira
Mudei este comentário para o início porque ninguém respondeu, mas eu realmente preciso dele =/
É possível implementar isto:se eu pressionar qualquer tecla, uma parte do código indicador é ligada (responsável por criar um objeto com um clique do mouse), então se um evento ocorre (a segunda parte do código, o evento pode ser, criando o mesmo objeto por exemplo), então a primeira parte do código é desativada (e se não fizer isto, o objeto é criado a cada clique), e também corre quando você pressiona a tecla, e assim por diante ao redor do círculo)
Você pode. Adicionar bloco OnChartEvent. Nele, acompanhe as prensas necessárias, as medidas e descreva a reação a elas, de acordo com sua idéia.
Não posso implementar a desativação de parte do código para o período anterior ao pressionamento da tecla =/ Existe uma maneira mais fácil, mas há um problema:eu precisoretornar seu valor ao início da primeira se declaração quando a tecla é pressionada.
Este código só será executado se o mouse for clicado, com 3 linhas de verificação de código para um evento de toque de tecla. E estas 3 linhas de código são executadas em alguns milissegundos, e mesmo que o id durante a chamada atual OnChartEvent seja capaz de mudar, a chance de que durante o tempo, execução de 3 linhas de código, a tecla será pressionada = 0%. Obviamente, é inútil verificar a id, dentro de um bloco que é acionado a um determinado valor de id, e esperar lá por um valor diferente. Primeiro, verifique a tecla de pressão, em um bloco separado, salve em uma variável o número da tecla ou apenas o fato de pressionar a tecla desejada. E com esta variável, ative ou desative o pedaço de código localizado no bloco para clique do mouse.
Muito obrigado!) Esta é a linha que eu estava procurando se (id===CHARTEVENT_CLICK && key == 'D'), não conseguisse conectar dois eventos, isto não funcionava se (id===CHARTEVENT_CLICK & id===CHARTEVENT_KEYDOWN), não conseguisse conectar dois eventos, isto não funcionava se (id===CHARTEVENT_CLICK & id===CHARTEVENT_KEYDOWN), muito obrigado mais uma vez)
Olá, tenho uma função que calcula o tamanho médio de uma vela a partir das últimas n velas. às vezes ela emite os seguintes valores: "5e-05.0". não preciso delas, para minha vergonha não sei quanto elas são e como cortá-las. NormalizeDouble() não ajuda. por favor me diga como calcular tais números de forma programática para cortá-los
Olá, tenho uma função que calcula o tamanho médio de uma vela a partir das últimas n velas. às vezes ela emite os seguintes valores: "5e-05.0". não preciso delas, para minha vergonha não sei quanto elas são e como cortá-las. NormalizeDouble() não ajuda. por favor me diga como calcular tais números de forma programática para cortá-los
O que cortar, então:
Velas tão pequenas, 5 pips, somente em baixa latitude, em uma conta de 5 dígitos, em prazos baixos podem ocorrer. Se você não lida com o escalpe, mas a média às vezes é tão pequena para n velas, então a implementação da função deve ser desconfiada.