Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 845

 
Anatoliy Ryzhakov:
Olá. Você pode me dizer como devolver o valor do tipo da penúltima ordem na história?

Você precisa encontrar a hora do último pedido fechado e depois procurar por pedidos com um tempo máximo de fechamento, mas menos do que o último tempo memorizado, foi o que eu fiz:

https://www.mql5.com/ru/forum/247136#comment_7555643

no meu exemplo o bilhete foi procurado, você precisaria devolver o tipo de pedido em vez do bilhete, ou conhecendo o bilhete do pedido, você pode descobrir o seu tipo...

История ордеров
История ордеров
  • 2018.05.24
  • www.mql5.com
Всем привет! Столкнулся с проблемой... сделал робота, который читает историю и открывает сделку...
 

É possível aplicar um modelo a uma função exportável para ser exportada de c++ para mql4?

Criei um arquivo tipo regular com extensão "srp" e escrevi ali uma função primitiva.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
MT4_EXPFUNC  int __stdcall  add(int a=0, int b=0)//stdcall //cdecl
{return (18);}

Então criei um arquivo com extensão "def" e especifiquei o nome da função a ser exportada

LIBRARY "dllmt42"
EXPORTS
add

Em seguida, passou por Build - Build Solution.
Quero aplicar um modelo à minha função porque vamos desenvolver funções que funcionam com matrizes e não podemos passar sem um modelo.

#define  MT4_EXPFUNC extern "C++" __declspec(dllexport)
template<typename T>MT4_EXPFUNC  int __stdcall  add(T a=0, T b=0){ return (18);}

T é destacado, mas escreve que há um conselho de ajuda de erro e é possível, tentou reordenar? Também como tal função, se possível, será chamada do lado do mql4?




 
Roman Shiredchenko:

olhar na base de código - no MT4 eles definitivamente eram...

Logo na primeira página, neste tópico.

 

Boa noite. No processo de estudar e aprender MT5 tentando implementar uma tarefa geralmente não difícil, mas pouca experiência e lacunas no conhecimento....... em geral não funciona, por favor, ajude e assista.

Tenho um indicador e consultor especializado, ambos com código fonte aberto, ambos do mesmo autor (Artem Trishkin, respeito e elogio). Estou tentando pedir ao indicador para obter a direção real no momento de pedir. O indicador mostra esta direção com setas para cima ou para baixo. A direção obtida será usada pelo Expert Advisor como um sinal ou como um filtro, mas ainda está muito longe.

Consegui o cabo indicador, mas os valores dos dados das setas do indicador são uma bagunça e não consigo descobrir.

Não mudei o indicador. Adicionei o OnInit em meu Consultor Especialista:

   CrossAD = iCustom(asymbol.Name(), _Period, "iCrossAD");
   if (CrossAD == INVALID_HANDLE)
   {
      Print("Не удалось создать описатель индикатора iCrossAD!");
      return(INIT_FAILED);
   }
      else Print("Хендл iCrossAD = ",CrossAD);

Eu acrescentei OnTick:

   int n=0;
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Buy_index  = n;
         Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find || ArraySize(Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 3-го буфера индикатора iCrossAD, error code %d",GetLastError());
      }
      else 
         for(n=0; n<period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
            }
         Last_Arrow_Sell_volume = Buf_Arrow_Buy[n];
         Last_Arrow_Sell_index  = n;
         Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);

Claro que descrevi e iniciei os overpens, arrays, definidos como timeseries e td......

Usado Comentário e Impressão para verificar. Não imediatamente, mas sem erros, apenas alguns avisos, eu não entendo. Mas o principal - os parâmetros são definidos de forma incorreta. Apesar da condição abaixo, o número máximo para o dobro para a seta para cima e algum número negativo para a seta para baixo são emitidos.

if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)break;
и
if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)break;
 
Aqui estão os arquivos
Arquivos anexados:
 
Sergey Voytsekhovsky:
Aqui estão os arquivos

Você começaria por testar a obtenção de dados do indicador com um simples teste EA, em vez de retirá-los de um artigo com muitas características desnecessárias para o teste.

Basta criar um simples Expert Advisor no MQL Wizard e usá-lo para praticar usando o iCustom()

 
Sergey Voytsekhovsky:

Boa noite. No processo de estudar e aprender MT5 tentando implementar uma tarefa geralmente não difícil, mas pouca experiência e lacunas no conhecimento....... em geral não funciona, por favor, ajude e assista.

Tenho um indicador e consultor especializado, ambos com código fonte aberto, ambos do mesmo autor (Artem Trishkin, respeito e elogio). Estou tentando pedir ao indicador para obter a direção real no momento de pedir. O indicador mostra esta direção com setas para cima ou para baixo. A direção obtida será usada pelo Expert Advisor como um sinal ou como um filtro, mas ainda está muito longe.

Consegui o cabo indicador, mas os valores dos dados das setas do indicador são uma bagunça e não consigo descobrir.

Não mudei o indicador. Adicionei o OnInit em meu Consultor Especialista:

Eu acrescentei OnTick:

Claro que descrevi e iniciei os overpens, arrays, definidos como timeseries e td......

Usado Comentário e Impressão para verificar. Não imediatamente, mas sem erros, apenas alguns avisos, eu não entendo. Mas o principal - os parâmetros são definidos de forma incorreta. Apesar da condição abaixo, o número máximo para o dobro para a seta para cima e algum número negativo para a seta para baixo são impressos.

Artyom disse corretamente e eu vou apenas notar a ausência de agulha de uma comparação

if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find || ArraySize(Buf_Arrow_Buy) != period_find)

Se CopyBuffer retornar o número de elementos copiados para a matriz, então o tamanho da matriz será exatamente esse. Assim, a parte destacada da condição simplesmente duplica a primeira.

E pensando alto: eu não olhei o código do indicador e da EA, então eu poderia estar errado. Você tem certeza de que deve haver um sinal no intervalo do period_find?

 
Alexey Viktorov:

Artem disse corretamente, e eu vou apenas apontar a desnecessidade de uma comparação

Se CopyBuffer retornar o número de elementos copiados para a matriz, então o tamanho da matriz será exatamente esse. De forma correspondente, a parte selecionada da condição simplesmente duplica a primeira.

Estou pensando em voz alta: eu não verifiquei o código do indicador e do Expert Advisor, então posso estar errado. Você tem certeza de que deve haver um sinal no intervalo do period_find?

Sim - é como um filtro - a freqüência dos sinais depende disso.

 
Artyom Trishkin:

Você começaria com um teste de obtenção de dados do indicador com um simples teste EA, em vez de retirá-lo de um artigo com um monte de funções desnecessárias para o teste.

A função iCustom() será mais conveniente para você.

Obrigado, bom conselho, eu o farei, pelo menos será mais conveniente.

Vou começar hoje.
 

Você pode me dizer o que está errado com o racionamento do lote?

double lot_=0.01;
double minlot=0.10;
double LotNormalize(double lot_)
  {
   if(minlot==0.001)
     {
      return(NormalizeDouble(lot_,3));
     }
   if(minlot==0.01)
     {
      return(NormalizeDouble(lot_,2));
     }
   if(minlot==0.10)
     {
      return(NormalizeDouble(lot_,1));
     }

   return(NormalizeDouble(lot_,0));
  }