Erros, bugs, perguntas - página 567

 
Então o CTrade trabalhou... É apenas um ficheiro necessário para refazer tudo... Um submarino de helicóptero outra vez... Já te disse que não sei como, não é uma chatice... :)
 

Sim...é tudo o mesmo em princípio...

 

A nova construção deixou de copiar estruturas simples no laço. Aqui está um guião de teste:

//+------------------------------------------------------------------+
//|                                             Test_Copy_Struct.mq5 |
//+------------------------------------------------------------------+
struct  trade_settings
  {
   int      reopened;
   int      reverse; 
   int      TrailingStop;
   int      WithoutlossLevel;
   int      WithoutlossProfit;
   double   LossToReverse;
   int      MAPeriod;
   int      MA_use;
   double   Lots;
   int      takeprofit; 
  };
trade_settings arr_tr_set_ini[3]={  
 {60,90,1000,100,900,2000.0,105,1,0.13,2700},   // EURUSD
 {130,1298,400,300,600,1000.0,130,1,0.1,2800},  // GBPUSD
 {110,140,200,600,800,1000.0,85,0,0.15,1700}};   // AUDUSD 
trade_settings symb_default={110,130,200,1300,1500,3000.0,100,1,0.1,1000};

class CTest_Copy_Struct
  {  
protected:
   trade_settings    m_tr_set;
public:
   void              Copy_tr_set(const trade_settings& tr_set){m_tr_set=tr_set;}
   void              Print_tr_set(){printf("Setting reopened=%u overpos=%u TrailingStop=%u WithoutlossLevel=%u WithoutlossProfit=%u" 
                        ,m_tr_set.reopened,m_tr_set.reverse,m_tr_set.TrailingStop,m_tr_set.WithoutlossLevel,m_tr_set.WithoutlossProfit);
                        printf("LossToReverse=%.2f MAPeriod=%u MA_use=%u Lots=%.2f takeprofit=%u"
                        ,m_tr_set.LossToReverse,m_tr_set.MAPeriod,m_tr_set.MA_use,m_tr_set.Lots,m_tr_set.takeprofit);}
   void              Zero(){ZeroMemory(m_tr_set);} 
  };

void OnStart()
  {
   CTest_Copy_Struct Test; 
   Test.Zero();
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[0]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[2]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(symb_default);
   Test.Print_tr_set();
   int total=ArraySize(arr_tr_set_ini);
   for(int i=0;i<3;i++)
     {
      Print("i=",i);
      Test.Copy_tr_set(arr_tr_set_ini[i]);
      Test.Print_tr_set();
     } 
  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Valmars:

Resultado:

2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Violação de acesso lido para 0x00000000209FFFAC em 'E:\Program Files\Championship_2011\MQL5\Scripts\Test_Copy_Struct.ex5'.
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) i=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=3000.00 MAPeriod=100 MA_use=1 Lots=0.10 takeprofit=1000
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=110 overpos=130 TrailingStop=200 WithoutlossLevel=1300 WithoutlossProfit=1500
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=1000.00 MAPeriod=85 MA_use=0 Lots=0.15 takeprofit=1700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD, M15) Setting reopened=110 overpos=140 TrailingStop=200 WithoutlossLevel=600 WithoutlossProfit=800
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=2000.00 MAPeriod=105 MA_use=1 Lots=0.13 takeprofit=2700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=60 overpos=90 TrailingStop=1000 WithoutlossLevel=100 WithoutlossProfit=900
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=0.00 MAPeriod=0 MA_use=0 Lots=0.00 takeprofit=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=0 overpos=0 TrailingStop=0 WithoutlossLevel=0 WithoutlossProfit=0

 

https://www.mql5.com/ru/docs/basis/function/events diz no final:"Para uma melhor compreensão, será útil executar o indicador cujo código está anexado abaixo. "

