Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 307
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
Experimentei em outro CD e parece estar tudo bem. A questão é por que a chamada:
produz 0,01, mas imprime 131 no bot?
Os lotes precisam ser normalizados quando passam para a função.
Muitas coisas precisam ser normalizadas quando são transferidas para a função.
Na verdade, eu escrevi que estava normalizando. Há um limite para o número de lotes em auto-comercialização.
Você não precisa ser o Capitão Óbvio aqui.Na verdade, eu escrevi que estava normalizando. Há algum tipo de limite para o número de lotes no comércio de automóveis.
Não fique todo Capitão Óbvio aqui.Bem, procure por si mesmo, se é assim que você quer se comunicar.
Muito obrigado pela resposta.
Aqui está toda a função, a questão é que ela abre uma ordem e depois adiciona uma parada de perda constante e assume valores de lucro através de modificações.
A ordem é aberta, mas não se param as perdas e não se tira lucro (a função de cálculo em vermelho, na qualOrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES) dá um erro ((() )
//Open Order function, variables: symbol, order type, lot, open price, TP and SL calculation method (0 - set in the price, 1 - set in points that should be calculated from the open price), stop loss, take profit)
//Symbol/Pair, tipo de ordem aberta - pendente, preço aberto, switch = 1, SL B TP - stop loss e take profit values são constantes!
bool SendOrder(string Symb,int Type, double OP,int Mode) {
cor CL;
double Pp = MarketInfo(Symb,MODE_POINT);
se (Tipo==0) CL=azul;
se (Tipo===1) CL=Red;
if (Type===2 || Type===4) CL=DarkTurquoise;
if (Type===3 || Type===5) CL=Orange;
//verificação do volume
if(MarketInfo(Symb,MODE_LOTSTEP)==0,01) DG=2; else DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lote>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lote*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Não há dinheiro suficiente para abrir o comércio",Tipo," volume: ",DoubleToStr(Lot,DG)),0);
retornar;
}
// verificar ordens pendentes
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
se (Tipo>1) {
if (Type===2 && MarketInfo(Symb,MODE_ASK)-OP<Slv) OP=MarketInfo(Symb,MODE_ASK)-Slv;
if (Type===3 && OP-MarketInfo(Symb,MODE_BID)<Slv) OP=MarketInfo(Symb,MODE_BID)+Slv;
if (Type===4 && OP-MarketInfo(Symb,MODE_ASK)<Slv) OP=MarketInfo(Symb,MODE_ASK)+Slv;
if (Type===5 && MarketInfo(Symb,MODE_BID)-OP<Slv) OP=MarketInfo(Symb,MODE_BID)-Slv;
}
*/
RefreshRates();
int Min_Dist = MarketInfo(Symb,MODE_STOPLEVEL); //Limit stop loss/stake profit level in pips. Distância mínima
duplo Tek_Ask = MarketInfo(Symb,MODE_ASK); //Último preço comercial recebido. É armazenado na variável pré-definida Solicitar o símbolo atual
double Tek_Bid = MarketInfo(Symb,MODE_BID); //O último preço de licitação recebido. É armazenado na variável pré-definida Bid para o símbolo atual
duplo Tek_Point = MarketInfo(Symb,MODE_POINT); //Ponto de tamanho na moeda de cotação. É armazenado na variável pré-definida Ponto para o símbolo atual
int Tek_Digits = MarketInfo(Symb,MODE_DIGITS);// O número de dígitos após o ponto decimal no preço do símbolo. Para o símbolo atual ele é armazenado na variável Dígitos pré-definidos
Slv duplo = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
se (Tipo>1) {
se (Type===2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type===3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
se (Type===4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv;
if (Type===5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// paradas de verificação
se (SL!=0 ||| TP!=0) {
se (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (Type==0 || Type===2 || Type===4) SL=OP-Slv; caso contrário SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
se (Tipo==0 || Tipo===2 || Tipo===4) TP=OP+Slv; caso contrário TP=OP-Slv;
}
}else{
se (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
se (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
//abertura
for(int k=0;k<=TryToTrade;k++) {
if (Type==0) OP=MarketInfo(Symb,MODE_ASK);
if (Type===1) OP=MarketInfo(Symb,MODE_BID);
PnC(StringConcatenate("Tentativa de abrir um pedido, tipo:",Tipo," volume:",Lote," preço:",OP),0);
se (IsTradeAllowed()) {
int Ticket=OrderSend(Symb,Type,Lot,NormalizeDouble(OP,MarketInfo(Symb,MODE_DIGITS)),3,0,0,NULL,Tek_Magic,0,CL);
}else{ PnC(StringConcatenate("Cannot open order ",k),0); Sleep(3000); continue; }
if (Ticket >= 0) { PnC(StringConcatenate("Ordem aberta ",Ticket),0); pausa; }
LastError=Fun_Error(GetLastError()));
se (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
se (LastError===1) retornar(falso);
if (LastError===2) { Trabalho=falso; retorno(falso); }
}
// set stops
OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES);
if (SL==0 && TP==0) return;
if (Mode===1) {
if (SL!=0) {
if (Type==0 || Type===2 || Type===4) SL=OrderOpenPrice()-SL*Pp;
if (Type===1 || Type===3 || Type===5) SL=OrderOpenPrice()+SL*Pp;
}
if (TP!=0) {
if (Type==0 || Type===2 || Type===4) TP=OrderOpenPrice()+TP*Pp;
if (Type===1 || Type===3 || Type===5) TP=OrderOpenPrice()-TP*Pp;
}
}
for(k=0;k<=TryToTrade;k++) {
PnC(StringConcatenate("Trying to set stops on order: ",Ticket," s/l: ",SL," t/p: ",TP),0);
se (IsTradeAllowed()) {
//TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(Symb,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
TickeT=OrderModify(Ticket,NormalizeDouble(OrderOpenPrice(),MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(SL,MarketInfo(Symb,MODE_DIGITS)),NormalizeDouble(TP,MarketInfo(Symb,MODE_DIGITS)),0,CLR_NONE);
}else{ PnC(StringConcatenate("Não é possível modificar a ordem ",k),0); Sleep(3000); continue; }
se (TickeT == verdadeiro) { PnC(StringConcatenate("Pedido modificado ",Ticket),0); pausa; }
LastError=Fun_Error(GetLastError()));
se (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k==TryToTrade) return(false); }
se (LastError===1) retornar(falso);
if (LastError===2) { Trabalho=falso; retorno(falso); }
}
retorno(true);
}
Agora aqui está o próximo erro na linhase (Type==0 || Type===2 || Type===4) SL=OrderOpenPrice()-SL*Pp;. A função OrderOpenPrice() retorna o mesmo erro - A expressão não pôde ser avaliada. Que bagunça!!!
Está tudo ordenado. Desculpe a pergunta tola. Eu tenho uma variável principal SL do tipo int.
E eu estou tentando conseguir SL com tipo duplo novamente. Mas o sistema retorna 1.
Obrigado.
Qualquer pessoa pode sugerir como fazer um EA funcionar de um determinado lugar de volta ao seu início, sem continuar a executar outros operadores.
Olá. A questão é a seguinte: a EA não está abrindo um comércio de venda. Você pode dar uma olhada?
Qualquer pessoa pode sugerir como fazer um EA funcionar de um determinado lugar de volta ao seu início, sem continuar a executar outros operadores.
Olá. A questão é a seguinte: a EA não abre um comércio de venda. Você pode dar uma olhada?
Amigos, como sair desta situação corretamente... O indicador desenha duas linhas horizontais do CSV (Vermelho - do início ao fim do dia) Azul - Viga vinda dos últimos dias, com diferentes níveis de preço. Mas há dias em que estes níveis têm o mesmo valor/preço. Qual é o caminho certo para sair desta situação, de modo que quando as linhas coincidem, o Ray(Azul) é exibido, e a linha Vermelha não é visível no gráfico, mas está fisicamente presente... ou seja, é transparente.
Agora - Draw_Level("Red", vermelho, DRAW_NONE, STYLE_SOLID,0); deixa de desenhar a linha, mas o Raio também não é visível de baixo dela. Obrigado.