Como codificar? - página 287

 

...

Dê uma olhada neste post : https://www.mql5.com/en/forum/174385/page12

Foi sobre um problema semelhante e você pode usar essa mesma contagemAbrirAbrirAcorrente

função para limitar a abertura de apenas um comércio por crossover

dipu:
Oi amigos, sou um novato. Eu tenho uma estratégia simples. Eu só escalpo quando a EMA se cruza. Eu só aceito apenas uma troca em cada crossover. Preciso de um código que possa aceitar apenas uma troca em cada crossover da EMA. Por favor, 8 de maio de 2008.
 

Simplesmente código EMA crossover precisa........

Muito obrigado, MLADEN...

Eu apenas verifico sua função. Está com bom aspecto. Eu também preciso de alguma ajuda. Preciso acrescentar valor RSI(50) com o crossover EMA.... como eu posso...?

Pares: GBP/USD & EUR/USD

Cronograma: 15min,1 hora e acima;

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

COMPRAR: EMA 5 Cross EMA 12 para cima, RSI maior que 50

VENDA: EMA 5 Cross EMA 12 para downside, RSI menos de 50

(apenas um comércio em cada crossover da EMA)

Estou esperando a resposta. Por favor.......

 

Você pode fazer isso de duas maneiras.

Uma maneira (diretamente na EA) poderia ser algo parecido com isto :

double macdc = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,0)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,0);

double macdp = iMA(NULL,0,EmaFast,0,MODE_SMA,EmaPrice,1)-iMA(NULL,0,EmaSlow,0,MODE_SMA,EmaPrice,1);

double rsi = iRSI(NULL,0,RsiPeriod,RsiPrice,0);

if (macdc*macdp<0) // change of sign, signal for a new order

{

if (macdc>0 && rsi>50) ... code for buy

if (macdc<0 && rsi<50) ... code for sell

}

[/PHP]

The good thing about it is that it is small (the code) and does not take any significant process time. The bad thing when using conditions like that in an EA is that you have to imagine (and test, test, test ...) what is it going to perform like. I prefer making a "binary" indicator with which the it is very easy to visually inspect if the condition has any logic in it and if it is going to be profitable or not and then call that indicator (using iCustom()) from the EA.

Here is how would the indicator with the above conditions look like in "binary" form :

