[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 309

 
artmedia70:

Isso mesmo: é boa educação arrumar seu próprio lixo...

Mas neste contexto, como saber se o "lixo" precisa ser limpo agora ou vice-versa: não é lixo - são os dados necessários para os cálculos posteriores.

Como eu entendo, deinit() deve ser usado para limpar o lixo, mas... é executado não apenas quando o gráfico de um instrumento comercial é excluído, quando o Expert Advisor é removido do mesmo, mas também quando a TF é alterada. Neste caso, todos os dados acumulados para a TF serão perdidos e o Consultor Especialista começará a trabalhar novamente com uma matriz nula quando retornar ao cronograma anterior. O mesmo acontecerá se alterarmos qualquer um dos parâmetros do Expert Advisor.

Acontece que em algumas situações a "coleta de lixo" é um processo lógico complexo, não uma simples mudança do tamanho da matriz.


Bem, não é difícil. No loop, inicializar a matriz com valores. Então trabalhamos com a matriz resultante. Quando o trabalho é feito, fazemos com que seja zero em comprimento. Em caso de dúvida, você pode fazer isso no final do código imediatamente antes do retorno(0).
 

Sugira o código abaixo para ler o arquivo de log. Lê automaticamente o arquivo de registro atual por data e o envia para a impressora.

Onde:

while (result>0) {

O arquivo está sendo montado a partir de peças. Mas eu não preciso do arquivo completo, apenas da última linha. Ajude a corrigir, por favor.

void ReadWrite() {
   string tekTime=TimeStr1(CurTime(),1);
   string path=TerminalPath()+"\\logs\\"+tekTime+".log";
   string title="Чтение из файла";
   string msg;
   int result;
   int handle=_lopen(path,4);
   if (handle<0) {
      msg="Ошибка открытия файла";
      //MessageBox(msg,title,MB_OK|MB_ICONERROR);
      Print(msg);
      return;
   }
   result=_llseek (handle,0,0);
   string buffer="";
   //string char="x                      ";
   string char="x                                                                                                                                                                                                                                                         ";
   int count=0;
   result=_lread (handle,char,250);
   while (result>0) {
      buffer=buffer+char;
      char="x                                                                                                                                                                                                                                                         ";
      count++;
      result=_lread (handle,char,250);
   }
   result=_lclose (handle);
   msg=StringTrimRight(buffer);
   //MessageBox(msg,title,MB_OK|MB_ICONINFORMATION);
   Print(msg);
}

//------------------расчет времени----------------
string TimeStr1(int taim,int tip)
{
   string sTaim;
   string sTaim1,sTaim2,sTaim3;
   if (tip==1) 
   {
      int GD=TimeYear(taim);                  
      int MN=TimeMonth(taim);                  
      int DD=TimeDay(taim);  
      
      sTaim1 = DoubleToStr(GD,0);
      if (MN<10) sTaim2 = StringConcatenate(sTaim2,"0"+DoubleToStr(MN,0));
      else sTaim2 = StringConcatenate(sTaim2,DoubleToStr(MN,0));
      if (DD<10) sTaim3 = StringConcatenate("0",DoubleToStr(DD,0));
      else sTaim3 = DoubleToStr(DD,0);
      sTaim=sTaim1+sTaim2+sTaim3;
   }
   return(sTaim);
}
 
drknn:

Bem, não é difícil. No laço, a matriz é inicializada com valores. Depois trabalhamos com a matriz resultante. Quando o trabalho termina, fazemos dele uma matriz de comprimento zero. Em caso de dúvida, você pode fazê-lo no final do código imediatamente antes do retorno(0).

Fui mal compreendido.

No contexto da conversa (se eu entendi corretamente a premissa desta conversa), o laço é o trabalho da própria EA. Afinal de contas, cada vez que um tique vem, a matriz ou aumenta ou permanece a mesma, dependendo se um novo valor precisa ser escrito para ela.

Como podemos saber que o trabalho está terminado, e não apenas, por exemplo, que uma pessoa mudou o prazo? Mesmo por acidente... Neste caso, o deinit() será chamado e todos os dados serão perdidos. O Expert Advisor começará a armazená-los (escrever em uma matriz dinâmica) de novo, com base nos valores obtidos no novo cronograma(um novo ciclo).

Estou falando sério.

 
artmedia70:

Eu não fui compreendido.

No contexto de nossa discussão (se entendi corretamente a premissa desta discussão), o ciclo é o trabalho do próprio Expert Advisor. Afinal de contas, cada vez que um tick chega, a matriz ou é aumentada ou permanece inalterada, dependendo se um novo valor precisa ser escrito para ela.

Como você pode saber se um trabalho está terminado e não apenas uma pessoa mudando os prazos, por exemplo? Mesmo por acidente... Neste caso, o deinit() será chamado e todos os dados serão perdidos. O Expert Advisor começará a acumulá-los (escreva-os em uma matriz dinâmica) novamente, com base nos valores obtidos no novo cronograma(um novo ciclo).

Meu ponto é o seguinte.

Se você entrar em detalhes, você pode usar esta função. Ele lhe dirá qual é a razão para a desinicialização.
 

Notei uma característica específica do terminal. Como o cálculo do lucro do pedido não considera a OrderSwap(), eu quero que ela feche o pedido de uma vez.


Isso significa que devemos usar esta fórmula para fechar o pedido com lucro:

(OrderProfit()+OrderSwap()+OrderComission())>0

Nunca trabalhei com comissão e a comissão não é usada em demonstração, por isso não posso verificar por conta disso.

Meus cálculos estão corretos?

 
Zhunko:
Se você entrar em detalhes, você pode usar esta função. Ele lhe dirá o motivo da desinicialização.

Muito bem... :)

Esqueci-me disso. Agora, com meu hábito de usar "infalível", vamos usá-lo...

 
artmedia70:

ObjectGetValueByShift() para ajudar você

E como você vai trabalhar com ele - só você sabe...


Obrigado, gentil homem!
 
Duas perguntas.

1. Como escrever/entrar a primeira variável e as variáveis subseqüentes duplo abc[10] na matriz duplo ab=a*b?
2. Como escrever a décima primeira variável em uma matriz, removendo a primeira?

A ordem na qual as variáveis são escritas na matriz (para frente ou para trás) não importa. As variáveis da matriz são necessárias para determinar a média aritmética.
 
Posso mudar o tamanho do lote de um pedido pendente?
 
Parn25:
Posso mudar o tamanho do lote de um pedido pendente?


Não, você não pode.

tudo o que você pode mudar é explicado aqui https://docs.mql4.com/ru/trading/OrderModify