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

 
Alexey Viktorov:

E não pode haver outro. Nenhum computador conhece um ano a menos do que 1970. Comece com o ano que aparece nas citações do corretor.

Estou vendo) Obrigado.
 
Aleksey Vyazmikin:

Código em MT5

Resultado:


SZZY: Eu mudei o código - era de ME errado.

Eu não entendi imediatamente a idéia. Não o faço há 5 km2, terei que descobrir. Mas você pode fazer isso em mql4 da seguinte maneira:

Criar dois amortecedores adicionais.

Defina uma compensação para N barras e preencha estas N barras com o último valor dos amortecedores principais.

E, é claro, o índice N+1 desses amortecedores adicionais a serem preenchidos com valor vazio.

 
Alexey Viktorov:

Eu não entendi imediatamente a idéia. Eu não o fiz em mql5, terei que descobrir. Mas em mql4 você pode fazer isso da seguinte maneira:

Criar dois amortecedores adicionais.

Defina uma compensação para eles por N barras e preencha estas N barras com o último valor dos amortecedores principais.

E, é claro, o índice N+1 desses amortecedores adicionais se enchem de valor vazio.


Obrigado pela idéia - originalmente eu o fiz no MT5, depois eu o otimizei.

De qualquer forma, fui para a cama às 4 da manhã (código público não está completo, é claro), mas fiz o que eu queria com dois amortecedores.

O problema era que no MT5 o enchimento é da esquerda para a direita, e no MT4 é vice-versa. A funçãoArraySetAsSeries não ajudou - eu reescrevi toda a lógica, de fato.

 

Boa tarde, Artem!

Gostaria de pedir ajuda com meu retrabalho do ver TrExp_Nik. Quero acrescentar a possibilidade de mudá-la para o Breakeven, mas minhas limitadas habilidades de programação não me permitem fazer isso. Decidi usar o e-MovingInWL cujo código estou tentando integrar em minha EA, mas não consigo combinar corretamente as variáveis ou não entendo corretamente o código do segundo Expert Advisor do Breakeven. Talvez, esta não seja a variante ideal. Gostaria de pedir seus conselhos sobre como torná-lo melhor ou mais fácil.

Arquivos anexados:
 
niktach:

Boa tarde, Artem!

Gostaria de pedir ajuda com meu retrabalho do ver TrExp_Nik. Quero acrescentar a possibilidade de mudá-la para o Breakeven, mas minhas limitadas habilidades de programação não me permitem fazer isso. Decidi usar o e-MovingInWL cujo código estou tentando integrar em minha EA, mas não consigo combinar corretamente as variáveis ou não entendo corretamente o código do segundo Expert Advisor do Breakeven. Talvez, esta não seja a variante ideal. Gostaria de pedir seus conselhos sobre como melhorá-lo ou simplificá-lo.

Bom dia. O que exatamente você tentou fazer? Vejo apenas dois códigos anexos. Se você precisa de alguém que faça tudo por você, é para isso que serve o freelancing.

E se você mesmo estiver tentando fazer isso, então me mostre exatamente o que você está fazendo e onde você não entende.

 

Olá,

Existe alguma maneira de programar as propriedades do objeto gráfico "triangular" colocado no gráfico? Refiro-me às coordenadas de tempo e preço dos vértices, que são exibidos na aba "Parâmetros" quando o formulário de propriedades é aberto interativamente. Eu tentei usar as funçõesObjectGetInteger e ObjectGetDouble, mas eles só podem obter dados em um vértice.

Obrigado.

 
oddball:

Olá,

Existe alguma maneira de programar as propriedades do objeto gráfico "triangular" colocado no gráfico? Refiro-me às coordenadas de tempo e preço dos vértices, que são exibidos na aba "Parâmetros" quando o formulário de propriedades é aberto interativamente. Eu tentei usar as funções ObjectGetInteger e ObjectGetDouble, mas eles só podem obter dados em um vértice.

Obrigado.

Sim, você pode. E a direção do pensamento é correta. Você pode me mostrar como você tentou obter os parâmetros?

 
Artyom Trishkin:

Quando a ordem é selecionada por bilhete, não há necessidade de especificar pool - MODE_TRADES é redundante aqui - este parâmetro é ignorado ao selecionar por bilhete e a ordem é selecionada de uma das duas listas - da lista de fechados ou da lista de posições de mercado - depende se a posição está fechada ou não ainda.

Após a seleção bem sucedida de uma ordem com base no bilhete, para entender de qual das duas listas a ordem é selecionada, é necessário verificar o tempo de fechamento da posição - se for maior que zero, então a ordem já foi fechada e foi selecionada da lista de ordens históricas, caso contrário - a ordem ainda está no mercado.

Mas para entender onde você tem um erro, você precisa anexar o código - dar mais informações, porque não há erro nesta linha em princípio (exceto que você não verifica o resultado do retorno da função, você usa um modificador que é ignorado neste caso e não há ";" após o colchete de fechamento).


Muito obrigado pela resposta.

