Como codificar? - página 206

 

Usando arquivos *.set externos

Eu tentei e tentei, mas não consigo descobrir isso, então espero que alguém consiga ver a árvore através da floresta aqui.

Quero programar um EA para usar as configurações programadas ou então usar um arquivo *.set externo.

Portanto, se:

bool externo UseExternSet = verdadeiro;

ele usará as configurações no arquivo externo do conjunto em vez das configurações programadas.

Saiba que isso pode ser feito, mas simplesmente perdido aqui.

Qualquer exemplo serve

Bernard

 

Problema de compilador ou problema de código ?

extern int ma1period=5;

extern int ma1method=1;

extern int ma1tf=0;

extern int ma2period=5;

extern int ma2method=1;

extern int ma2tf=10080;

extern double lots=1;

int init(){}

int deinit(){}

double CMA (int tf,int period, int shift, int method)

{

double MA=iMA(NULL,tf,period,0,method,0,shift)

return(MA)

}

int start()

{

int BarsCount=0;

if (Bars> BarsCount)

{

BarsCount=Bars;

double ma1.1=CMA(ma1tf,ma1period,1,ma1method);

double ma1.2=CMA(ma1tf,ma1period,2,ma1method);

double ma2.1=CMA(ma2tf,ma2period,1,ma2method);

double ma2.2=CMA(ma2tf,ma2period,2,ma2method);

bool ma1upsignal =ma1.2<ma1.1;

bool ma1downsignal =ma1.2>ma1.1;

bool ma2upsignal =ma2.2<ma2.1;

bool ma2downsignal =ma2.2>ma2.1;

if (ma1upsignal&&ma2upsignal)

{

OrderSend(Symbol(),OP_BUY,lots,Ask,3,NULL,NULL,NULL,NULL,0,Green);

}

if (ma1downsignal&&ma2downsignal)

{

OrderSend(Symbol(),OP_SELL,lots,Bid,3,NULL,NULL,NULL,NULL,0,Green);

}

if ((ma1upsignal&&ma2downsignal)||(ma1downsignal&&ma2upsignal))

{

int total=OrdersTotal(); //Script to close all open orders.

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

{

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

switch(type)

{

//Close opened long positions

case OP_BUY : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );

break;

//Close opened short positions

case OP_SELL : OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );

}

}

}

}

Este é o pedaço de código em que estou trabalhando. O compilador diz que "a variável BarsCount não está definida". O que eu faço? Até onde posso ver, a variável foi inicializada e lhe foi dado um valor.

É meu problema de compilador ou problema de código?

Arquivos anexados:
capture2_1.png  12 kb
 

[CÓDIGO]

CMA duplo (período int tf,int, turno int, método int)

{

duplo MA=iMA(NULL,tf,período,0,método,0,turno);

retorno(MA);

}

 
username1:
[CÓDIGO]

CMA duplo (período int tf,int, turno int, método int)

{

duplo MA=iMA(NULL,tf,período,0,método,0,turno);

retorno(MA);

}

Michel,

Obrigado. Isso resolveu o problema :-)

 

Contando barras consecutivas

Alguém tem algum código sobre como contar barras de compra/venda consecutivas seguidas? Quero contar quantas vezes em um gráfico (digite o número de barras para verificar) há 1 barra de venda em linha, 32 barras de venda em linha, 3 barras de venda em linha, 4 barras de venda em linha (as mesmas c/ compra) etc.

Eu sei que preciso fazer um loop, mas não consigo entender bem como.

Os resultados podem ir em um Comentário().

Obrigado.

 

Por que meu programa não funciona?

Escrevi um simples programa.

É suposto entrar apenas um pedido de cada vez, e sair com um take profit ou um stop loss.

É criado para M30 em GBPUSD.

