Questões básicas ... - página 8

 
 
newdigital:
Veja este tópico: https://www.mql5.com/en/forum/178677

muito obrigado , pelas instruções de abertura de arquivo e link para download

 

10 pontos3

PLEAASEEE, PROGRAMADORES!

Precisamos em 10 pontos3 EA, que quando o terceiro comércio abrir, o primeiro feche, estou tentando, mas ainda está fechando todas as posições.

Na verdade, nós temos:

se (PreviousOpenOrders>OpenOrders)

{

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

mode=OrderType();

if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)

{

if (mode===OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Blue); }

if (mode===OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Red); }

return(0);

}

Eu estava pensando em fazer isso:

1. mudar o número mágico para o primeiro comércio quando o segundo abrir, por exemplo, número mágico+1

2. Quando o terceiro comércio abrir, feche o primeiro, com o número mágico+1 atribuído.

Estou certo?

ou qual outra forma posso identificar o primeiro comércio aberto para fechá-lo depois?

Se você puder me orientar ou fazer as mudanças, melhor porque eu não sou programador, estou apenas aprendendo.

Esta mudança seria o começo do Holly Grail!!!

 

10 pontos3

Desculpe, a EA.

E está nesta linha:

https://www.mql5.com/en/forum/174975

Obrigado!

Arquivos anexados:
10p3v0.03_1.mq4  12 kb
 

ajuda na programação - operador de retorno

olá

sou iniciante com a programação mt4 e agora muitas vezes tento encontrar uma solução para comprometer variáveis desde uma função vazia até o programa principal "start()".

abaixo você pode ver uma amostra e a pergunta é, como posso comprometer valor das variáveis "CountOpenSell", "CountOpenBuy", "ProfitSell" e "ProfitBuy" até o início() - mainprogram.........

adicionei minha sugestão (retorno em letras BOLD) mas não sei se é correta e como é o código correto para o programa principal "start()"?

desculpe pelo meu mau inglês e toda a ajuda

muito obrigado

cumprimentos

forex2006

nulo CallBuySellProfit()

{ ProfitBuy=0;

ProfitSell=0;

CountOpenSell=0;

CountOpenBuy=0;

para (i=OrdensTotal()-1;i>=0;i--)

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

{

if (OrderType()==OP_SELL) {ProfitSell = ProfitSell + OrderProfit();CountOpenSell++;}

if (OrderType()==OP_BUY) {ProfitBuy = ProfitBuy + OrderProfit();CountOpenBuy++;}

}

ou imprimir( "Erro ao selecionar o pedido", GetLastError());

}

devolução(CondeOpenSell);

return(CondeOpenBuy);

return(ProfitSell);

return(ProfitBuy);

}

 

ajuda à programação forex2006 - operador de retorno

Olá forex2006,

Se você realmente quer aprender mql, sugeri que tentasse os tutoriais do codersguru, foi onde eu comecei. Quanto à sua pergunta, uma função vazia não pode retornar um valor, se você quiser obter valores de funções vazias, você tem que usar variáveis globais. A melhor maneira de tirar os valores é usar uma função que retorna um valor usado com parâmetros para indicar quais valores você quer. É um exemplo simples abaixo. Tente evitar o uso de variáveis globais em funções, pois isso poderia dificultar a sua vida mais tarde.

Espero que a função ajude

int start()

{

double ProfitBuy = CallBuySellProfit(OP_BUY,false);

double ProfitSell = CallBuySellProfit(OP_SELL,false);

int CountOpenBuy = CallBuySellProfit(OP_BUY,true);

int CountOpenBuySell = CallBuySellProfit(OP_SELL,true);

Comentário("ProfitBuy: "+DoubleToStr(ProfitBuy,2) +"\n "+

"ProfitSell: "+DoubleToStr(ProfitSell,2) +"\n "+

"CountOpenBuy": "+DoubleToStr(CountOpenBuy,2)+"\n "+

"CountOpenSell: "+DoubleToStr(CountOpenSell,2)+"\n "+

"");

retornar;

}

Duplo CallBuySellProfit(int iOrderType, bool bCount)

{

duplo dProfit = 0;

int iCount = 0;

para (int i=OrdensTotal()-1;i>=0;i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

{

if(OrderType()==iOrderType)

{

dProfit = dProfit + OrderProfit();

iCount++;

}

}

senão

{

Print( "Error when order select", GetLastError()));

}

}//terminar para

if(bCount)return(iCount);

caso contrário, return(dProfit);

}//termine CallBuySellProfit

 

Interromper o comércio da EA no mesmo bar

Olá, de qualquer forma para colocar código para que a EA verifique se as negociações já foram colocadas naquela barra então não colocar mais nenhuma negociação até uma nova barra?

Obrigado.

 

matrixebiz, você já considerou a possibilidade de uma abertura e fechamento comercial na mesma vela antes que a vela tenha fechado? você provavelmente deveria verificar também a lista do histórico.

Eu sempre portei esta pequena função que escrevi para todos os meus EAs, talvez você possa achá-la útil também.

bool DecideToOpenTrade()

{

int total = OrdersTotal();

if (total > 0)

{

for(int cnt=0;cnt<total;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS))

{

if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)

{

return (false);

}

}

}

}

// in case trades has already opened and closed within the candle

int histotal = OrdersHistoryTotal();

if (histotal > 0)

{

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

{

if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))

{

if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)

{

if (Time[0] <= OrderOpenTime()) // don't open a new position if we're still on the same candle

{

return (false);

}

}

}

}

}

return (true);

}

int start()

{

// some time check codes first.. blah blah

// ...

// ...

// ...

// check signals

if (Should_Buy())

{

if (DecideToOpenTrade())

{

//... trade opening codes here

}

}

if (Should_Sell())

{

if (DecideToOpenTrade())

{

//... trade opening codes here

}

}

}

nota: esta função assume que você definiu um valor único para EA_MAGIC_NUM. Dessa forma, o cheque não olhará para os negócios abertos por outros EAs.

Should_Buy() e Should_Sell() são funções que eu crio em todos os meus EAs para determinar se ocorreu um sinal de compra ou venda.

Espero que isto ajude. PM-me se você precisar de mais esclarecimentos.

cumprimentos,

Zen

 

post atualizado abaixo...

 

Isto parece estar funcionando para mim Obrigado

void DesideToOpen()

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

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

{

int total = OrdersTotal();

if (total > 0)

{

for(int cnt=0;cnt<total;cnt++)

{

if(OrderSelect(cnt,SELECT_BY_POS))

{

if(OrderComment() == EA_Name + MagicNumber) DecideToOpenTrade = false;

}

}

}

// in case trades has already opened and closed within the candle

int histotal = OrdersHistoryTotal();

if (histotal > 0)

{

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

{

if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))

{

if(OrderComment() == EA_Name + MagicNumber)

{

if (Time[0] <= OrderOpenTime()) DecideToOpenTrade = false; // don't open a new position if we're still on the same candle

}

}

}

}

}

Razão: