Como codificar? - página 271

 

Precisa de ajuda com a função iCustom para esta EA pode Chamar um indicador personalizado.

Olá a todos,

Eu gostaria de adicionar isto (Entry.mq4) indi (swb grid 4.1.0.3_EA) EA com

iCustom funciona para que eu e nós possamos usar este indicador na estratégia da EA.

o EA já usa 3 indicadores MT4 Bandas de Bollinger, Stochastic e RSI e tem

para que você possa selecionar um ou todos eles a serem utilizados, selecionando TRUE ou FALSE

e eu gostaria de acrescentar este 4º indi(Entry.mq4) à EA.

Eu gostaria muito que alguém pudesse me ajudar.

Obrigado.

o EA e o indi em anexo abaixo.

Arquivos anexados:
 

Noob MQL4 ajuda necessária para entender esta matriz

Olá, codificadores

Alguém gostaria de me educar um pouco sobre arrays

Ou talvez eu esteja tendo mais dificuldade para entender este laço, pois ele pertence a esta matriz.

int i=Bars;

#property copyright "Unfinished POS by Agent86"

duplo v1[];

duplo v2[];

duplo val1;

duplo val2;

int start()

{

while(i>=0)

{

val1=iFractals(NULL, 0, MODE_UPPER,i);

se (val1 > 0)

{

v1=Alto;

}

senão

{

v1=v1;

}

val2=iFractals(NULL, 0, MODE_LOWER,i);

se (val2 > 0)

{

v2=baixo;

}

senão v2=v2;

i--;

}

retorno(0);

}

É um fractal básico, e ainda assim não consigo me referir a nenhum elemento da matriz.

Quero ser capaz de incrementar i++ de alguma forma e imprimir (v1); ou imprimir o valor anterior antes do 0 ou EMPTY_VALUE.

Se eu estiver mesmo indo na direção certa com isto.

Estou tendo problemas.

Imprimir (v1): sempre == 0 e imprime 0

Eu meio que entendo porque na verdade está descendo para -1 que == 0

Como e onde eu poderia colocar as declarações impressas para que eu possa ver o que está acontecendo?

Eu tentei multidões ou métodos e reinicializei i=0 para tentar e alternar o loop para que eu pudesse me referir aos elementos v1, mas todas as tentativas falharam.

Basicamente, quero ver os fractais anteriores ou marcá-los como A alto, B baixo etc. para possível uso futuro em um esquema ABCD tipo EA

Por enquanto, quero principalmente Imprimir v1 para que eu possa ver o que está fazendo.

Talvez eu possa projetar algo para selecionar um Fractal Anterior como A_high e/ou B_low ou algum esquema desse tipo.

Estou no caminho errado com isto?

Por favor, avise-me

Obrigado

 

Em vez disso, eu optaria por A FOR loop. Enquanto os loops podem levar a bloqueios se você se esquecer de incluir o i... Como você sabe o número exato de barras, é mais fácil de usar, mais o i nunca será < 0. Isso ajuda a evitar confusão.

Para (int i=Bars-1;i>0;i--) {

// código

}

Tente ajustar todos os valores da matriz para 0, depois volte e atribua valores indicadores. Tente também imprimir() diretamente após atribuir seu valor indicador. Veja se ele está realmente retornando alguma coisa.

Sua melhor aposta, em meu palpite, é realmente atribuir um tamanho ao array. Digamos, 1000 posições. É improvável que você precise de tantas, além disso, isso reduzirá os cálculos que você está fazendo. Tudo o que você precisa fazer então é fazer um loop através das últimas 999 barras a 0 e atribuir valores. Lembro que o MT4 tem problemas com as initilizações da matriz e outras coisas mais.

 

Perguntas sobre a matriz

Trader5050-Deployed:
Em vez disso, eu optaria por A FOR loop. Enquanto os loops podem levar a bloqueios se você se esquecer de incluir o i... Como você sabe o número exato de barras, é mais fácil de usar, mais o i nunca será < 0. Isso ajuda a evitar confusão.

Para (int i=Bars-1;i>0;i--) {

// código

}

