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
Precisa de ajuda.
http://forum.mql4.com/ru/67309#1011467
Por favor, avisar: as encomendas não são abertas todos os dias o arrasto não funciona e as encomendas abertas não são fechadas de acordo com TP. O que estou a fazer mal ?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
static bool IsFirstTick = false;
static int ticket = 0;
double lot=Lot_Normalize(Symbol(),Lots,1);
double sl= Dist_Normalize(Symbol(),Trals);
double step= Dist_Normalize(Symbol(),_Step);
int h= TimeHour(TimeCurrent());
if(h == StartHour)
{
Alert("TimeHor: ", h);
if (IsFirstTick == true)
IsFirstTick = false;
bool res;
res= OrderSelect(ticket, SELECT_BY_TICKET);
if(res == true)
{
if(OrderCloseTime() == 0)
{
bool res2;
res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
if(res2 == false)
{
Alert("Error Closing Order #", ticket);
} Alert("Closing Order #", ticket);
}
}
if(Open[0] < Open[StartHour])
{
ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! BUY_LIMIT");
}
else
{
ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! SEL_LLIMIT");
}
}
}
double Dist_Normalize(string Smv, int _Distancia)
{
int Dig= int(MarketInfo(Smv,MODE_DIGITS));
double Pip=MarketInfo(Smv,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*10*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
double Lot_Normalize(string Smv, double _lot, double _mult)
{
double minlot=MarketInfo(Smv,MODE_MINLOT);
double maxlot=MarketInfo(Smv,MODE_MAXLOT);
double steplot=MarketInfo(Smv,MODE_LOTSTEP);
double lot= _lot*_mult;
if(lot<=minlot) lot+minlot;
else if(lot>=maxlot) lot=minlot;
else if(lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
for(int pos=OrdersTotal()-1; pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if(OrderType()==OP_BUY)
{
if(_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
}
}
}
}
Por favor, avisar: as encomendas não são abertas todos os dias o arrasto não funciona e as encomendas abertas não são fechadas de acordo com TP. O que estou a fazer mal ?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
......
IsFirstTick = falso;
Eu substituiria esta peça por
Onde a variável TM é declarada como DateTime fora da função OnTick(), ou seja, é global para este módulo.
Não compreendo este código: if(Open[0] < Open[StartHour])
O StartHour é igual a 23 e sugere que o preço aberto da barra zero será comparado com o preço aberto da 23ª barra antes dela. Bem, ok, talvez seja um truque do Conselheiro Especialista.
Mas este desenho não é de todo apropriado.
E se a variável do bilhete for igual a zero, ou se a EA tiver sido reinicializada e esta variável tiver sido reinicializada por defeito?
O StartHour é o momento em que a EA deve funcionar. Deve ser 1:00 da manhã. Porque é que a pesca de arrasto não funciona?
É necessário analisar o código para compreender porque é que não funciona.
Tentar inserira função Print("Tralling_Stop") na funçãoTralling_Stop(), e ver se esta mensagem (Tralling_Stop) aparece no registo, se não, então esta função não é chamada. Se o tiver, analise a função Tralling_Stop() em si, talvez ela contenha alguns erros lógicos.
Em geral, sempre que existam condições lógicas se, inserir Print(" condição 1" ), Print(" condição 2" ), etc. Execute o Expert Advisor no testador de estratégia e no diário pode traçar a lógica da sua EA.
É necessário analisar o código para compreender porque é que não funciona.
Tentar inserira função Print("Tralling_Stop") na funçãoTralling_Stop(), e ver se esta mensagem (Tralling_Stop) aparece no registo, se não, então esta função não é chamada. Se sim, analisar a própria função Tralling_Stop() - talvez haja alguns erros lógicos nela.
Em geral, sempre que existam condições lógicas se, inserir Print(" condição 1" ), Print(" condição 2" ), etc. Execute o Expert Advisor no Strategy Tester e no log pode traçar a lógica da sua EA.
Tentei reescrevê-lo, mas ainda não funciona como eu preciso. As ordens não são abertas quando eu quero que sejam, então não estão a trilhar. De acordo com a ideia, o Conselheiro Especialista deve trabalhar desta forma: ao fechar a última vela num dia (às 00:00) deve abrir duas ordens pendentes: Alta (para comprar) e Baixa (para vender) e depois apenas triplicá-las.
input int StartHour = 1; // Начало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 10; // StopLoss
extern double Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 5; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = false; // Использовать шаг или неT
void OnTick()
{
static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;}
if (OrdersTotal()>0)
{
OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
}
}
//+------------------------------------------------------------------+
void Trailing()
{
if (_StepUse)
{
for (int trall=0; trall<OrdersTotal(); trall++) {
if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY ) {
if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL) {
if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
}
}
}
//+------------------------------------------------------------------+
Experimente
Substituir por:
Substituir por:
Além disso, os preços devem ser normalizados utilizando o NormalizeDouble(). Ou seja, em vez deLow[1]-StopLoss*Point deve escrever NormalizeDouble(Low[1]-StopLoss*Point,Digits()).
Também, de acordo com o seu código, se a variável _StepUse for igual a falsa, a sua paragem não funcionará. Olhe atentamente para o código da função Trailing()
Experimente
Substituir por:
Substituir por:
Além disso, os preços devem ser normalizados utilizando o NormalizeDouble(). Ou seja, em vez deLow[1]-StopLoss*Point deve escrever NormalizeDouble(Low[1]-StopLoss*Point,Digits()).
Também, de acordo com o seu código, se a variável _StepUse for igual a falsa, a sua paragem não funcionará. Veja com atenção o código da função Trailing().
Está em contacto? Enviem-me uma mensagem para http://vk.com/computerwizard116. Já não sei como resolver o problema da EA. Na minha conta de demonstração tenho estado a trabalhar nesta estratégia há uma semana
E funciona. E nos testes, este malandro nem sequer fecha a encomenda ao takeout point(((((( Na foto, pode ver que o preço foi além do takeout point e voltou, mas fechou com prejuízo, caramba!(((
Porque é que ele está a fazer isso?
Está em contacto? Enviem-me um e-mail para http://vk.com/computerwizard116. Já não sei como resolver o problema da EA. Há uma semana que utilizo esta estratégia numa conta de demonstração
e funciona. Mas ao testar, este malandro nem sequer fecha a encomenda de takeaway. (((((( Na foto, pode-se ver que o preço foi além do takeaway e voltou, mas fechou com prejuízo.
Porque é que está a fazer isso?
Não estou em contacto.
Aexecução das ordens Take Profit e Stop Loss não depende do conselheiro, elas são executadas no servidor do corretor. A EA apenas fixa o lucro e pára as perdas, não as executa. Verificar se o lucro do take já estava definido depois de o preço ter atingido este valor. Por outras palavras, a ordem foi aberta primeiro, depois o preço estava a andar para trás e para a frente, e depois foi estabelecido o take profit.
Não estou em contacto.
A execução de ordens de take profit e stop loss não depende da EA, elas são executadas no servidor do corretor. A EA apenas define as ordens de tomada e paragem, não as executa. Verificar se o lucro do take já estava definido depois de o preço ter atingido este valor. Por outras palavras, a ordem foi aberta primeiro, depois o preço andou para trás e para a frente, e depois o take profit foi estabelecido.