Você tem todas as informações necessárias: a linha cinza é a "tendência". As linhas verde e vermelha podem ser usadas como pontos de entrada e reentrada. Você pode "otimizar" visualmente em um instante, e então usar esses parâmetros no EA (muito mais rápido "otimização" visualmente do que a dolorosa "mudança de parâmetros, rodá-lo, ver o que você tem e então a mesma coisa repetidamente". E é bastante fácil chamá-lo a partir do EA. Seria assim:

[PHP] double trendc = iCustom(NULL,0, "ema + rsi binário",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

dupla tendênciap = iCustom(NULL,0, "ema + rsi binário",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,1);

se (trendc!=trendp)

{

se (trendc=== 1) ... sinal para compra

se (trendc==-1) ... sinal para venda

}

Portanto, no geral, sempre recomendo o uso de um indicador de uso de um Ea. Você pode até mesmo mudar a lógica do Ea sem tocá-lo apenas alterando e refinando seu código de indicadores, caso em que o EA é "apenas" uma estrutura para gerenciamento de pedidos e dinheiro (já que os sinais estão vindo do indicador) que, em minha opinião, é uma maneira mais eficiente de usar Ea. Anexando o indicador também, assim você decide qual o caminho (o direto ou o "por indicador") que deseja usar em seu Ea

PS: nos exemplos acima, os testes são conduzidos na barra de corrente (ainda aberta). Se você deseja testar a barra fechada, substitua o 0 e 1 por 1 e em chamadas para iCustom(),iMa() e iRSI()

dipu:
Muito obrigado, MLADEN...

Eu apenas verifico sua função. Está com bom aspecto. Eu também preciso de ajuda. Preciso acrescentar valor RSI(50) com EMA crossover.... como posso...?

Pares: GBP/USD & EUR/USD

Cronograma: 15min,1 hora e acima;

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

COMPRAR: EMA 5 Cross EMA 12 para cima, RSI maior que 50

VENDA: EMA 5 Cross EMA 12 para downside, RSI menos de 50

(apenas um comércio em cada crossover da EMA)

Estou esperando a resposta. Por favor.......
Arquivos anexados:
 

Saldo do 1o. do mês?

Hoje eu tenho estado aqui sentado tentando descobrir se existe uma maneira de extrair o saldo inicial do 1º dia do mês para uma exibição na tela.

O que eu estou tentando fazer é obter a diferença percentual entre o saldo do 1º e o saldo atual.

Eu tenho a diferença percentual acima de tudo.

(Saldo - Depósito)/Depósito*100

Eu gostaria de acrescentar uma diferença mensal.

(Saldo - 1º)/1º*100

Qualquer dica ou código real seria ótimo.

Abraço

Beno

 

Mais uma vez obrigado, MALADEN...

Obrigado por seu indicador e conselhos. Eu apenas tento seguir suas instruções. Mas como sou inábil no mq4, não consegui fazer isso................

AQUI ESTÁ MINHA..............

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

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

#janela_indicadora de propriedade_separarate_window

#property indicator_buffers 3

#indicador de propriedade_color1 LimeGreen

#indicador de propriedade_color2 PaleVioletRed

#indicador de propriedade_color3 DarkGray

#largura_do_indicador de propriedade1 2

#largura_do_indicador de propriedade2 2

#indicador de propriedade_mínimo -1,1

#indicador de propriedade_máximo +1.1

externo int EmaFast = 5;

EmaSlow int externo = 12;

extern int EmaPrice = PREÇO_PREÇO_PREÇO;

int externo RsiPeriod = 14;

RsiPrice int externo = PREÇO_PREÇO_PREÇO;

duplo signup[];

duplo signdn[];

duplo signdn[];

duplo TakeProfit externo=15,0;

duplo externo Lots=0,1;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

retorno(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

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

int cnt, bilhete, total;

double trendc = iCustom(NULL,0, "ema + rsi binário",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

dupla tendênciap = iCustom(NULL,0, "ema + rsi binário",EmaFast,EmaSlow,EmaPreço,RsiPeriodo,RsiPreço,2,1);

se (trendc!=trendp)

total = EncomendasTotal();

if(total < 1)

{

se (trendc=== 1) //... sinal para compra

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de compra : ",GetLastError());

retornar(0);

}

se (trendc==-1) //... sinal para venda

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido de venda aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de VENDA : ",GetLastError());

retornar(0);

}

}

retorno(0);

}

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

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

Eu preciso de sua ajuda....

Pedi desculpas a você se eu te apareço mais como você caiu perturbado. Mas eu realmente desamparado...

Estou à espera de uma resposta. Por favor.......

 

...

Tente usar algo como isto :

double balanceAtStartOfMonth(int forMonth)

{

double current = AccountBalance();

datetime startTime = iTime(NULL,PERIOD_MN1,forMonth);

//

//

//

//

//

for (int k=OrdersHistoryTotal()-1; k>=0; k--)

{

if (!OrderSelect(k,SELECT_BY_POS,MODE_HISTORY)) break;

if (OrderCloseTime()<startTime) continue;

current -= (OrderProfit()+OrderSwap());

}

return(current);

}

forMonth é o mês para trás para o qual você deseja ver o saldo 0 sendo o mês atual. Ele então calcula o que era o saldo no primeiro dia do mês requerido. A função levará em conta também os depósitos e saques (OrderType() == 6), portanto deve funcionar bem.

Beno:
Hoje eu tenho estado aqui sentado tentando descobrir se existe uma maneira de extrair o saldo inicial para o 1º dia do mês para uma exibição na tela.

O que estou tentando fazer é obter a diferença percentual entre o saldo no 1º e o saldo atual.

Eu tenho a diferença percentual acima de tudo.

(Saldo - Depósito)/Depósito*100

Eu gostaria de acrescentar uma diferença mensal.

(Saldo - 1º)/1º*100

Qualquer dica ou código real seria ótimo.

Abraço

Beno
 

...

Você não pode gerenciar as ordens a partir do indicador. Você pode gerenciar ordens somente a partir de scripts ou EAs (que é o caso que você está procurando). O código de seu posto é um indicador.

Exemplos que eu postei devem ser usados de um EA (tanto quanto eu entendi você já tem um EA no qual você quer limitar o número de pedidos e deseja testar as condições de ema e rsi para entradas).

dipu:
Mais uma vez obrigado, MALADEN...

Obrigado por seu indicador e conselhos. Eu apenas tento seguir suas instruções. Mas como sou inábil no mq4, não consegui fazer isso................

AQUI ESTÁ MINHA..............

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

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

#janela_indicadora de propriedade_separarate_window

#property indicator_buffers 3

#indicador de propriedade_color1 LimeGreen

#indicador de propriedade_color2 PaleVioletRed

#indicador de propriedade_color3 DarkGray

#largura_do_indicador de propriedade1 2

#largura_do_indicador de propriedade2 2

#indicador de propriedade_mínimo -1,1

#indicador de propriedade_máximo +1.1

externo int EmaFast = 5;

EmaSlow int externo = 12;

extern int EmaPrice = PREÇO_PREÇO_PREÇO;

int externo RsiPeriod = 14;

RsiPrice int externo = PREÇO_PREÇO_PREÇO;

duplo signup[];

duplo signdn[];

duplo signdn[];

duplo TakeProfit externo=15,0;

duplo externo Lots=0,1;

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int init()

{

retorno(0);

}

//------------------------------------------------------------------

//

//------------------------------------------------------------------

int start()

{

int count,counted_bars=IndicatorCounted();

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

if(counted_bars>0) counted_bars--;

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

int cnt, bilhete, total;

double trendc = iCustom(NULL,0, "ema + rsi binário",EmaFast,EmaSlow,EmaPrice,RsiPeriod,RsiPrice,2,0);

dupla tendênciap = iCustom(NULL,0, "ema + rsi binário",EmaFast,EmaSlow,EmaPreço,RsiPeriodo,RsiPreço,2,1);

se (trendc!=trendp)

total = EncomendasTotal();

if(total < 1)

{

se (trendc=== 1) //... sinal para compra

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "My EA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de compra : ",GetLastError());

retornar(0);

}

se (trendc==-1) //... sinal para venda

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "My EA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido de venda aberto : ",OrderOpenPrice());

}