Tente ajustar todos os valores da matriz para 0, depois volte e atribua valores indicadores. Tente também imprimir() diretamente após atribuir seu valor indicador. Veja se ele está realmente retornando alguma coisa.

Sua melhor aposta, em meu palpite, é realmente atribuir um tamanho à matriz. Digamos, 1000 posições. É improvável que você precise de tantas, além disso, isso reduzirá os cálculos que está fazendo. Tudo o que você precisa fazer então é fazer um loop através das últimas 999 barras a 0 e atribuir valores. Lembro que o MT4 tem problemas com as initilizações da matriz e outras coisas mais.

Ok, obrigado, vou tentar.

Embora as declarações estejam funcionando bem, não está me ajudando a obter os elementos da matriz que eu quero imprimir/visualizar, etc.

Vou trabalhar no que você disse e fazer alguns testes e postar de volta.

Obrigado

 
Trader5050-Deployed:
Em vez disso, eu optaria por A FOR loop. Enquanto os loops podem levar a bloqueios se você se esquecer de incluir o i... Como você sabe o número exato de barras, é mais fácil de usar, mais o i nunca será < 0. Isso ajuda a evitar confusão.

Para (int i=Bars-1;i>0;i--) {

// código

}

Tente ajustar todos os valores da matriz para 0, depois volte e atribua valores indicadores. Tente também imprimir() diretamente após atribuir seu valor indicador. Veja se ele está realmente retornando alguma coisa.

Sua melhor aposta, em meu palpite, é realmente atribuir um tamanho à matriz. Digamos, 1000 posições. É improvável que você precise de tantas, além disso, isso reduzirá os cálculos que está fazendo. Tudo o que você precisa fazer então é fazer um loop através das últimas 999 barras a 0 e atribuir valores. Lembro que o MT4 tem problemas com as initilizações da matriz e outras coisas mais.

Ainda apenas imprimindo o array com todas as entradas 0

Estranho

 

Argent86,

Há alguns erros em seu código :

- as matrizes que você está usando ainda não são matrizes (se você não especificar o tamanho da matriz, como você fez no código, então é uma matriz dinâmica e o tamanho da matriz deve ser gerenciado em tempo de execução) então você está tendo matrizes de tamanho 0 (essa é a primeira razão para ter sempre 0 - é uma rotina de manipulação de erros de metatrader evitando erros fatais e retornando 0 como resultado para tais casos - em C/C++ causaria uma falha)

- se você não especificar que a matriz é "tipo série" (em "série como" o 0º elemento é o último enquanto em matrizes normais o 0º elemento é o primeiro) então a expressão i+1 é o próximo elemento de uma matriz nesse caso não o anterior. Você pode usar arrays da maneira "tipo série", mas então você tem que fazer mais algumas coisas a fim de fazê-lo funcionar em tempo de execução, e mesmo assim quando os números de barra mudarem você vai obter código rastejante, então é melhor usar arrays em seu modo nativo - modo "tipo C

- certifique-se também de que você começa pelo menos a partir da 3ª barra em um novo tick (é onde um novo fractal aparecerá, não em uma barra atual)


Aqui está o que você está tentando fazer sem essas questões
#property indicator_chart_window

double v1[];

double v2[];

int start()

{

int i,a,limit,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit = MathMin(Bars-counted_bars,Bars-1);

if (ArraySize(v1)!=Bars) ArrayResize(v1,Bars);

if (ArraySize(v2)!=Bars) ArrayResize(v2,Bars);

//

//

//

//

//

for (i=limit, a=Bars-i-1; i>=0; i--,a++)

{

v1[a]=v1[a-1]; if (iFractals(NULL,0,MODE_UPPER,i) > 0) v1[a]=High;

v2[a]=v2[a-1]; if (iFractals(NULL,0,MODE_LOWER,i) > 0) v2[a]=Low;

}

Comment("current upper frctal : "+DoubleToStr(v1,Digits)+"\n"+

"current lower frctal : "+DoubleToStr(v2,Digits));

return(0);

}
 

