Você pode me dizer onde está o erro - não consigo encontrá-lo. Eu já reescrevi o código de modificação do pedido e o erro permanece. Sublinho que o erro não é do registro - não há um único erro no registro. Encontrei o erro nos Resultados enquanto executava um teste. Exemplo: Eu abri posição de compra (ordem número 1) com preço 1,4654 então em Resultados diz modificar (ordem número 1) preço 1,4654 e TakeProfit 1,4752 então em Resultados diz fechar (ordem número 1) preço 1,4704 e TakeProfit 1,4752 Lucro = 50,00
Exemplo de posição deficitária embora eu deva fechar somente em TakeProfit porque eu não defini Stop Loss. Eu abri uma posição de compra (número de ordem 271) a 1.4820 e nos Resultados diz modificar (número de ordem 271) preço 1.4820 e TakeProfit 1.4918 e nos Resultados diz fechar (número de ordem 1) preço 1.4737 e TakeProfit 1.4918 Lucro = - 83.46
Coloquei um TakeProfit de 100 em todos os lugares.
Eu não defini o StopLoss.
Eu não sei como consertá-lo.
Ao compilar este código EA = 0 erros e 0 avisos.
Eu usei este código para Modificar Ordens:
//| Описание : Модификация ордера. Версия функции для тестов на истории. |//+----------------------------------------------------------------------------+//| Параметры: |//| pp - цена открытия позиции, установки ордера |//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//| ex - дата истечения |//+----------------------------------------------------------------------------+void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
int dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
double op=NormalizeDouble(OrderOpenPrice() , dg);
double os=NormalizeDouble(OrderStopLoss() , dg);
double ot=NormalizeDouble(OrderTakeProfit(), dg);
color cl;
if (pp<=0) pp=OrderOpenPrice();
if (sl<0 ) sl=OrderStopLoss();
if (tp<0 ) tp=OrderTakeProfit();
pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
if (pp!=op || sl!=os || tp!=ot) {
if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
er=GetLastError();
Print("Error(",er,") modifying order: ",Error(error_code));
Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
" op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
}
}
}
alex12: Você pode me dizer onde está o erro - eu não consigo encontrá-lo. Eu já reescrevi o código de modificação do pedido e o erro permanece. Sublinho que o erro não é do registro - não há um único erro no registro. Encontrei o erro nos resultados durante o teste. Exemplo: Eu abri uma posição de compra (número de pedido 1) em 1.4654 Em seguida, nos Resultados diz comprar (pedido número 1) preço 1,4654 e TakeProfit 1,4752. Em seguida, nos Resultados diz fechar (pedido número 1) preço 1,4704 e TakeProfit 1,4752 Lucro = 50,00
Um exemplo de uma posição perdedora, embora eu deva fechar apenas em Take Profit porque não defini Stop Loss. Eu abri uma posição de compra (número de pedido 271) a 1.4820 Em seguida, nos Resultados diz modificar (número de pedido 271) preço 1.4820 e TakeProfit 1.4918 em seguida, diz preço de fechamento (pedido número 1) 1,4737 e TakeProfit 1,4918 nos Resultados Lucro = - 83,46
Eu defini o TakeProfit como 100 em todos os lugares.
Eu não defini o StopLoss.
Eu não sei como consertá-lo.
Ao compilar este código EA = 0 erros e 0 avisos.
Eu usei este código para Modificar Ordens:
Ao fechar negócios no testador é escrito como mostrado aqui, é muito provável que seja o resultado da função de fechamento do pedido (TP e SL não têm nada a ver com isso)
Mas como "pegar" o último máximo e mínimo no bar anterior?
Você só precisa memorizar o máximo e mínimo alcançado na barra atual, e quando uma nova barra aparece e se torna a barra anterior, você irá tirar o máximo e mínimo das variáveis memorizadas.
Basta lembrar o máximo e o mínimo alcançados na barra atual, e quando uma nova barra aparecer e se tornar a barra anterior, você tirará o máximo e o mínimo das variáveis lembradas.
Mas como? Suponha que atribuímos um valor máximo à variável Z e uma nova barra aparece (que pode ser verificada) e Z é imediatamente atribuído um novo valor, enquanto o valor (Z-1) é "perdido". Provavelmente, deve haver alguma verificação ao atribuir um novo valor a Z (que pode ser uma nova barra aparece), eu confio em seu profissionalismo e paciência! Obrigado por seus esforços.
declarar a variável zet como estática, ou declará-la na zona global.
Antes de atribuir-lhe um novo valor, verifique a existência de uma nova barra, e verifique a diferença entre seu valor e o valor atual, e depois atribua-lhe um novo valor.
smshev: Ao fechar negócios no testador é escrito como você listou, é muito provável que seja o resultado da função de fechamento do pedido (TP e SL não têm nada a ver com isso)
Obrigado, mas parece não haver erros no código:
int CloseOrder(int ticket, double lots)
{
int err,i1;
double price;
OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
while(i1<10)
{
RefreshRates();
if (OrderType()==0)price=Bid;
if (OrderType()==1)price=Ask;
if (OrderType()>1){OrderDelete(ticket);return(0);}
OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
err = GetLastError();
if (err == 0) break;
Print(WindowExpertName(),Symbol(),Error(err)," при закрытии ордера");
Sleep(100);
i1++;
}
return(0);
}
Eu já reescrevi o código de modificação do pedido e o erro permanece.
Sublinho que o erro não é do registro - não há um único erro no registro.
Encontrei o erro nos Resultados enquanto executava um teste.
Exemplo:
Eu abri posição de compra (ordem número 1) com preço 1,4654
então em Resultados diz modificar (ordem número 1) preço 1,4654 e TakeProfit 1,4752
então em Resultados diz fechar (ordem número 1) preço 1,4704 e TakeProfit 1,4752
Lucro = 50,00
Exemplo de posição deficitária embora eu deva fechar somente em TakeProfit porque eu não defini Stop Loss.
Eu abri uma posição de compra (número de ordem 271) a 1.4820
e nos Resultados diz modificar (número de ordem 271) preço 1.4820 e TakeProfit 1.4918
e nos Resultados diz fechar (número de ordem 1) preço 1.4737 e TakeProfit 1.4918
Lucro = - 83.46
Coloquei um TakeProfit de 100 em todos os lugares.
Eu não defini o StopLoss.
Eu não sei como consertá-lo.
Ao compilar este código EA = 0 erros e 0 avisos.
Eu usei este código para Modificar Ordens:
Você pode me dizer onde está o erro - eu não consigo encontrá-lo.
Eu já reescrevi o código de modificação do pedido e o erro permanece.
Sublinho que o erro não é do registro - não há um único erro no registro.
Encontrei o erro nos resultados durante o teste.
Exemplo:
Eu abri uma posição de compra (número de pedido 1) em 1.4654
Em seguida, nos Resultados diz comprar (pedido número 1) preço 1,4654 e TakeProfit 1,4752.
Em seguida, nos Resultados diz fechar (pedido número 1) preço 1,4704 e TakeProfit 1,4752
Lucro = 50,00
Um exemplo de uma posição perdedora, embora eu deva fechar apenas em Take Profit porque não defini Stop Loss.
Eu abri uma posição de compra (número de pedido 271) a 1.4820
Em seguida, nos Resultados diz modificar (número de pedido 271) preço 1.4820 e TakeProfit 1.4918
em seguida, diz preço de fechamento (pedido número 1) 1,4737 e TakeProfit 1,4918 nos Resultados
Lucro = - 83,46
Eu defini o TakeProfit como 100 em todos os lugares.
Eu não defini o StopLoss.
Eu não sei como consertá-lo.
Ao compilar este código EA = 0 erros e 0 avisos.
Eu usei este código para Modificar Ordens:
Por favor, ajude-me a encontrar os valores de
1 Volatilidade máxima diária (diariamente alta menos baixa) durante os últimos X=5 dias .
2 Volatilidade média diária nos últimos X=130 dias
3 E como esses valores podem ser escritos na condição se a Volatilidade Máxima Diária estiver na faixa A=75 a B=150- Volatilidade Média Diária
1. Primeiro você descobre quantas barras você precisa na janela https://docs.mql4.com/ru/windows/WindowBarsPerChart.
2. Em seguida, você receberá a data do primeiro bar https://docs.mql4.com/ru/windows/WindowFirstVisibleBar.
3. Conhecendo esta barra inicial e o número de barras - passe por estas barras e determine o alto e o baixo entre elas
4. lucro
Variante 2
https://docs.mql4.com/ru/windows/WindowPriceMaxтво
https://docs.mql4.com/ru/windows/WindowPriceMinВторой variante
Eu estava inclinado para a primeira opção, mas não sabia como calcular o número de barras na janela. A segunda opção é mais lacônica.
Mas como "pegar" o último máximo e mínimo no bar anterior? Obrigado de antemão!
Mas como "pegar" o último máximo e mínimo no bar anterior?
Você só precisa memorizar o máximo e mínimo alcançado na barra atual, e quando uma nova barra aparece e se torna a barra anterior, você irá tirar o máximo e mínimo das variáveis memorizadas.
Basta lembrar o máximo e o mínimo alcançados na barra atual, e quando uma nova barra aparecer e se tornar a barra anterior, você tirará o máximo e o mínimo das variáveis lembradas.
declarar a variável zet como estática, ou declará-la na zona global.
Antes de atribuir-lhe um novo valor, verifique a existência de uma nova barra, e verifique a diferença entre seu valor e o valor atual, e depois atribua-lhe um novo valor.
Ao fechar negócios no testador é escrito como você listou, é muito provável que seja o resultado da função de fechamento do pedido (TP e SL não têm nada a ver com isso)
Obrigado, mas parece não haver erros no código:
mas há outro código na EA: