SGarnov: Tentei inseri-lo, mas não o compila. O código inteiro, se necessário, colocarei uma captura de tela da compilação. Acho que pode haver outro problema, meu TP é definido em relação ao STOP por coeficiente (variável externa), talvez ele possa ser alterado para ajuste manual e será mais fácil para a EA adicionar?
removido do escopo global. magic=0 para compilação.
Removido, sem erros de compilação, apenas 1 aviso aparece na terceira linha de função na coluna tp=0 com audição na variável externa int tp=0. Eu não entendo bem o que o programador não gosta. Todo código está anexado, se não for difícil corrigi-lo, a verdade está em algum lugar próximo.
Removido, sem erros de compilação, apenas 1 aviso aparece na terceira linha de função na coluna tp=0 com audição na variável externa int tp=0. Eu não entendo bem o que o programador não gosta. Todos os códigos anexados, se não for difícil corrigir, a verdade está em algum lugar próximo.
É assim que parece
//+------------------------------------------------------------------+//| SGarnov.v2.mq4 |//| Copyright 2020, DrMak. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2020, DrMak."#property link"https://www.mql5.com"#property version"1.00"#property strict//--- input parametersinputint T_Profit = 2; // Коэффициент Take Profitinputint S_Loss = 100; // Уровень Stop Lossinputdouble O_Lots = 0.01; //Лотыinputint Input4;
inputint Input5;
inputint Input6;
double sl_price,tp_price,t_profit,s_loss;
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
t_profit = S_Loss*T_Profit;
s_loss = MathMax(S_Loss, MarketInfo(Symbol(), MODE_STOPLEVEL));
// Проверяем наличие ордеров BUYif(CountOrders(_Symbol, 0)>0)
{
// Проверяем последний закрытый ордер SELL на наличие убытка в пунктахif(GetPointLastLoss(1)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(1)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
// Проверяем наличие ордеров SELLif(CountOrders(_Symbol, 1)>0)
{
// Проверяем последний закрытый ордер BUY на наличие убытка в пунктахif(GetPointLastLoss(0)>0)
{
// Если убыток есть, то добавляем пункты убытка
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(GetPointLastLoss(0)+Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
else
{
// Если убытка нет
sl_price = NormalizeDouble(Point() * s_loss, Digits);
tp_price = NormalizeDouble(Point() * t_profit, Digits);
ModifyOrder(_Symbol, sl_price, tp_price);
}
}
}
//+--------------------------------------------------------------------------------------------------------------------+//| Подсчет ордеров по типу |//+--------------------------------------------------------------------------------------------------------------------+//| 0 - ордера типа BUY 1 - ордера типа SELL |//| 2 - ордера типа BUYLIMIT 3 - ордера типа SELLLIMIT |//| 4 - ордера типа BUYSTOP 5 - ордера типа SELLSTOP |//| 6 - ордера типа Balance -1 - Все типы ордеров |//+--------------------------------------------------------------------------------------------------------------------+int CountOrders(string symb="", int or_ty=-1)
{
int cnt=0;
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(or_ty<0 || or_ty==OrderType()) cnt++;
}
}
}
return(cnt);
}
//+----------------------------------------------------------------------------+//| Модификация ордера |//+----------------------------------------------------------------------------+//| sl - ценовой уровень стопа |//| tp - ценовой уровень тейка |//+----------------------------------------------------------------------------+void ModifyOrder(string symb="", double sl=0, double tp=0)
{
if(symb=="0") symb=_Symbol;
for(int pos=OrdersTotal()-1;pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS)==true)
{
if(OrderSymbol()==symb || symb=="")
{
if(OrderStopLoss()==0)
{
if(OrderType()==OP_BUY)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-sl_price, OrderOpenPrice()+tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
if(OrderType()==OP_SELL)
{
if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()+sl_price, OrderOpenPrice()-tp_price, OrderExpiration()))
{Print("Ордер модифицирован");}
else
{Print("Ошибка модификации ордера:", GetLastError());}
}
}
}
}
}
}
//+----------------------------------------------------------------------------+//| Возвращает пункты убытка последнего закрытого ордера в пунктах |//| 0 - последний ордер BUY |//| 1 - последний ордер SELL |//+----------------------------------------------------------------------------+double GetPointLastLoss( int or_ty=-1)
{
datetime t=0;
double result=0,p=0;
int i=OrdersHistoryTotal();
for(int pos=0; pos<i; pos++)
{
if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
{
if((OrderSymbol()==_Symbol))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(t<OrderCloseTime())
{t=OrderCloseTime(); p=OrderProfit(); or_ty=OrderType();
if(or_ty==OP_BUY&&p<0)
{
result=OrderOpenPrice()-OrderClosePrice();
} else {result=0;}
if(or_ty==OP_SELL&&p<0)
{
result=OrderClosePrice()-OrderOpenPrice();
} else {result=0;}
}
}
}
}
}
return(result);
}
//+------------------------------------------------------------------+
SGarnov: Obrigado, vou testá-la e apresentar um relatório. Espero que funcione como o meu, mas acrescenta uma parada (se ela for acionada) a um novo take.
Aqui só há modificações. Não há nenhuma supressão ou inversão de ordem.
Se você descrever o que a EA deve fazer, eu tentarei ajudar.
A) Se o preço chegar à Takei - o Consultor Especialista remove a Stop Loss e uma ordem de Venda pendente;
Variante 2.
B) Se a parada de perda for acionada e a EA "passar à história", então:
Uma ordem de venda é aberta e o Expert Advisor re-posiciona esta ordem:
stop loss (parâmetro externo é definido em configurações)
Tire Lucro + um Stop Loss acionado do histórico;
uma ordem de compra pendente no nível de stop loss.
O preço atinge o take - o Expert Advisor remove o stop loss e a ordem de compra pendente.
E vice versa, se o trabalho começar com uma ordem de venda pendente.
E assim o assessor trabalha até parar seu trabalho com o parâmetro externo Stop Loss Number (no meu caso é 2, significa que a variante 2 será repetida 3 vezes e o assessor deixará de trabalhar no futuro e apagará todas as ordens pendentes, a primeira parada não é levada em conta).
Se o takei não for alcançado e a variante 2 for repetida, então 2 paradas são adicionadas ao takei e assim por diante, depende do parâmetro externo definido"Stop Loss count".
O código, que coloquei funciona como deveria, exceto pelo problema, que descrevi (não vê no histórico 1 parada ou 2 paradas, o que deveria acrescentar ao take).
Eu coloquei uma ordem de compra pendente - a EA está funcionando - a ordem pendente aciona - a EA "vê" isto e coloca um stop loss nesta ordem em aberto:
stop loss (parâmetro externo é definido em configurações);
Take Profit(parâmetro externo é definido nas configurações usando a proporção de, por exemplo, 1 para 2);
A) Se o preço chegar à Takei - o Consultor Especialista remove a Stop Loss e uma ordem de Venda pendente;
Variante 2.
B) Se a parada de perda for acionada e a EA "passar à história", então:
Uma ordem de venda é aberta e o Expert Advisor re-posiciona esta ordem:
stop loss (parâmetro externo é definido em configurações);
Tire Lucro + um Stop Loss acionado do histórico;
uma ordem de compra pendente no nível de stop loss.
O preço atinge o take - o Expert Advisor remove o stop loss e a ordem de compra pendente.
E vice versa, se o trabalho começar com uma ordem de venda pendente.
E assim o assessor trabalha até parar seu trabalho com o parâmetro externo Stop Loss Number (no meu caso é 2, significa que a variante 2 será repetida 3 vezes e o assessor deixará de trabalhar no futuro e apagará todas as ordens pendentes, a primeira parada não é levada em conta).
Se o takei não for alcançado e a variante 2 for repetida, então 2 paradas são adicionadas ao takei e assim por diante, depende do parâmetro externo definido"Stop Loss count".
O código, que coloquei funciona como deveria, exceto pelo problema, que descrevi (não vê no histórico 1 parada ou 2 paradas, o que deveria acrescentar ao take).
É assim.
"Número de Stop Losses" - em uma fila ou para o dia atual?
"Número de Stop Losses" - em uma fila ou para o dia atual?
O número de paradas consecutivas em um par de moedas.
A fim de analisar o histórico, o Expert Advisor inicialmente rotula as ordens com suas identificações, mas não as encontra no histórico, pensei que a OrderMagikNumber() irá procurá-las. Talvez por causa do fato de que, na história, a EA pára de "vê-los" a partir de diferentes pares de moedas?
colocar a fonte novamente? Tudo o que ele precisa fazer é corrigir a "busca de stop trades da história e fazer com que ela se acrescente ao recém colocado take".
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Você tem um EA que suporta pedidos feitos manualmente?
Tentei inseri-lo, mas não o compila. O código inteiro, se necessário, colocarei uma captura de tela da compilação. Acho que pode haver outro problema, meu TP é definido em relação ao STOP por coeficiente (variável externa), talvez ele possa ser alterado para ajuste manual e será mais fácil para a EA adicionar?
A função
do escopo global. magic=0 para compilação.
magic=0A função
removido do escopo global. magic=0 para compilação.
Removido, sem erros de compilação, apenas 1 aviso aparece na terceira linha de função na coluna tp=0 com audição na variável externa int tp=0. Eu não entendo bem o que o programador não gosta. Todo código está anexado, se não for difícil corrigi-lo, a verdade está em algum lugar próximo.
Removido, sem erros de compilação, apenas 1 aviso aparece na terceira linha de função na coluna tp=0 com audição na variável externa int tp=0. Eu não entendo bem o que o programador não gosta. Todos os códigos anexados, se não for difícil corrigir, a verdade está em algum lugar próximo.
É assim que parece
Você não precisa de magia alguma em seu caso
É mais ou menos isso mesmo.
No seu caso, a magia não é de todo necessária.Obrigada, testará e apresentará um relatório. Espero que funcione como o meu, mas acrescenta uma parada (se for acionada) ao novo take.
Para que são necessários os parâmetros externos Input4; 5; 6?
Obrigado, vou testá-la e apresentar um relatório. Espero que funcione como o meu, mas acrescenta uma parada (se ela for acionada) a um novo take.
Aqui só há modificações. Não há nenhuma supressão ou inversão de ordem.
Se você descrever o que a EA deve fazer, eu tentarei ajudar.
Para que são necessários os parâmetros externos Input4; 5; 6?
Se você descrever o que a EA deve fazer, eu tentarei ajudar.
Eu coloco uma ordem de compra pendente - a EA está funcionando - a ordem pendente aciona - a EA "vê" isto e coloca um stop loss nesta ordem em aberto:
stop loss (parâmetro externo é definido em configurações);
Take Profit(parâmetro externo é definido nas configurações usando a proporção de, por exemplo, 1 para 2);
ordem de venda pendente no nível de stop loss.
Possíveis cenários.
Variante 1.
A) Se o preço chegar à Takei - o Consultor Especialista remove a Stop Loss e uma ordem de Venda pendente;
Variante 2.
B) Se a parada de perda for acionada e a EA "passar à história", então:
Uma ordem de venda é aberta e o Expert Advisor re-posiciona esta ordem:
stop loss (parâmetro externo é definido em configurações)
Tire Lucro + um Stop Loss acionado do histórico;
uma ordem de compra pendente no nível de stop loss.
O preço atinge o take - o Expert Advisor remove o stop loss e a ordem de compra pendente.
E vice versa, se o trabalho começar com uma ordem de venda pendente.
E assim o assessor trabalha até parar seu trabalho com o parâmetro externo Stop Loss Number (no meu caso é 2, significa que a variante 2 será repetida 3 vezes e o assessor deixará de trabalhar no futuro e apagará todas as ordens pendentes, a primeira parada não é levada em conta).
Se o takei não for alcançado e a variante 2 for repetida, então 2 paradas são adicionadas ao takei e assim por diante, depende do parâmetro externo definido"Stop Loss count".
O código, que coloquei funciona como deveria, exceto pelo problema, que descrevi (não vê no histórico 1 parada ou 2 paradas, o que deveria acrescentar ao take).
Assim.
Eu coloquei uma ordem de compra pendente - a EA está funcionando - a ordem pendente aciona - a EA "vê" isto e coloca um stop loss nesta ordem em aberto:
stop loss (parâmetro externo é definido em configurações);
Take Profit(parâmetro externo é definido nas configurações usando a proporção de, por exemplo, 1 para 2);
ordem de venda pendente no nível de stop loss.
Possíveis cenários.
Variante 1.
A) Se o preço chegar à Takei - o Consultor Especialista remove a Stop Loss e uma ordem de Venda pendente;
Variante 2.
B) Se a parada de perda for acionada e a EA "passar à história", então:
Uma ordem de venda é aberta e o Expert Advisor re-posiciona esta ordem:
stop loss (parâmetro externo é definido em configurações);
Tire Lucro + um Stop Loss acionado do histórico;
uma ordem de compra pendente no nível de stop loss.
O preço atinge o take - o Expert Advisor remove o stop loss e a ordem de compra pendente.
E vice versa, se o trabalho começar com uma ordem de venda pendente.
E assim o assessor trabalha até parar seu trabalho com o parâmetro externo Stop Loss Number (no meu caso é 2, significa que a variante 2 será repetida 3 vezes e o assessor deixará de trabalhar no futuro e apagará todas as ordens pendentes, a primeira parada não é levada em conta).
Se o takei não for alcançado e a variante 2 for repetida, então 2 paradas são adicionadas ao takei e assim por diante, depende do parâmetro externo definido"Stop Loss count".
O código, que coloquei funciona como deveria, exceto pelo problema, que descrevi (não vê no histórico 1 parada ou 2 paradas, o que deveria acrescentar ao take).
É assim.
"Número de Stop Losses" - em uma fila ou para o dia atual?
"Número de Stop Losses" - em uma fila ou para o dia atual?
O número de paradas consecutivas em um par de moedas.
A fim de analisar o histórico, o Expert Advisor inicialmente rotula as ordens com suas identificações, mas não as encontra no histórico, pensei que a OrderMagikNumber() irá procurá-las. Talvez por causa do fato de que, na história, a EA pára de "vê-los" a partir de diferentes pares de moedas?
colocar a fonte novamente? Tudo o que ele precisa fazer é corrigir a "busca de stop trades da história e fazer com que ela se acrescente ao recém colocado take".