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
Prezado MLaden,
Próximo indi, posso entrar no gráfico em minha conta Live e na demonstração da Markets.com (CFD's). Ou há um problema para colocá-lo no gráfico da Liquid Markets em demonstração. Como a Liquid oferece várias opções de instrumentos (particularmente Futuros no MT4), eu gostaria de tê-lo no gráfico nessa plataforma. Você pode ver um problema levantando esta questão, porque eu não consigo encontrar.
Thx MarcoÉ provavelmente devido ao fato de que esse indicador é um indicador descompilado. De construir 500 metarader impede que tais indicadores sejam compilados
É provavelmente devido ao fato de que esse indicador é um indicador descompilado. De construir 500 metarader impede que tais indicadores sejam compilados
Olá MLaden,
Thx, mas estranho porque todas as plataformas MT4 dos corretores que eu uso, são a versão 500.
Cumprimentos ao Marco
Tenho um EA no qual gostaria de utilizar a função de tomada parcial de lucro. Eu codifiquei esta função e uma vez que ela funciona bem, outras vezes não. Não consegui descobrir qual é o problema...
Querido Mladen ou MrTools, você poderia ter a gentileza de investigar o código e me dar um conselho sobre como eu poderia encontrar o bug e resolver a função de tomada parcial de lucros?
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int signal;
CheckOrders();
int numTrades = GetNumTickets();
signal = CheckSignal();
if (signal == OP_BUY)
{
OpenBuy();
lasttime = TimeCurrent();
}
if (signal == OP_SELL)
{
OpenSell();
lasttime = TimeCurrent();
}
return;
}
// +----------------------------------------------------------------------------+
// | Order checking function
// +----------------------------------------------------------------------------+
void CheckOrders()
{
int typ,i,cnt,ticket;
int Mv1 = 0;
int SL1 = 0;
int Mv2 = 0;
int SL2 = 0;
int Mv3 = 0;
int id;
double PipDist, CLots, buy_nextTP, sell_nextTP;
cnt = OrdersTotal();
for (i=cnt-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
typ = OrderType();
//
if (typ == OP_BUY)
{
if (TrailingStopLoss)
{
if (AdjTrailOnAllOrders(2, buy_Trailpips, Magic, typ, Mv1, SL1, Mv2, SL2, Mv3) == false)
Alert("Scalp_RSI: Modifying BUY order failed!");
}
PipDist = (NormalizeDouble(Bid,Digits) - NormalizeDouble(OrderOpenPrice(),Digits));
PipDist = MathFloor(PipDist/myPoint);
}
if (typ == OP_SELL)
{
if(TrailingStopLoss)
{
if (AdjTrailOnAllOrders(2, sell_Trailpips, Magic, typ, Mv1, SL1, Mv2, SL2, Mv3) == false)
Alert("Scalp_RSI: Modifying SELL order failed!");
}
PipDist = (NormalizeDouble(OrderOpenPrice(),Digits) - NormalizeDouble(Ask,Digits));
PipDist = MathFloor(PipDist/myPoint);
}
if (TakePartialProfit == true && PartCloseLots > 0)
{
if (UseMoneyMgmt != 1) Lotsi = Lots;
CLots = NormalizeDouble(Lotsi * PartCloseLots/100,Decimals); // Computing lots to close
if (CLots < MarketInfo(Symbol(), MODE_MINLOT))
CLots = MarketInfo(Symbol(), MODE_MINLOT);
PartialTP(PipDist,OrderTicket(),CLots);
}
}
}
}
}
//+------------------------------------------------------------------+
//| PartialTP - i.e. TakePartialProfit function
//+------------------------------------------------------------------+
void PartialTP(int pipsval, int ticket, double CLots) //
{
int gle;
int loopcount = 0;
string bER;
string myInfo = "PartialTP";
if(OrderSelect(ticket, SELECT_BY_TICKET)==true)
{
if (OrderType() == OP_BUY)
{
if ((pipsval >= buy_PartialTP) && (pipsval < buy_TakeProfit+1)) //
{
while(true)
{
OrderClose(ticket,CLots,Bid,3,YellowGreen);
gle=GetLastError();
bER=" error="+gle+" "+ErrorDescription(gle);
if(gle==0 || gle==1)
{
logwrite(TradeComment,"CLOSE BUY "+myInfo+ " " + CLots + " at Bid= " + Bid);
buy_PartialTP = buy_TakeProfit+1; //
break;
}
else
{
logwrite(TradeComment,"---ERROR--- CLOSE BUY "+myInfo+bER+ " " + CLots + " at Bid= " + Bid);
RefreshRates();
Sleep(500);
}
loopcount++;
if(loopcount>maxloop)
{
logwrite(TradeComment,"---ERROR--- Giving up on closing BUY order");
return(gle);
}
}
}
}
if (OrderType() == OP_SELL) //
{
if ((pipsval >= sell_PartialTP) && (pipsval < sell_TakeProfit)) //
{
while(true)
{
OrderClose(ticket,CLots,Ask,3,YellowGreen);
gle=GetLastError();
bER=" error="+gle+" "+ErrorDescription(gle);
if(gle==0 || gle==1)
{
logwrite(TradeComment,"CLOSE SELL "+myInfo+ " " + CLots + " at Ask= " + Ask);
sell_PartialTP = sell_TakeProfit; //
break;
}
else
{
logwrite(TradeComment,"---ERROR--- CLOSE SELL "+myInfo+bER+ " " + CLots + " at Ask= " + Ask);
RefreshRates();
Sleep(500);
}
loopcount++;
if(loopcount>maxloop)
{
logwrite(TradeComment,"---ERROR--- Giving up on closing SELL order");
return(gle);
}
}
}
}
} else {
gle=GetLastError();
bER=" Error="+gle+" "+ErrorDescription(gle);
if (gle != 0 || gle!=1)
{
logwrite(TradeComment,"---ERROR--- in selecting order in PartialTP function "+bER);
}
}
}
//+------------------------------------------------------------------+
//| Get number of open trades
//+------------------------------------------------------------------+
int GetNumTickets()
{
int i;
int typ;
numTickets = 0;
for (i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
typ = OrderType();
if (typ == OP_BUY || typ == OP_SELL)
{
numTickets ++;
}
}
}
}
return (numTickets);
}
//+------------------------------------------------------------------+
//| Get signal
//+------------------------------------------------------------------+
int CheckSignal()
{
return (SignalScalp());
}
//+------------------------------------------------------------------+
//| Get scalp signal
//+------------------------------------------------------------------+
int SignalScalp()
{
int signal=6; //
if (enable_buy){
// Buy-Condition
{
signal = OP_BUY;
}
}
//
//
if (enable_sell){
// Sell-Condition
{
signal = OP_SELL;
}
}
//
//
//
return(signal);
}
//-----
// +----------------------------------------------------------------------------+
// | Buy Order
// +----------------------------------------------------------------------------+
void OpenBuy()
{
int gle = 0;
int ticket = 0;
double SL = 0;
double TP = 0;
double LotsB = Lots; //GetLots();
int loopcount = 0;
while(true)
{
ticket=OrderSend(Symbol(),OP_BUY,LotsB,Ask,Slippage,0,0,TradeComment,Magic,White);
}
}
// +----------------------------------------------------------------------------+
// | Sell Order
// +----------------------------------------------------------------------------+
void OpenSell()
{
int gle = 0;
int ticket = 0;
double SL = 0;
double TP = 0;
double LotsS = Lots;
int loopcount = 0;
while(true)
{
ticket=OrderSend(Symbol(),OP_SELL,LotsS,Bid,Slippage,0,0,TradeComment,Magic,Red);
}
}
bool AdjTrailOnAllOrders(
int TrailType,
int TrailPips,
int Magic,
int Direction,
int FirstMove,
int FirstStopLoss,
int SecondMove,
int SecondStopLoss,
int ThirdMove)
{
double retValue;
return(retValue);
}
//+------------------------------------------------------------------+
//| SetComment function
//+------------------------------------------------------------------+
void SetComment(string s) { TradeComment = s; }
// +----------------------------------------------------------------------------+
// | Pip setting
// +----------------------------------------------------------------------------+
double SetPoint()
{
double mPoint;
return(mPoint);
}
// +----------------------------------------------------------------------------+
// | Log write function
// +----------------------------------------------------------------------------+
void logwrite (string filename, string mydata)
{
int myhandle;
}
Tenho um EA no qual gostaria de utilizar a função de tomada parcial de lucro. Eu codifiquei esta função e uma vez que ela funciona bem, outras vezes não. Não consegui descobrir qual é o problema...
Querido Mladen ou MrTools, você poderia ter a gentileza de investigar o código e me dar um conselho sobre como eu poderia encontrar o bug e resolver a função de tomada parcial?
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int signal;
CheckOrders();
int numTrades = GetNumTickets();
signal = CheckSignal();
if (signal == OP_BUY)
{
OpenBuy();
lasttime = TimeCurrent();
}
if (signal == OP_SELL)
{
OpenSell();
lasttime = TimeCurrent();
}
return;
}
// +----------------------------------------------------------------------------+
// | Order checking function
// +----------------------------------------------------------------------------+
void CheckOrders()
{
int typ,i,cnt,ticket;
int Mv1 = 0;
int SL1 = 0;
int Mv2 = 0;
int SL2 = 0;
int Mv3 = 0;
int id;
double PipDist, CLots, buy_nextTP, sell_nextTP;
cnt = OrdersTotal();
for (i=cnt-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
typ = OrderType();
//
if (typ == OP_BUY)
{
if (TrailingStopLoss)
{
if (AdjTrailOnAllOrders(2, buy_Trailpips, Magic, typ, Mv1, SL1, Mv2, SL2, Mv3) == false)
Alert("Scalp_RSI: Modifying BUY order failed!");
}
PipDist = (NormalizeDouble(Bid,Digits) - NormalizeDouble(OrderOpenPrice(),Digits));
PipDist = MathFloor(PipDist/myPoint);
}
if (typ == OP_SELL)
{
if(TrailingStopLoss)
{
if (AdjTrailOnAllOrders(2, sell_Trailpips, Magic, typ, Mv1, SL1, Mv2, SL2, Mv3) == false)
Alert("Scalp_RSI: Modifying SELL order failed!");
}
PipDist = (NormalizeDouble(OrderOpenPrice(),Digits) - NormalizeDouble(Ask,Digits));
PipDist = MathFloor(PipDist/myPoint);
}
if (TakePartialProfit == true && PartCloseLots > 0)
{
if (UseMoneyMgmt != 1) Lotsi = Lots;
CLots = NormalizeDouble(Lotsi * PartCloseLots/100,Decimals); // Computing lots to close
if (CLots < MarketInfo(Symbol(), MODE_MINLOT))
CLots = MarketInfo(Symbol(), MODE_MINLOT);
PartialTP(PipDist,OrderTicket(),CLots);
}
}
}
}
}
//+------------------------------------------------------------------+
//| PartialTP - i.e. TakePartialProfit function
//+------------------------------------------------------------------+
void PartialTP(int pipsval, int ticket, double CLots) //
{
int gle;
int loopcount = 0;
string bER;
string myInfo = "PartialTP";
if(OrderSelect(ticket, SELECT_BY_TICKET)==true)
{
if (OrderType() == OP_BUY)
{
if ((pipsval >= buy_PartialTP) && (pipsval < buy_TakeProfit+1)) //
{
while(true)
{
OrderClose(ticket,CLots,Bid,3,YellowGreen);
gle=GetLastError();
bER=" error="+gle+" "+ErrorDescription(gle);
if(gle==0 || gle==1)
{
logwrite(TradeComment,"CLOSE BUY "+myInfo+ " " + CLots + " at Bid= " + Bid);
buy_PartialTP = buy_TakeProfit+1; //
break;
}
else
{
logwrite(TradeComment,"---ERROR--- CLOSE BUY "+myInfo+bER+ " " + CLots + " at Bid= " + Bid);
RefreshRates();
Sleep(500);
}
loopcount++;
if(loopcount>maxloop)
{
logwrite(TradeComment,"---ERROR--- Giving up on closing BUY order");
return(gle);
}
}
}
}
if (OrderType() == OP_SELL) //
{
if ((pipsval >= sell_PartialTP) && (pipsval < sell_TakeProfit)) //
{
while(true)
{
OrderClose(ticket,CLots,Ask,3,YellowGreen);
gle=GetLastError();
bER=" error="+gle+" "+ErrorDescription(gle);
if(gle==0 || gle==1)
{
logwrite(TradeComment,"CLOSE SELL "+myInfo+ " " + CLots + " at Ask= " + Ask);
sell_PartialTP = sell_TakeProfit; //
break;
}
else
{
logwrite(TradeComment,"---ERROR--- CLOSE SELL "+myInfo+bER+ " " + CLots + " at Ask= " + Ask);
RefreshRates();
Sleep(500);
}
loopcount++;
if(loopcount>maxloop)
{
logwrite(TradeComment,"---ERROR--- Giving up on closing SELL order");
return(gle);
}
}
}
}
} else {
gle=GetLastError();
bER=" Error="+gle+" "+ErrorDescription(gle);
if (gle != 0 || gle!=1)
{
logwrite(TradeComment,"---ERROR--- in selecting order in PartialTP function "+bER);
}
}
}
//+------------------------------------------------------------------+
//| Get number of open trades
//+------------------------------------------------------------------+
int GetNumTickets()
{
int i;
int typ;
numTickets = 0;
for (i = OrdersTotal()-1; i >= 0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
typ = OrderType();
if (typ == OP_BUY || typ == OP_SELL)
{
numTickets ++;
}
}
}
}
return (numTickets);
}
//+------------------------------------------------------------------+
//| Get signal
//+------------------------------------------------------------------+
int CheckSignal()
{
return (SignalScalp());
}
//+------------------------------------------------------------------+
//| Get scalp signal
//+------------------------------------------------------------------+
int SignalScalp()
{
int signal=6; //
if (enable_buy){
// Buy-Condition
{
signal = OP_BUY;
}
}
//
//
if (enable_sell){
// Sell-Condition
{
signal = OP_SELL;
}
}
//
//
//
return(signal);
}
//-----
// +----------------------------------------------------------------------------+
// | Buy Order
// +----------------------------------------------------------------------------+
void OpenBuy()
{
int gle = 0;
int ticket = 0;
double SL = 0;
double TP = 0;
double LotsB = Lots; //GetLots();
int loopcount = 0;
while(true)
{
ticket=OrderSend(Symbol(),OP_BUY,LotsB,Ask,Slippage,0,0,TradeComment,Magic,White);
}
}
// +----------------------------------------------------------------------------+
// | Sell Order
// +----------------------------------------------------------------------------+
void OpenSell()
{
int gle = 0;
int ticket = 0;
double SL = 0;
double TP = 0;
double LotsS = Lots;
int loopcount = 0;
while(true)
{
ticket=OrderSend(Symbol(),OP_SELL,LotsS,Bid,Slippage,0,0,TradeComment,Magic,Red);
}
}
bool AdjTrailOnAllOrders(
int TrailType,
int TrailPips,
int Magic,
int Direction,
int FirstMove,
int FirstStopLoss,
int SecondMove,
int SecondStopLoss,
int ThirdMove)
{
double retValue;
return(retValue);
}
void SetComment(string s) { TradeComment = s; }
double SetPoint()
{
double mPoint;
return(mPoint);
}
void logwrite (string filename, string mydata)
{
int myhandle;
}
christoff
Não consigo ver que valor você está usando para a variável "Decimais", mas provavelmente essa é a causa de seu problema. A parte resultante da ordem tem que estar de acordo com o valor da etapa do lote também (ou seja: se a etapa do lote for 0,1, por exemplo, você não pode tentar fechar 0,11 lotes). Verifique qual é o último erro após o fechamento partical que não está ocorrendo (você pode fazer isso simplesmente adicionando um comentário após linhas que vão como esta :
bER=" error="+gle+" "+ErrorDescription(gle);
if (gle>1) Comentário(bER);
uma vez que a função logwrite no código não está operativa
Mladen,
Obrigado pela resposta.
Bem, eu encurtei o código porque não há possibilidade de um cargo ter mais de 10.000 caracteres. Portanto, no código original a variável Decimals está no init() da seguinte forma:
LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
if(LotStep == 0.01) {Decimals = 2;}
if(LotStep == 0.1) {Decimals = 1;}
if(LotStep == 1) {Decimals = 0;}[/PHP]
Yes, logwrite function is not functionable in the code posted, also because of the shortening. Normally it looks like:
[PHP]
void logwrite (string filename, string mydata)
{
int myhandle;
string wcalend=TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS);
Print(mydata+" "+wcalend);
if(IsTesting()) return(0);
myhandle=FileOpen(Symbol()+"_"+filename, FILE_CSV|FILE_WRITE|FILE_READ, ";");
if(myhandle>0)
{
FileSeek(myhandle,0,SEEK_END);
FileWrite(myhandle, mydata+" "+wcalend);
FileClose(myhandle);
}
}Portanto, não creio que o problema surja por causa da variável Decimais.
Mladen,
Obrigado pela resposta.
Bem, eu encurtei o código porque não há possibilidade de um cargo ter mais de 10.000 caracteres. Portanto, no código original a variável Decimals está no init() como segue:
LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
if(LotStep == 0.01) {Decimals = 2;}
if(LotStep == 0.1) {Decimals = 1;}
if(LotStep == 1) {Decimals = 0;}[/PHP]
Yes, logwrite function is not functionable in the code posted, also because of the shortening. Normally it looks like:
[PHP]
void logwrite (string filename, string mydata)
{
int myhandle;
string wcalend=TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS);
Print(mydata+" "+wcalend);
if(IsTesting()) return(0);
myhandle=FileOpen(Symbol()+"_"+filename, FILE_CSV|FILE_WRITE|FILE_READ, ";");
if(myhandle>0)
{
FileSeek(myhandle,0,SEEK_END);
FileWrite(myhandle, mydata+" "+wcalend);
FileClose(myhandle);
}
}Christoff
Dessa forma a variável Decimals deve estar OK
Em qualquer caso, verifique qual código de erro você está recebendo em um caso de fechamento (parcial) sem sucesso do pedido
Vejo que você não está usando o número mágico, então a suposição é que não importa qual é o número mágico ou símbolo. Nesse caso, verifique primeiro se já existe uma ordem aberta - como esta :
{
ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0);
stop=(Ask-stopsize*Point);
prof=(Ask+profsize*Point);
OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);
}
Obrigado mladen.
se (OrdensTotal()<1
Tinha resolvido meu problema.
Ela Total pode pedir uma, mas eu quero que cada par de moedas possa abrir.
Desculpe-me pelo mal-entendido.
Mas eu quero dizer que em cada par execute uma ordem e pare. Exemplo:
Agora eu abro uma ordem em EURUSD e executo apenas uma ordem. Então outras moedas também podem abrir ao mesmo tempo executar uma ordem. Sinto muito com meu pobre inglês.
-----------------------------------------------------------------
Obrigado.
Obrigado mladen.
se (OrdensTotal()<1
Tinha resolvido meu problema.
Ela Total pode pedir uma, mas eu quero que cada par de moedas possa abrir.
Desculpe-me pelo mal-entendido.
Mas eu quero dizer que em cada par execute uma ordem e pare. Exemplo:
Agora eu abro uma ordem em EURUSD e executo apenas uma ordem. Então outras moedas também podem abrir ao mesmo tempo executar uma ordem. Sinto muito com meu pobre inglês.
-----------------------------------------------------------------
Obrigado.
hock87
Adicione isto :
for (int i=0; i <= OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol() == Symbol())
TotalOrders++;
}
antes da linha if (OrderTotal()<1) e substitua essa linha por if (TotalOrders<1). Dessa forma, somente uma ordem aberta por símbolo será permitida
Muito obrigado, mladen.
Tento agora.
Obrigado mladen.
se (OrdensTotal()<1
Tinha resolvido meu problema.
Ela Total pode pedir uma, mas eu quero que cada par de moedas possa abrir.
Desculpe-me pelo mal-entendido.
Mas eu quero dizer que em cada par execute uma ordem e pare. Exemplo:
Agora eu abro uma ordem em EURUSD e executo apenas uma ordem. Então outras moedas também podem abrir ao mesmo tempo executar uma ordem. Sinto muito com meu pobre inglês.
-----------------------------------------------------------------
Obrigado.
hock87
Por favor, leia o post acima de seu post para uma solução desse problema
O código completo para isso é o seguinte :
int TotalOrders = 0;
for (int i=0; i <= OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
if (OrderSymbol() == Symbol())
TotalOrders++;
}
if (TotalOrders<1)
{
ticket=OrderSend(Symbol(), OP_BUY, lots, Ask, 3, 0, 0);
stop=(Ask-stopsize*Point);
prof=(Ask+profsize*Point);
OrderModify( ticket, OrderOpenPrice(), stop, prof, 0, Blue);
}