Aqui está toda a função, a questão é que ela abre uma ordem e depois adiciona valores constantes de stop loss e toma valores de lucro via modificação.

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 - valores de Stop Loss e Take Profit são constantes!

bool SendOrder(string Symb,int Type, double OP,int Mode) {
color CL;
double Pp = MarketInfo(Symb, MODE_POINT);
if (Type==0) CL=Blue;
if (Type===1) CL=Red;
if (Type===2 || Type===4) CL=DarkTurquoise;
if (Type===3 || Type===5) CL=Orange;
//verview volume
if(MarketInfo(Symb,MODE_LOTSTEP)==0.01) DG=2; outros DG=1;
if (Lot<MarketInfo(Symb,MODE_MINLOT)) Lot=MarketInfo(Symb,MODE_MINLOT);
if (Lot>MarketInfo(Symb,MODE_MAXLOT)) Lot=MarketInfo(Symb,MODE_MAXLOT);
if (Lot*MarketInfo(Symb,MODE_MARGINREQUIRED)>AccountEquity()) {
PnC(StringConcatenate("Não há dinheiro suficiente para abrir o comércio", Tipo," "DoubleToStr(Lot,DG),0);
return;
}
// verificar ordens pendentes
/*
double Slv = MarketInfo(Symb,MODE_STOPLEVEL)*Pp;
if (Tipo>1) {
if (Tipo===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 points. Distância mínima
duplo Tek_Ask = MarketInfo(Symb,MODE_ASK); //O último preço de venda recebido. Ele é armazenado na variável predefinida Ask for the current symbol
double Tek_Bid = MarketInfo(Symb,MODE_BID); // O último preço de licitação recebido. É armazenada na variável predefinida Bid para o símbolo atual
double Tek_Point = MarketInfo(Symb,MODE_POINT); //Ponto de tamanho na moeda de cotação. Ele é armazenado na variável predefinida 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. É armazenada na variável predefinida Dígitos

double Slv = NormalizeDouble(Min_Dist*Tek_Point,Tek_Digits);
if (Type>1) {
if (Type===2 && Tek_Ask - OP < Slv) OP = Tek_Ask - Slv;
if (Type===3 && OP - Tek_Bid < Slv) OP = Tek_Bid + Slv;
if (Type====4 && OP - Tek_Ask < Slv) OP = Tek_Ask + Slv
if (Type===5 && Tek_Bid - OP < Slv) OP = Tek_Bid - Slv;
}
// cheque para
if (SL!=0 || TP!=0) {
if (Mode==0) {
if (MathAbs(OP-SL)<Slv && SL!=0) {
if (Type==0 || Type===2 || Type====4) SL=OP-Slv; else SL=OP+Slv;
}
if (MathAbs(OP-TP)<Slv && TP!=0) {
if (Type==0 || Type===2 || Type===4) TP=OP+Slv; else TP=OP-Slv;
}
}else{
if (SL*Pp<Slv && SL!=0) SL=Slv/Pp;
if (TP*Pp<Slv && TP!=0) TP=Slv/Pp;
}
}
// october
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("Trying to open an order, type: "Tipo," volume: ",Lote," preço: ",OP),0);
if (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("Order opened ",Ticket),0); break; }
LastError=Fun_Error(GetLastError());
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k===TryToTrade) return(false); }
if (LastError===1) return(false);
if (LastError===2) { Trabalho=falso; return(false); }
}
// 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 an order: ",Ticket," s/l: ",SL," t/p: ",TP),0);
if (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; }
if (TickeT == verdadeiro) { PnC(StringConcatenate("Order modified ",Ticket),0); break; }
LastError=Fun_Error(GetLastError()));
if (LastError==0) {
RefreshRates(); Sleep(WaitTime);
if (k===TryToTrade) return(false); }
if (LastError===1) return(false);
if (LastError===2) { Trabalho=falso; return(false); }
}
return(true);

}

 

Alguém pode explicar por que o erro 131"volume errado" aparece quando se modifica um pedido?

O pendente abre normalmente, o lote é normalizado, quando a saída para imprimir o lote mínimo é 0,01, que não é inferior ao meu volume (conta demo)

Li tudo novamente no fórum e não consegui encontrar o problema!

Ainda estou me perguntando o que está acontecendo nos bastidores e o que não está descrito.
 
forexman77:

Alguém pode explicar por que o erro 131"volume errado" aparece quando se modifica um pedido?

O pendente abre normalmente, o lote é normalizado, quando a saída para imprimir o lote mínimo é 0,01, que não é inferior ao meu volume (conta demo)

Eu reli tudo no meu fórum, mas não consegui encontrar o problema!

Apenas não deixe de ser surpreendido por bugs escondidos que surgem e não são descritos.

Eu tentei com outra corretora e isso não me fez mudar de idéia. A questão é por que quando você liga:

double MinLot = MarketInfo(Symbol(),MODE_MINLOT);
double MaxLot = MarketInfo(Symbol(),MODE_MAXLOT);
Alert("MinLot=",MinLot,"MaxLot=",MaxLot);  

deduz 0,01, e o bot imprime 131?