Executar o código. Durante o fim-de-semana. Não houve melhor compreensão - penso que foi bom como foi, mas as piores impressões foram acrescentadas. Não há carraças no fim-de-semana, pelo que prev_calculado = 0 neste momento sempre, quando se passa de um período de tempo para um período de tempo:

Contudo, a dada altura, este valor aparece (sem reconexões, honestamente nobre!):

e linhas engraçadas na tabela:

Ou metade de tanta diversão, como esta:

Havia até linhas no início da história sob a forma de um ZigZag (infelizmente, esqueci-me de tirar uma imagem e não a consegui reproduzir).

As linhas também aparecem em outras TF, mas mais esparsamente. Pode vê-lo facilmente por si próprio.

Era exactamente isso que os autores queriam dizer?

Porque é que o resultado de um cálculo prévio é pelo menos desigual na ausência de carraças, se não estranho? Algo está a funcionar mal quando se salta de TF para TF?

Deveriam estas (ou quaisquer outras) linhas ter aparecido fora das carraças?

Em casos raros, os saltos relativamente frequentes de TF para TF podem gerar algum tipo de pseudotick que inicia o cálculo dos valores das barras na história, etc.?

Devo esperar que o comportamento errático do terminal seja eliminado? Ou devo aprender a matemática?

Talvez eu esteja a tentar fazer algo que não deveria querer fazer? Nesse caso, justifique o seu ponto de vista.

Tenho muitas perguntas... mas isto é apenas o começo...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Continua...

Na mesma ligação há uma frase:"Nota: se a função OnCalculate devolver valor nulo, nenhum valor indicador é mostrado na Janela de Dados do terminal do cliente. "

Eis o que se passa... Se necessário, aceitarei de bom grado qualquer crescimento de braço e correrei imediatamente para o endireitar, se necessário. Mas... Em indicadores de complexidade simples e média, pode de alguma forma sair de algumas situações de tropeço. Mas à medida que o código se torna mais complexo, qualquer função de Copiar... () (tanto tomando como argumento a manipulação de outro indicador, como sem ele) começa a complicar a situação, como penso pessoalmente, lidando com a programação MQL há uma semana atrás. Então chega um momento limite quando não se sabe o que mais pode ser alterado no código, porque tudo o que pode ser alterado foi alterado, e o resto, como me parece, não deve ser alterado, porque não tem nada a ver com o problema. Ou ocorre um pensamento absolutamente desarmante: mudar todo o algoritmo, porque as peculiaridades e os caprichos do terminal não foram tidos em conta. Afinal de contas, enquanto estuda MQL para documentação, tem de lidar com as nuances, que os criadores têm mantido em silêncio, muito provavelmente inadvertidamente. E o programador MQL nunca aprende muitas coisas depois de estudar completamente a documentação... E o que é mais decepcionante, usando MQL, ou não consegue corrigir muitos dos caprichos do terminal, ou pode usar muletas duvidosas e um dia cair dolorosamente...

Bem... Hoje fiquei um pouco louco. É o fim-de-semana.

E eis o que queria dizer-vos esta manhã...

https://www.mql5.com/ru/forum/1111/page570#comment_117425 - Resolvi completamente o problema principal de como o indicador não é apresentado no início do terminal inicial (espero que ninguém argumente que nada deve impedir um indicador fractal de apresentar correctamente todo o historial, mesmo que não haja carraças?)

Foi:

            CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                    TimeUpBuffer[shift],
                                    exact_extremum);

substituído por:

            if(CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                       TimeUpBuffer[shift],
                                       exact_extremum)<0) return(0);

Admito a minha falta de atenção e o consequente formalismo pernicioso.

Mas... Ajudou no caso mais simples (simplifiquei propositadamente o indicador inicial). Num indicador mais complexo estas operações não foram úteis - num determinado momento as alterações não mostraram qualquer diferença, especialmente agora que existem muitas funções de cópia. E eu gostaria muito de receber uma instrução sensata sobre como e para onde ir a seguir. Afinal, tanto tempo é gasto em algo que funciona fora da caixa. Até agora, nem sequer sei se a culpa é minha ou do terminal. E não tenho a certeza se é apenas uma falta de "se" e deretorno. Parece suspeito aqui e ali, tal como noutros lugares, por exemplo.