Ie: algumas das sed constantes no programa são encontradas por estimativas "oculares". Isto não deve afetar muito o programa... também não funciona com constantes diferentes. (Pelo menos, quando testado c/ o Testador de Estratégia, ajustado em rápido ou médio: não "tique por tique". (muito lento...)

De qualquer forma, o prog, quando testado não entra em uma ordem E nunca! verifique na direção "para cima". (Isto, através da "impressão"/trace)

(é suposto verificar: entrar c/ uma compra ou entrar c/ uma venda)

Lógica incidental: verificar 2 barras consecutivas. Se a barra 1 tiver ambas: uma maior alta e uma maior baixa, a prog pensa que a próxima barra será para cima.

(Symetrically para baixo).

O lucro e o stop loss são definidos de acordo.

O prog também não funcionou quando as declarações "se" foram aninhadas....

Obrigado por olhar para isto.

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

//| função de iniciação de especialista |

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

int init()

{

//----

//----

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit()

{

//----

//----

retorno(0);

}

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

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

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

int start()

{

//----

bool TrendUp1; duplo TakeProfitUp; duplo EE = .00500;

bool OrdTot_OK; duplo lote; duplo deslizamento;

duplo SL_Trailing_Up;bool High2Up;bool Low2Up;

int ticketup;int ticketdown;bool DownAndBig; bool UpAndBig;

bool TrendDown; double SL_Trailing_Down; double TakeProfitDown;

bool High2down; bool Low2down;

int ABC = OrdersTotal();

double Size1 = .00630;bool BigUp; double A = High[1];double B= Low[2];//41

duplo C= Alto[2]; duplo D= Baixo[1]; bool BigDown;

//------------------------------------down order start

se (ABC == 0)// nenhuma ordem fora é verdadeira

OrdTot_OK = verdadeiro;

se (ABC == 0)// nenhuma ordem fora é verdadeira

Imprimir ("na seqüência de ordem para baixo, nenhuma ordem saiu");

se ((C-D) > Tamanho1)//alto de 2 menos baixo de 1 > .0063

BigDown = verdadeiro;

se ((C-D) > Tamanho1)//alto de 2 menos baixo de 1 > .0063

Imprimir ("na seqüência de ordem para baixo, encontrei uma grande quebra");

se (Alto[1]< Alto[2])

High2down=verdadeiro;

se (Alto[1]< Alto[2])

Imprimir ("na seqüência de ordem decrescente, as barras consecutivas têm máximas decrescentes");

if(Baixo[1]< Baixo[2])

Low2down=verdadeiro;

if(Baixo[1]< Baixo[2])

Imprimir ("na seqüência de ordem decrescente, as barras consecutivas têm mínimos decrescentes");

se (High2down && Low2down)

TrendDown=verdadeiro;

if (High2down && Low2down)

Imprimir ("na seqüência de ordem para baixo, a bandeira TrendDown está definida");

se (TrendDown)

SL_Trailing_Down = Alto[1];

se (TrendDown)

Imprimir ("na seqüência de ordem para baixo, definiu o stop_loss");

se (TrendDown)

TakeProfitDown = Bid - (.005);

se (TrendDown)

Imprimir ("em seqüência de ordem decrescente, tem um takeprofit", TakeProfitDown);

se (TrendDown && BigDown)

DownAndBig = verdadeiro;

se (DownAndBig && OrdTot_OK)

ticketdown= OrderSend(Symbol(),OP_SELL,lot, Bid,slip,SL_Trailing_Down,TakeProfitDown,Blue);

if (DownAndBig && OrdTot_OK)

Imprimir ("na seqüência de ordem para baixo, tentou digitar um ticket", ticketdown);

se (ticketdown < 0)

Print("OrderSend_Down failed with error #",GetLastError()));

return(0);

//----------------------------------------------down order done

//---------------------------------------------------up order start

se (ABC == 0)

OrdTot_OK = verdadeiro;

se (ABC == 0)

Imprimir ("na seqüência de subida, nenhuma ordem estava fora");

se ((A - B) > Tamanho1)

BigUp = verdadeiro;

se ((A - B) > Tamanho1)

Imprimir ("na seqüência de subida, o teste de tamanho para as duas barras estava ok");

se (Alto[1] > Alto[2])

High2Up = verdadeiro;//44

se (Alto[1] > Alto[2])

Imprimir ("na seqüência de subida, o teste para aumentar as alturas foi ok");

if(Baixo[1] > Baixo[2])

Low2Up=verdadeiro;

if(Baixo[1] > Baixo[2])

Imprimir ("na seqüência de subida, o teste para aumentar as baixas foi ok");

se (High2Up && Low2Up)

TrendUp1=verdadeiro;

se (High2Up && Low2Up)

Imprimir ("na seqüência de subida, colocou a bandeira para subir");

se (TrendUp1)

SL_Trailing_Up = Baixa[1] ;

se (TrendUp1)

Imprimir ("na seqüência de subida, estabelece-se o stoploss");

se (TrendUp1)

TakeProfitUp = Pergunte + (.005);

se (TrendUp1)

Imprimir ("na seqüência de subida, estabelecer o takeprofit", TakeProfitUp);

se (TrendUp1 && BigUp)

UpAndBig = verdadeiro;

se ( UpAndBig && OrdTot_OK)

ticketup = OrderSend(Symbol(), OP_BUY,lot, Ask,slip, SL_Trailing_Up,TakeProfitUp,Red);

if (UpAndBig && OrdTot_OK)

Imprimir ("na seqüência de subida, tentou enviar um pedido", ticketup);

se (ticketup < 0)

Print("OrderSend_Up failed with error #",GetLastError()));

return(0);

//-------------------------------------------------up order done

//----

return(0);// não tenho certeza sobre esta linha

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

//----

retorno(0);

}

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

 

Barras mínimas antes/depois do comércio

Hi,

Olá, sou novo no MT4... Alguém poderia me dizer como posso colocar uma restrição em uma EA que requer um mínimo de barras "x" para abrir uma nova posição ou fechar uma posição anterior?

(sem usar o comando sleep)

Cumprimentos.

 

ajuda de codificação mql

if (iMA(NULL, 0, 24, 0, MODE_LWMA, PRICE_WEIGHTED, 1) > iMA(NULL, 0, 120, 1, MODE_LWMA, PRICE_WEIGHTED, 1)) gi_268 = 2;

---------------------------------------------------------------

o que isso significa ??

2 LWMA utilizados ?

LWMA período =24 turno =0 sobre o preço ponderado (hcll4) cruzar ao longo do período LWMA 120 turno =1 sobre o preço ponderado (hcll4) depois comprar ou vender ??

 

Problema com a posição de fechamento

Hi,

Comecei agora com minha nova EA e as posições de abertura estão OK, eu configuro o tp e sl. A EA abre e fecha 1 por 1 posição e nunca há mais de 1 ordem. Mas eu gostaria de fechar a posição se alguns indicadores me alertarem antes do limite de sl ou tp.

Se eu tentar algo como isto:

for (int i=1; i<=OrdersTotal(); i++) {

if (OrderSelect(i, SELECT_BY_POS, 2)) {

if (OrderSymbol()==Symbol()) {

Ans=OrderClose(OrderTicket(),alLots,Bid,2);// Order closing

}

}

}[/CODE]

Nothing happened. Doesn't find any opened positions and I know there is 1.

If I try something like this:

for (int i=1; i<=OrdersTotal(); i++) {

CloseOrder(OrderValue(i,VAL_TICKET),OrderValue(i,VAL_LOTS),Bid,3);

}

Compiler report error message that VAL_TICKER and VAL_LOTS are not defined and in examples I found they are nowhere declared.

If I try direcly by number to close:

[CODE]

Ans=OrderClose(0,alLots,Bid,2);// Order closing

recebo a mensagem de erro 4107 ou 4105 que o ticker é inválido.

Alguém pode verificar isto e minha ea em anexo e ajudar por favor?

Muito obrigado.

Arquivos anexados:
rsiproba.mq4  6 kb
 

iO mais alto iO mais baixo esclarecimento

Assumir 3 barras: Barra [2], Barra [1] e Barra [0] (Atual).

A seguinte função "stop_low()" está correta para encontrar o ponto mais baixo da barra [2] e [3] ?

stop_low duplo = iLowest(Símbolo(),0,1,2,1);

------------------------------------------------------------

Referência:

int iLowest( símbolo de corda, int cronograma, int tipo, int count=WHOLE_ARRAY, int start=0)

Retorna o deslocamento do menor valor durante um número específico de períodos, dependendo do tipo.

Parâmetros:

símbolo - Símbolo cujos dados devem ser usados para calcular o indicador. NULL significa o símbolo atual.

Período de tempo - Período de tempo. Pode ser qualquer um dos valores de enumeração de Prazo. 0 significa o intervalo de tempo atual do gráfico.

tipo - Identificador da matriz de série. Pode ser qualquer um dos valores de enumeração do identificador da matriz de série.

contagem - Número de períodos (na direção da barra inicial até a barra posterior) nos quais o cálculo é realizado.

start - Deslocamento mostrando a barra, em relação à barra atual, de onde os dados devem ser tirados.

Amostra:

// calculando o valor mais baixo nas 10 barras consequentes na faixa

// do 10º ao 19º índice inclusive no gráfico atual

val=baixo;