Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 307

 
forexman77:

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.

 
Artyom Trishkin:

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.
 
forexman77:

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.

 
rabanik:

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 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!!!
 
rabanik:
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?

 if (Digits==3||Digits==5) {sl=SL*10*Point;}
         else if (Digits==4||Digits==2) {sl=SL*Point;}
            if (OrdersTotal()==0)
              {
                if (Close[1]>TD2)
                OrderSend (Symbol(),OP_BUY,Lot,Ask,10,Ask-sl,0,NULL,Magic,0,clrBlue);
                else if (Close[1]<TD1)
                OrderSend (Symbol(),OP_SELL,Lot,Bid,10,Bid+sl,0,NULL,Magic,0,clrRed);
              }
 
6737998:

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.

Оператор возврата return - Операторы - Основы языка - Справочник MQL4
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
  • docs.mql4.com
Оператор возврата return - Операторы - Основы языка - Справочник MQL4
 
danil77783:

Olá. A questão é a seguinte: a EA não abre um comércio de venda. Você pode dar uma olhada?

O que é TD1 e onde lhe é atribuído um valor?
 

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.