else Print("Erro na abertura do pedido de VENDA : ",GetLastError());

retornar(0);

}

}

retorno(0);

}

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

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

Eu preciso de sua ajuda....

Pedi desculpas a você se eu te apareço mais como você caiu perturbado. Mas eu realmente desamparado...

Estou esperando a resposta. Por favor.......
 

Obrigado pela resposta, MLADEN,

Desculpe, acho que você me disse para colocar esse código em um novo EA.

Eu só sinto falta de entender sua resposta....

SIM. Você está certo....

Eu tenho EA e queria modificar. Com alguma nova condição.......

minha condição é :

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

COMPRAR: EMA 5 Cross EMA 12 para cima, RSI maior que 50

VENDA: EMA 5 Cross EMA 12 para downside, RSI menos de 50

Saída: com pequeno Take-Profit

(apenas um comércio em cada crossover da EMA)

aqui minha EA.....

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

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

Lotes duplos externos=0,1;

externo int TakeProfit=5;

externo int StopLoss=5;

externo int RSIPos=50;

externo int RSINeg=50;

extern int Slippage=2;

extern int abandon=101;

datatime bartime=0;

int bartick=0;

duplo p;

int cnt=0;

int OrdensPerSímbolo=0;

bullMA3=0; double bullMA3=0;

double bearMA7=0;

duplo RSI=0;

bool RSIPOS=0;

bool RSINEG=0;

duplo TP;

duplo SL;

int init()

{

if (Symbol()=="AUDUSD") {TakeProfit= 60; StopLoss= 23; abandon=103;}

if (Symbol()=="EURAUD") {TakeProfit= 95; StopLoss=141; abandon=33;}

if (Symbol()=="EURCHF") {TakeProfit= 81; StopLoss= 77; abandon=97;}

if (Symbol()=="EURGBP") {TakeProfit= 11; StopLoss= 77; abandon=108;}

if (Symbol()=="EURJPY") {TakeProfit= 38; StopLoss= 75; abandon=183;}

if (Symbol()=="EURUSD") {TakeProfit=35; StopLoss= 35; abandon=5;}

if (Symbol()=="GBPCHF") {TakeProfit= 79; StopLoss= 98; abandon=113;}

if (Symbol()=="GBPJPY") {TakeProfit= 13; StopLoss= 98; abandon=117;}

if (Symbol()=="GBPUSD") {TakeProfit= 55; StopLoss=100; abandon=69;}

if (Symbol()=="USDCAD") {TakeProfit= 66; StopLoss= 76; abandon=106;}

if (Symbol()=="USDCHF") {TakeProfit=117; StopLoss= 78; abandon=111;}

if (Symbol()=="USDJPY") {TakeProfit= 53; StopLoss= 74; abandon=110;}

}

