Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Veja este tópico: https://www.mql5.com/en/forum/178677
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!
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
}
}
}
}
}