Acesso a partir do MQ4 uma função dll com: listas de documentos variáveis

oi,

Qualquer um sabe se isso é possível: importar uma função dll que usa como argumento a: listas de documentos variáveis

por exemplo, vprintf - C++ Referência

int vprintf ( formato const char *, va_list arg );

se sim, como se faria isso?

Obrigado

MJ

 

Como chamar a função sem valor de retorno

Olá, meninos e meninas.

Em algum momento do meu programa eu gostaria de chamar para uma função.

Entretanto, a função não tem valor de retorno (vazio). Então, como eu chamo a função,

por isso ele executa o código dentro da função exatamente no local onde eu o solicito,

como se estivesse escrito naquele mesmo lugar?

Fiz um exemplo de código abaixo... onde verifico alguns parâmetros, e se Ok, quero executar a função...

Espero que alguém possa me ajudar com isto, tx com antecedência, Jonkie76

//+------------------------------------------------------------------+

//| função de início especializado |

//+------------------------------------------------------------------+

int start()

{

//----

if (Preço >= PREÇO_CLOSE)

Como faço isso?

senão

Alerta("Não fazer nada"); //

//----

retorno(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNÇÕES

//===================================================================+

//----------------------- FUNÇÃO FECHAR PEDIDO ----------------------+

subCloseOrder() vazio

{

int

i,

total = 0,

bilhete = 0,

err = 0,

c = 0;

total = OrdensTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

caso OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

senão

{

if(err==0 || err===4 || err==136 || err==137 || err==138 || err==146) //Busy errors

{

Sleep(5000);

continuar;

}

outro // erro normal

{

if(ticket>0) break;

}

}

}

pausa;

}

}

}

}

 

É muito simples. Você só precisa chamá-lo como se fosse devolver algo, só não precisa salvar nenhum resultado porque não há nenhum resultado com o tipo vazio. (não retorna nada) Assim:

int start()

{

//----

if (Price >= PRICE_CLOSE)

subCloseOrder(); // At this point I'd like to call the function.How do I do that?

else

Alert("Do nothing"); //

//----

return(0);

}

 

Em vez disso, use "vazio". Assim :

void someFunction(someParameters)

{

...

//

//

// no need to place return at the end, but if you want then use "just" return, like this

//

//

return;

}

Vazio significa que não vai retornar o valor de uma função e, assim, torna-se efetivamente um procedimento, não uma função.

Jonkie76:
Olá, meninos e meninas.

Em algum momento do meu programa eu gostaria de chamar para uma função.

No entanto, a função não tem valor de retorno (vazio). Então, como eu chamo a função,

por isso ele executa o código dentro da função exatamente no local onde eu o solicito,

como se estivesse escrito naquele mesmo lugar?

Fiz um exemplo de código abaixo... onde verifico alguns parâmetros, e se Ok, quero executar a função...

Espero que alguém possa me ajudar com isto, tx com antecedência, Jonkie76

//+------------------------------------------------------------------+

//| função de início especializado |

//+------------------------------------------------------------------+

int start()

{

//----

if (Preço >= PREÇO_CLOSE)

Como faço isso?

senão

Alerta("Não fazer nada"); //

//----

retorno(0);

}

//+------------------------------------------------------------------+

//===================================================================+

//FUNÇÕES

//===================================================================+

//----------------------- FUNÇÃO FECHAR PEDIDO ----------------------+

subCloseOrder() vazio

{

int

i,

total = 0,

bilhete = 0,

err = 0,

c = 0;

total = OrdensTotal();

for(i=total-1;i>=0;i--)

{

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber()==Magic)

{

switch(OrderType())

{

caso OP_BUY :

for(c=0;c<NumberOfTries;c++)

{

ticket=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Violet);

err=GetLastError();

if(err==0)

{

if(ticket>0) break;

}

senão

{

if(err==0 || err===4 || err==136 || err==137 || err==138 || err==146) //Busy errors

{

Sleep(5000);

continuar;

}

outro // erro normal

{

if(ticket>0) break;

}

}

}

pausa;

}

}

}

}
Razão: