[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 656

 
artmedia70:
O que pode causar o transbordamento da pilha? Quando você abre uma posição com grande take (o take é calculado a partir da volatilidade e multiplicado por 100, o tamanho é 41*100), então um transbordo de pilha é escrito no registro e... ... basta pegá-lo. Nenhuma outra posição é aberta até que esta feche, e esta, é claro, não fechará por causa do enorme TP... E a EA não funciona corretamente, pois deve fechar todas as posições quando o lucro total pré-definido das posições abertas for alcançado... Mas isso não acontece, ainda que esta posição tenha tido lucros enormes por muito tempo, cerca de dois mil pontos... Como posso lutar contra isso? Não é possível garantir a situação quando todas as posições abertas transbordam a pilha e tudo vai de cabeça para baixo...


a pilha não pode transbordar apenas com um número que esteja fora da faixa de tipo - haverá outro erro

dados passados para uma função ou uma chamada recursiva para uma função sem desistir podem transbordar a pilha.

start() também é uma função - talvez você tenha muitas variáveis lá.

a pilha é uma região de memória onde valores intermediários (variáveis locais) de uma função são armazenados; você mesmo pode estar quebrando a pilha se estiver usando matrizes dinâmicas e não tiver verificado corretamente o escopo da matriz, ou seja, você está escrevendo dados não em uma matriz, mas em uma região de memória que vem logo após a matriz

tentar mover algumas das matrizes para variáveis globais - colocá-las na parte superior do quadro

ZS: pelo menos é o mesmo em todas as linguagens de programação - eu acho que é o mesmo em mql

 
IgorM:


a pilha não pode transbordar apenas com um número que está fora da faixa de tipo - haverá outro erro

dados passados para uma função ou uma chamada recursiva para uma função sem desistir podem transbordar a pilha.

start() também é uma função - talvez você tenha muitas variáveis lá.

a pilha é uma região de memória onde valores intermediários (variáveis locais) de uma função são armazenados; você mesmo pode estar quebrando a pilha se estiver usando arrays dinâmicos e não tiver verificado corretamente o escopo da matriz, ou seja, você está escrevendo dados não em uma matriz, mas em uma região de memória que vem logo após a matriz

tentar mover algumas das matrizes para variáveis globais - colocá-las na parte superior do quadro

ZS: pelo menos é o mesmo em todas as linguagens de programação - eu acho que é o mesmo em mql

Igor, você sabe que evitei até agora o uso de matrizes... Tenho apenas alguns conjuntos em meu código - um conjunto de ordens antes do tick e um conjunto de ordens após o tick. Tenho-os definidos na área variável global. O engraçado é que eu movi o código para abrir essas posições em outro lugar na EA e o erro desapareceu. Parece que houve uma chamada recorrente para abrir pedidos, embora eu realmente não me tenha incomodado com isso. Decidi simplesmente que não seria apropriado colocar a abertura imediatamente após o fechamento de todas as posições no código para verificar se o lucro total foi alcançado e todas as posições foram fechadas... Eu fiz uma bagunça... :)
 
artmedia70:
Igor, você sabe que evitei até agora o uso de matrizes... Tenho apenas alguns conjuntos em meu código - um conjunto de ordens antes do tick e um conjunto de ordens após o tick. Tenho-os definidos na área variável global. O engraçado é que eu movi o código para abrir essas posições em outro lugar na EA e o erro desapareceu. Parece que houve uma chamada recorrente para abrir pedidos, embora eu realmente não me tenha incomodado com isso. Decidi simplesmente que não seria apropriado colocar a abertura imediatamente após o fechamento de todas as posições no código para verificar se o lucro total foi alcançado e todas as posições foram fechadas... Eu fiz uma bagunça... :)

Eu fiz um modelo para criar um EA - quando um pedido é feito, a bandeira de tal pedido é imediatamente colocada e depois, antes de abrir um novo pedido desse tipo, eu sempre verifico a bandeira - se o pedido existe, mas eu estou escrevendo EAs com apenas um pedido
 
IgorM:

