Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 193
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
Preciso de ajuda - tenho trailing stops - 3 ordens, mas o exemplo de trailing de tutoriais em vídeo :) somente para ordens não vinculadas, no meu caso elas estão vinculadas por algoritmo, ou seja, o takeprofit é calculado pela soma de três ordens, ou uma se eu entrei em uma tendência. Bem, eu pensei em algo, mas meu consultor especializado não começou a ganhar mais - começou a ganhar a mesma quantidade de ordens, mas eu recebo 2 a 3 vezes menos negócios em comparação com minha EA anterior sem travas. Por isso, meu rastro não é um rastro, mas um disparate. Como devo colocá-lo em pedidos vinculados? Alguém pode me dar uma idéia? Não consigo pensar em mais nada. Aqui está o resultado do meu "trailing" - ele é mostrado em azul:
O resultado de 1 teste é anexado. Há ou não uma parada de trilha lá? Eu não entendo. Por que o lucro não foi aumentado no mesmo período? Apenas o número de negócios diminuiu de 2 a 3 vezes?
//+------------------------------------------------------------------+ //| BLACKJACK&HOOKERS TrailX.mq4 | //| Copyright 2017, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2017, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict extern double Lots = 0.01; extern int TakeProfit = 5; extern int Step = 2; extern int TrailingStep = 3; extern int TrailingStop = 1; extern int MaPeriod = 200; extern int MaShift = 1; extern int Magic = 123; extern int Slippage = 5; int timeprev=0; extern double price,op,cn,tp; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(Digits == 3 || Digits == 5) TakeProfit *= 10; Step *= 10; TrailingStep *= 10; TrailingStop *= 10; Slippage *= 10; return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if (timeprev == Time[0]) return; timeprev = Time[0]; double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1); op=CalculateProfit(); cn=CountTrades(); tp=TakeProfit; if(tp>TakeProfit) { TakeProfit+=tp; } if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice) { if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0) Print("Не удалось открыть ордер на покупку"); } if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice) { if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0) Print("Не удалось открыть ордер на продажу"); } if(cn==1 && CountBuy()==1)//CountBuy()==1 && { price=FindLastBuyPrice(); if((price-Ask)>=Step*Point) { if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1) Print("Не удалось открыть ордер на продажу"); } } else if(cn==1 && CountSell()==1)//CountSell()==1 && { price=FindLastSellPrice(); if((Bid-price)>=Step*Point) { if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1) Print("Не удалось открыть ордер на покупку"); } } if(cn==2 && CountBuy()==1 && CountSell()==1)//CountBuy() + CountSell()==2 && { price=FindLastSellPrice(); if((price-Bid)>=Step*Point) { if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1) Print("Не удалось открыть ордер на продажу"); } else price=FindLastSellPrice(); if((Bid-price)>=Step*Point) { if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1) Print("Не удалось открыть ордер на покупку"); } } else if(cn==2 && CountSell()==1 && CountBuy()==1)//CountSell() + CountBuy()==2 && { price=FindLastBuyPrice(); if((Ask-price)>=Step*Point) { if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1) Print("Не удалось открыть ордер на продажу"); } else price=FindLastBuyPrice(); if((price-Ask)>=Step*Point) { if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1) Print("Не удалось открыть ордер на покупку"); } } Trailing(); if (op>=tp) { CloseAll(); } } //--------------------------------------------------------------------------------------- // double Equity() //или OrderProfit() - эти идеи в работе и задуманы как автоподбор лота (без мартингейла) для снижения рисков от контрдвижения (интервенций) рынка // { // double eqv=0; // eqv+=AccountEquity(); // return(eqv); // } //--------------------------------------------------------------------------------------- void Trailing() { for (int i=OrdersTotal() -1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_BUY) { price=FindLastBuyPrice(); if (Bid - price > (TakeProfit+TrailingStep)*Point) { { tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits); } } if (price - (TakeProfit-TrailingStop)*Point < Bid - (TakeProfit+TrailingStep)*Point) { { tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits); } } } if (OrderType() == OP_SELL) { price=FindLastSellPrice(); if (price - Ask > (TakeProfit+TrailingStep)*Point) { { tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits); } } if (price - (TakeProfit-TrailingStop)*Point > Ask + (TakeProfit+TrailingStep)*Point) { { tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits); } } } } } } } //--------------------------------------------------------------------------------------- double CalculateProfit() { double oprofit=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY || OrderType()==OP_SELL) { oprofit+=OrderProfit(); } } } } return(oprofit); } //-------------------------------------------------------------------------------------- void CloseAll() { for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage)) Print("Не удалось закрыть ордер на покупку"); } if(OrderType()==OP_SELL) { if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage)) Print("Не удалось закрыть ордер на продажу"); } } } } } //--------------------------------------------------------------------------------------------------- double FindLastBuyPrice() { int oldticket,ticket= 0; double oldopenprice = 0; for(int cnt=OrdersTotal()-1; cnt>=0; cnt--) { if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY) { oldticket=OrderTicket(); if(oldticket>ticket) { ticket=oldticket; oldopenprice=OrderOpenPrice(); } } } } return(oldopenprice); } //--------------------------------------------------------------------------------------------------- double FindLastSellPrice() { int oldticket,ticket= 0; double oldopenprice = 0; for(int cnt=OrdersTotal()-1; cnt>=0; cnt--) { if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL) { oldticket=OrderTicket(); if(oldticket>ticket) { ticket=oldticket; oldopenprice=OrderOpenPrice(); } } } } return(oldopenprice); } //---------------------------------------------------------------------------------------------- int CountBuy() { int count=0; for(int trade=OrdersTotal()-1; trade>=0; trade--) { if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY) count++; } } return(count); } //---------------------------------------------------------------------------------------------- int CountSell() { int count=0; for(int trade=OrdersTotal()-1; trade>=0; trade--) { if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL) count++; } } return(count); } //+---------------------------------------------------------------------------------+ int CountTrades() { int count=0; for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) if(OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } return(count); } //----------------------------------------------------------------------------------+ int FindLastOrderType() { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) return(OrderType()); } } return(-1); } //----------------------------------------------------------------------------------+
Eu preciso de ajuda - eu tenho stop flips - 3 ordens, mas o exemplo de trailing apenas para ordens não relacionadas, no meu caso elas estão ligadas por um algoritmo, ou seja, takeprofit é baseado na soma de três ordens, ou uma se você estiver em uma tendência. Bem, eu pensei em algo, mas meu consultor especializado não começou a ganhar mais - começou a ganhar a mesma quantidade de ordens, mas eu recebo 2 a 3 vezes menos negócios em comparação com minha EA anterior sem travas. Por isso, meu rastro não é um rastro, mas um disparate. Como devo colocá-lo em pedidos vinculados? Alguém pode me dar uma idéia? Não consigo pensar em mais nada, aqui está o resultado do meu "trailing" - destacado em vermelho:
Você acha que alguém vai entender seu código rabiscado?
Como deve ser exibido? Bem, eu não posso lançar um pedaço de código, caso contrário não estaria claro o que é o quê.
Como você demonstra isso? Bem, eu não posso lançar um pedaço de código, caso contrário não estaria claro o que é o quê.
Pelo menos assim:
Pelo menos é assim que as coisas são:
Alguém a refez. Isso é certamente melhor, obrigado.
Amigos, estou estudando a MQL4 e decidi escrever um EA para o sistema Lazy Trader.
O EA é escrito, mas não funciona corretamente. O erro que vejo é que as ordens não são fechadas a tempo. Pode ser que haja alguns outros erros.
Por favor, ajude-me a encontrar esses erros e me dê feedback sobre o código que você vê.
Aqui estão as regras do sistema para o qual escrevi o Expert Advisor:
1/ No início da semana, aguarde até que a primeira vela de quatro horas feche.
2/ Colocamos ordens pendentes de Buy Stop e Sell Stop 20 pips acima da High e 20 pips abaixo da Low deste castiçal.
3/ Stop Loss deve ser fixado no nível da ordem oposta. Take Profit não é colocado.
4/ Quando a ordem atinge um lucro, igual ao stop loss, transferimos o stop para o Breakeven (transferimos o stop loss da posição para seu preço de abertura).
5/ A segunda ordem após a ativação da primeira, NÃO RETIRE!
6/ No final da semana, retiramos / fechamos todos os pedidos, independentemente de seu lucro / perda.
Obrigado por sua ajuda:)
Estou anexando um arquivo com o código EA
Amigos, estou estudando a MQL4 e decidi escrever um EA para o sistema Lazy Trader.
O EA é escrito, mas não funciona corretamente. O erro que vejo é que as ordens não são fechadas a tempo. Pode ser que haja alguns outros erros.
Por favor, ajude-me a encontrar esses erros e me dê feedback sobre o código que você vê.
Aqui estão as regras do sistema para o qual escrevi o Expert Advisor:
1/ No início da semana, aguarde até que a primeira vela de quatro horas feche.
2/ Colocamos ordens pendentes de Buy Stop e Sell Stop 20 pips acima da High e 20 pips abaixo da Low deste castiçal.
3/ Stop Loss deve ser fixado no nível da ordem oposta. Take Profit não é colocado.
4/ Quando a ordem atinge um lucro, igual ao stop loss, transferimos o stop para o Breakeven (transferimos o stop loss da posição para seu preço de abertura).
5/ A segunda ordem após a ativação da primeira, NÃO RETIRE!
6/ No final da semana, retiramos / fechamos todos os pedidos, independentemente de seu lucro / perda.
Obrigado por sua ajuda:)
Estou anexando o arquivo com o código do conselheiro.
Tal igualdade absoluta pode ser muito rara e se você fechar a semana aos 23, seria melhor fechar os pedidos um pouco mais cedo, pelo menos por 15 minutos. Eu não procurei por outros erros. À primeira vista, parece ter sido escrito com bastante precisão.
Esta igualdade absoluta pode ser muito rara e se você fechar a semana aos 23, é melhor fechar os pedidos um pouco mais cedo, pelo menos em 15 minutos. Eu não procurei por outros erros. À primeira vista, parece ter sido escrito de forma bastante clara.
O fechamento da semana é às 00:00, ou seja, eu fecho os pedidos 1 hora antes.
O que está errado neste código:TimeHour(TimeCurrent())== DayTimeClose ?
Acho que há um erro em algum lugar neste código:
}
Obrigado
O fechamento da semana é às 00:00, ou seja, eu fecho os pedidos 1 hora antes.
O que está errado neste código:TimeHour(TimeCurrent())== DayTimeClose ?
Acho que há um erro em algum lugar neste código:
}
Obrigado
Foi exatamente isso que eu apontei. Embora eu veja agora que eu estava desatento. Só vi o TimeHour(TimeCurrent()) destacado. == DayTimeClose.
Mas o fato de que o contador de laço é i e o pedido k é selecionado, não vi isso de imediato.
Foi exatamente isso que eu apontei. Embora eu veja agora que eu estava desatento. Eu vi apenas o TimeHour(TimeCurrent()) destacado == DayTimeClose.
Mas o fato de que o contador de laço é i e o pedido k é selecionado, não vi isso de imediato.
Sim, este K também está escrito emvariáveis externas no cabeçalho superior... Talvez seja o valor de retorno de alguma função...
Alexey, o que você pode dizer sobre meu problema? Eu tento anexar uma parada móvel para inverter as ordens. Você já encontrou um problema desse tipo?