Enviarei o código aos programadores no meu pessoal se necessário; posso também anexar um código semelhante, mas implementado de uma forma diferente e funciona sem problemas (embora, não se ajuste bem às tarefas e objectivos que estou a explorar).

 
O processo de registo da função de impressão no separador Especialistas em Terminais, bem como na RAM e ficheiro no disco é ou não um processo separado? Parece estar separado, o terminal não congela, mas porque é que durante o processo de abate intensivo abranda como se estivesse carregado com tijolos? Existe alguma forma de descarregá-lo? Se eu tiver decidido produzir elementos de matriz de tamanho bastante médio do ArraySize, os atrasos são bastante perceptíveis, e esquecerei imediatamente os valores de saída de elementos de matriz de tamanhos maiores.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

Há uma forte suspeita de que o terminal esteja a mexer com a cache (estou quase fora do circuito, por isso...). Pior - mesmo o MetaEditor afecta de alguma forma o tratamento do que se passa no terminal na altura.

Mais de uma vez encontrei um problema, quando modifiquei o código do programa MQL (que imprime os dados de depuração no registo do separador Expert Advisor), recompilei-o, fui à janela Terminal e vi os resultados anteriores a repetir-se, embora possa definitivamente dizer que não se trata de uma espécie de retrabalho atrasado da execução anterior do programa não concluído. Assim, parece que estou a compilar o código actualizado no MetaEditor com F7 e a enviá-lo para correr, e entretanto o terminal está a ser comandado para reproduzir novamente o código antigo (a partir do cache, ou algo como "fudging" páginas de memória por SO). Curiosamente, é possível desfazer/descarregar "preso nos dentes" a versão anterior do código .ex5 não só através do processo de descarga completa do terminal.exe, mas em alguns casos raros - apenas fechando o MetaEditor. Compreenda-o como quiser, acabei de contar o que observei pessoalmente.

Recentemente, houve uma situação em que o desenho:

Print(1);
for(int e=0; e<ArraySize(Arr); e++)
{
   Print(Arr[e]);
}
O gráfico mostra apenas o valor da primeira impressão, mas foi inútil esperar pela saída dos elementos da matriz. Após a remoção da primeira impressão e recompilação, a produção cíclica dos itens da matriz começou imediatamente. É uma conspiração secreta de impressões contra a MQL5-Comunidade ou serei eu o único a ter tanta má sorte?

Além disso, quero salientar que estes estranhos casos de comportamento do terminal foram observados não numa instância MT5 sobrecarregada com janelas de gráficos, objectos gráficos e programas MQL, mas com uma única janela de gráficos limpa (sem contar com o contorno de um indicador em execução).

 
x100intraday Esqueça os problemas - escreva em C ou em qualquer outra língua. Afinal, tudo o que precisamos do terminal é de obter orçamentos, informação de conta e executar ordens, e o resto pode ser escrito num ambiente de programação especializado e ligado através da biblioteca. Caso contrário, mudarão algo num momento e não haverá resposta sobre o porquê de não funcionar, se o projecto for grande. Não precisa de tais aventuras :) E se o Consultor Especialista ao mesmo tempo tiver de recompilar e apanhar a manutenção das encomendas actuais, perderá dinheiro, porque terá de descobrir o quê e porquê...
 
ivandurak:

1. O código ArrayInitialize não está a funcionar, se o laço for descomentado, tudo está bem.

E ao declarar variáveis na classe e indicador a nível global com o mesmo nome - surge um aviso.

1. O PlotIndexSetDouble(z,EMPTY_VALUE) é utilizado para amortecedores indicadores no inite.

2. Surge. Então algo deve ser feito a respeito, recomenda-se marcar os membros da classe com o prefixo "m_".

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
Пользовательские индикаторы / PlotIndexSetDouble - Документация по MQL5