Fiz há muito tempo um modelo para criar uma EA - quando faço um pedido, imediatamente coloco um sinal (bandeira) de que tal pedido existe e, antes de abrir um novo pedido desse tipo, sempre verifico a bandeira - se tal pedido existe, mas escrevo EAs com apenas um pedido
Bem, eu, e penso que todos os outros, temos seus próprios desenvolvimentos, modelos e outras coisas boas. Este não é o ponto. Ainda estou me debatendo com drawdowns e tentando diferentes métodos, funções e afins. Se eu trabalhar estritamente com a tendência, não consigo entender como pegar a exaustão da tendência se em um, o mais velho TF a tendência já se transformou em um flat, enquanto no mais jovem ela ainda está lá, mas está chegando ao fim. Ao abrir uma posição em uma de baixa ordem, a probabilidade é alta de causar um drawdown e não ser fechada a tempo. Agora estou tentando trabalhar com gráficos de 4 horas a partir do gráfico de 4 horas, onde definimos a direção e trabalhamos somente nessa direção em todos os pontos baixos. O momento de transição da tendência para o plano I, mais ou menos identificado, vamos olhar para os resultados.
 
Craft:


Sim, recebi "0", mas o que devo fazer? Não posso fazer as duas coisas (tentei até períodos iguais), tentei as duas Imprimir ("NormalizeDouble(c1b_1..."), mas recebi zeros (apenas c1b[i] mostra o valor, todos os outros incluindo c1s[i] são zeros), pode me ajudar a trazer um deles para uma condição de trabalho ou compartilhar uma dica, se você notar algum defeito?

Novo:

Antigo:

Inteiro:


Yuri, no futuro, se o código for repetido pelo menos duas vezes, ele deverá ser alocado a um método, e você não precisará de pilhas de arrays desordenando o código.
Aqui está um método para você:

//+------------------------------------------------------------------+
double iCCIAverage(string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
   double array[];
   int loop_array;
   ArrayResize(array,ma_period + ma_shift);
   for(int loop = ma_period + ma_shift - 1; loop >= 0; loop--, loop_array++)array[loop_array] = iCCI(cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
   return(iMAOnArray(array, 0, ma_period, 0, ma_method, ma_shift));
}
//+------------------------------------------------------------------+

Acho que tudo está claro com parâmetros, insira dados e, variando o parâmetro ma_shift, obtenha o turno necessário. Note que este método pode ser usado como modelo, basta alterar os métodos de acesso aos indicadores i...(...) ou iCustom(...). Agora seu bloco de decisões comerciais parece como deveria ser:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 1),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 3),4))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 1),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 3),4))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

Assim, não há necessidade agora de variantes "antigas" e "novas", as negociações são abertas de acordo com determinados critérios (tanto quanto eu entendi, você tem um padrão de três barras de iCC alisado). Há uma variante corrigida no arquivo.

Arquivos anexados:
21_2.mq4  14 kb
 

Olá.

Pode me dar o código para escrever os preços desde que o pedido foi aberto na matriz.

Como fazer cada novo preço a ser adicionado à matriz.

 
zelek:

Olá.

Pode me dar o código para escrever os preços desde que o pedido foi aberto na matriz.

Como fazer cada novo preço a ser adicionado à matriz.


Por favor, seja mais específico em sua pergunta

Se você estiver interessado no preço atual no momento de fazer o pedido, você pode adicionar uma chamada ao código que será responsável por armazenar o preço atual na matriz global com a mudança do contador de índice da matriz, que você pode ver mais tarde a partir de qualquer ponto do código.

 

como verificar o desempenho de um EA - gostaria apenas de exibir o tempo de execução do código em milissegundos

o quanto melhor é o desempenho do MT5 vs MT4

 
IgorM:

como verificar o desempenho de um EA - gostaria apenas de exibir o tempo de execução do código em milissegundos

o quanto melhor é o desempenho do MT5 vs MT4


GetTickCount ajudaria https://docs.mql4.com/ru/common/GetTickCount
 
DDFedor:

GetTickCount vai ajudar https://docs.mql4.com/ru/common/GetTickCount


obrigado sim é o que eu estava procurando, alguém mediu a velocidade do mesmo tipo de código para mt4 e mt5 ?