int deinit()

{

}

int start()

{

p=Ponto;

// Verificação de erros e contagem de barras

if(AccountFreeMargin()<(200*Lots)) {Print("-----NO MONEY"); return(0);}

if(Bars<100) {Print("-----NO BARS "); return(0);}

if(bartime!=Time[0]) {bartime=Time[0]; bartick++;}

bullMA3=iMA(Symbol(),0,3,0,MODE_EMA,PRICE_CLOSE,1);

bearMA7=iMA(Symbol(),0,7,0,MODE_EMA,PRICE_CLOSE,1);

RSI=iRSI(Symbol(),0,2,PRICE_CLOSE,2);

if(RSI>RSIPOS) {RSIPOS=verdadeiro; RSINEG=falso;}

if(RSI<RSINeg) {RSIPOS=falso; RSINEG=verdadeiro;}

OrdensPorSímbolo=0;

for(cnt=OrdensTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

OrdensPorSímbolo++;

}

}

if(EncomendasPorSímbolo==0)

{

if(bullMA3>(bearMA7+p) && RSINEG)

{

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick=0;

}

if(bullMA3<(bearMA7-p) && RSIPOS)

{

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Red);

Bartick=0;

}

}

if(OrderPerSymbol===1 && bartick===abandonar)

{

if(OrderType()==OP_BUY)

{

OrderClose(OrderTicket(),Lots,Bid,Slippage,White);

SL=Bid+(StopLoss*p);

TP=Bid-(TakeProfit*p);

OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP, "SELL "+CurTime(),0,0,Vermelho);

bartick++;

}

if(OrderType()==OP_SELL)

{

OrderClose(OrderTicket(),Lots,Ask,Slippage,Red);

SL=Ask-(StopLoss*p);

TP=Ask+(TakeProfit*p);

OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP, "BUY "+CurTime(),0,0,White);

bartick++;

}

}

for(cnt=0;cnt<OrdersTotal();cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if( OrderSymbol()==Symbol() )

{

if(OrderType()==OP_BUY)

{

se (OrderMagicNumber()==0)

{

if( Preço de Compra-Preço Aberto() > 3*Ponto )

{

OrderClose(OrderTicket(),Lots,Bid,0,White);

retornar(0);

}

}

}

if(OrderType()==OP_SELL)

{

se (OrderMagicNumber()==0)

{

if( OrderOpenPrice()-Ask > (3*Point) )

{

OrderClose(OrderTicket(),Lots,Ask,0,Red);

retornar(0);

}

}

}

}

}

retorno(0);

}

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

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

Como posso modificar isso....? Aguardando resposta. Por favor.......

 

dipu

No que diz respeito às entradas, esta funciona bem.

Agora cuide das saídas, pois da maneira como você as escreveu, você está fechando as ordens muito cedo Também o corretor de 5 dígitos está cuidando agora, e as entradas estão funcionando como deveriam. O período padrão para rsi está definido para 14 (eu não sabia qual deles você quer usar, em código você usa o período 2, mas isso provavelmente é curto). Os períodos Ema são, por padrão, 5 e 12. Além disso, ele está testando uma barra fechada agora (ele espera até que a barra feche e se então o sinal para compra r venda existir, ele entra no pedido)

Arquivos anexados:
dipu.mq4  5 kb
 

Obrigado pela resposta, MLADEN,

desculpe por não obter informações claras.......

COMPRAR: EMA 5 Cross EMA 12 para cima, RSI[14] maior que 50

VENDA: EMA 5 Cruz EMA 12 para baixo, RSI[14] menos de 50

Saída: com pequeno TP/Sl....(5pip)

(apenas um comércio em cada crossover da EMA)

Eu só experimentei e vou informar o reasult....

Que ele também possa modificar ou não...

Obrigado novamente por sua ajuda.....