Nem toda EA e nem toda Estratégia é lucrativa
Com o uso do Strategytester, faça-o também com o modo visual e coloque no gráfico os indicadores que você está com as mesmas configurações que você definiu na EA
MA200 = iMA(NULL, 0, 200, 8,MODE_SMA,PRICE_CLOSE, 0); MA5 = iMA(NULL, 0, 5, 8,MODE_SMA,PRICE_CLOSE, 0); CurrentRSI = iRSI (NULL, 0, VarPeriod,PRICE_CLOSE ,0);
Cada tick que você está calculando os valores acima e eles podem mudar a cada tick porque você escolheu "....,PRICE_CLOSE, 0);"
Os valores que você vê no gráfico quando o teste é feito não são os valores que você tinha quando uma troca é aberta...
if(AccountFreeMargin()<(1000*BuyVolume)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } if (CurrentRSI < LowerBound && MarketInfo(Symbol(), MODE_ASK) > MA200 ) { //Condition to execute buy entry Ticket = OrderSend(Symbol(), OP_BUY, BuyVolume, Ask, 3, Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point ), "Buy.", 111,0,Yellow) ; //execute buy order if(Ticket>0) { if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } if (Ticket < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } return(0); }
Quando as condições são cumpridas para abrir uma compra, e o testador abre uma compra, então não há verificação se você já tem uma aberta com a mesma condição.
Depois que uma compra abre o próximo tick, você pode ter novamente a condição para abrir uma troca.
Esta abertura de negócios pode funcionar no StrategyTester, mas em tempo real em demonstração em conta real,
você pode obter erros que não vê no testador. Por exemplo, escolher "3" Slippage é muito baixo para negociar em conta de "5 dígitos
O envio da OrderSend com um valor para OrderStopLoss() e OrdertakeProfit() > 0 falhará para as contas ECN
Total=OrdersTotal(); for(cnt=0;cnt<Total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) // check for symbol and check for opened position {No OrderSend e neste laço para verificação de negócios sinto sua falta de utilizar seu OrderMagicNumber()
e vejo que o loop está contando para cima em vez de contar para baixo enquanto você também quer que ele feche posições se necessário Então outro erro
A OrderModify pode acontecer com cada ponto, o que pode levar a erros de corretor como um contexto de comércio muito ocupado.
Em uma nota lateral, posso saber o que é shift e ma_shift e como devo preenchê-lo? é um parâmetro necessário para o indicador iRSI() eu não sabia o que escrever, então eu apenas atribuo 0 a ele.
Não tenho certeza de onde você obteve essas informações, mas elas estão incorretas ...
iRSI() duplo iRSI(string symbol,int timeframe,int period,int applied_price,int shift)
Talvez você quis dizer iMA()? turno é o número de barra do tempo para o qual você quer o MA, ma_shift permite que você mova o valor do MA em relação ao número de barra, então se você der um turno de 5 e um ma_shift de -2 ele lhe dará o MA para a barra 7, você precisaria experimentar um pouco para verificar se estou correto, em princípio estou.
Com o uso do Strategytester, faça-o também com o modo visual e coloque no gráfico os indicadores que você está com as mesmas configurações que você definiu na EA
Cada tick que você está calculando os valores acima e eles podem mudar a cada tick porque você escolheu "....,PRICE_CLOSE, 0);"
o que devo escolher para o valor do turno" ....,PRICE_CLOSE, 0);" então?
o que devo escolher para o valor do turno" ....,PRICE_CLOSE,0);" então?
O que sua estratégia exige? Use a barra 0 se você quiser, mas ela "repintará" mesmo que você use PRICE_CLOSE, Close[0](preço fechado da barra 0) == Oferta. Quando a barra 0 finalmente fecha não é mais a barra 0, ela se torna a barra 1.
Nem toda EA e nem toda Estratégia é lucrativa
Com o uso do Strategytester, faça-o também com o modo visual e coloque no gráfico os indicadores que você está com as mesmas configurações que você definiu na EA
Cada tick que você está calculando os valores acima e eles podem mudar a cada tick porque você escolheu "....,PRICE_CLOSE, 0);"
Os valores que você vê no gráfico quando o teste é feito não são os valores que você tinha quando uma troca é aberta...
Quando as condições são cumpridas para abrir uma compra, e o testador abre uma compra, então não há verificação se você já tem uma aberta com a mesma condição.
Depois que uma compra abre o próximo tick, você pode ter novamente a condição para abrir uma troca.
Esta abertura de negócios pode funcionar no StrategyTester, mas em tempo real em demonstração em conta real,
você pode obter erros que não vê no testador. Por exemplo, escolher "3" Slippage é muito baixo para negociar em conta de "5 dígitos
O envio da OrderSend com um valor para OrderStopLoss() e OrdertakeProfit() > 0 falhará para as contas ECN
No OrderSend e neste laço para verificação de negócios sinto sua falta de utilizar seu OrderMagicNumber()e vejo que o loop está contando para cima em vez de contar para baixo enquanto você também quer que ele feche posições se necessário Então outro erro
A OrderModify pode acontecer com cada ponto, o que pode levar a erros de corretor como um contexto de comércio muito ocupado.
Eu refiz tudo e consertei o loop, o deslizamento, consertei a média móvel e os valores RSI, certifiquei-me de que todas as posições abertas fossem fechadas antes de começar uma nova posição. mas quando eu volto atrás, nada acontece, nenhuma compra/venda foi executada... qual é o problema com isso novamente?
//+------------------------------------------------------------------+ //| My Strategy 4.mq4 | //| Copyright 2013, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" extern double StopLoss = 40; extern double TakeProfit = 40; extern double Lots = 0.1; extern double Slippage = 10; extern double RSINow; extern double MA200; extern double MA5; extern bool A1 = false; extern bool A2 = false; extern int Ticket; extern int Ticket2; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Alert("Minimum Stop Level is " + MarketInfo(Symbol(), MODE_STOPLEVEL)); //find out minimum stop loss RSINow = iRSI(NULL, 1440, 2, PRICE_CLOSE, 0); //calculates the RSI value for 2 days MA200 = iMA(NULL, 1440, 200, 0, MODE_SMA, PRICE_CLOSE,0); //calculates the moving average for 200 days MA5 = iMA(NULL, 1440, 5, 0, MODE_SMA, PRICE_CLOSE,0); //calculates the moving average for 5 days Alert(RSINow); Alert(MA200); Alert(MA5); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- //check if a long position is possible, A is false means no buy trade is open , execute buy when RSI drops below 5 and when Ask price rises above 200 day moving average if (A1 == false && RSINow < 5 && Ask > MA200) { Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, Bid - ( StopLoss * Point ), Ask + ( TakeProfit * Point )); if(Ticket>0) { if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) { Print("BUY order opened : ",OrderOpenPrice()); A1 = true; } if (Ticket < 0) { Print("Error opening BUY order : ",GetLastError()); return(0); } } } //check if a short position is possible, A2 is false means no sell trade is open , execute sell when RSI rises above 95 and when Bid price drops below 200 day moving average if (A2 == false && RSINow > 95 && Bid < MA200) { Ticket2 = OrderSend(Symbol(), OP_BUY, Lots, Bid, Slippage, Ask + ( StopLoss * Point ), Bid - ( TakeProfit * Point )); if(Ticket2>0) { if(OrderSelect(Ticket2,SELECT_BY_TICKET,MODE_TRADES)) { Print("SELL order opened : ",OrderOpenPrice()); A2 = true; } if (Ticket2 < 0) { Print("Error opening SELL order : ",GetLastError()); return(0); } } } //check if buy position can be closed, once Ask price rises above 5 day moving average, its time to close the position. if ((A1 == true) && (Ask > MA5)) { OrderClose(Ticket, Lots, Bid, Slippage, Violet); A1 = false; return(0); } //check if sell position can be closed, if Bid price drops below 5 day moving average, close sell position. if ((A2 == true) && (Bid < MA5)) { OrderClose(Ticket2, Lots, Bid, Slippage, Violet); A2 = false; return(0); } //---- return(0); } //+------------------------------------------------------------------+
Eu refiz tudo e consertei o loop, o deslizamento, consertei a média móvel e os valores RSI, certifiquei-me de que todas as posições abertas fossem fechadas antes de começar uma nova posição. mas quando eu volto atrás, nada acontece, nenhuma compra/venda foi executada... qual é o problema com isso novamente?
não o laço não é fixo ele é removido com que o problema é maior
. você está usando A1 e A2 que se valorizam no momento da abertura do comércio
mas o que acontecerá se a energia de seu computador for suficiente e você tiver que reiniciar seu computador e seu metatrader.
Você tem que verificar nesse momento se há negócios abertos de seu EA
Como você vai fazer isso ????
Para facilitar o uso de um OrderMagicNumber específico, abrindo e verificando seus negócios
.
a média móvel agora não é movida algumas barras no futuro ok
mas você o calcula somente na seção init() isto só será executado no início de seu Expert Advisor
Sinto falta em Start() .... Por que você o removeu lá ????
.
Reescreva seu código e experimente um teste veja também as configurações
Não com os melhores dados retroativos, mas se você fizer bem, pode ser lucrativo
Símbolo | EURUSD (Euro vs Dólar americano) | ||||
Período | Diário (D1) 2010.10.01 00:00 - 2013.01.29 00:00 (2010.10.01 - 2013.01.30) | ||||
Modelo | Cada carrapato (o método mais preciso baseado em todos os prazos mínimos disponíveis) | ||||
Parâmetros | RSIPeriod=3; UpperBound=90; LowerBound=5; MASlowPeriod=200; MAFastPeriod=5; Lots=0,1; StopLoss=60; TakeProfit=120; TrailingStop=40; MagicNumber=54333; CommentEA="RSI strategy"; Slippage.Pips=3; | ||||
Barras em teste | 1603 | Carrapatos modelados | 40187739 | Qualidade de modelagem | n/d |
Erros de gráficos não correspondentes | 2062601 | ||||
Depósito inicial | 3000.00 | ||||
Lucro líquido total | 967.18 | Lucro bruto | 2226.34 | Perda bruta | -1259.16 |
Fator de lucro | 1.77 | Pagamento previsto | 13.62 | ||
Desembolso absoluto | 107.10 | Máximo de drawdown | 327.47 (7.99%) | Drawdown relativo | 7.99% (327.47) |
Total de negócios | 71 | Posições curtas (ganhadas %) | 66 (69.70%) | Posições longas (ganho %) | 5 (80.00%) |
Lucros comerciais (% do total) | 50 (70.42%) | Perdas comerciais (% do total) | 21 (29.58%) | ||
A maior | comércio lucrativo | 120.07 | comércio de perdas | -60.00 | |
Média | comércio lucrativo | 44.53 | comércio de perdas | -59.96 | |
Máximo | vitórias consecutivas (lucro em dinheiro) | 8 (424.26) | perdas consecutivas (perda em dinheiro) | 3 (-179.93) | |
Maximal | lucro consecutivo (contagem de vitórias) | 424.26 (8) | perda consecutiva (contagem de perdas) | -179.93 (3) | |
Média | vitórias consecutivas | 4 | perdas consecutivas | 2 |
Reescreva seu código e experimente um teste veja também as configurações
Não com os melhores dados retroativos, mas se você fizer bem, pode ser lucrativo
Total de negócios | 71 | Posições curtas (ganhadas %) | 66 (69.70%) | Posições longas (ganho %) | 5 (80.00%) |
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Eu imito e escrevi um mesmo EA com o exemplo aqui https://www.mql5.com/en/articles/1510 exceto as condições de compra/venda
Condição para abrir posição de compra : RSI abaixo de 5 E preço Ask acima da média móvel de 200 dias, sair quando o preço Ask estiver acima da média móvel de 5 dias.
Condição para abrir posição de venda : RSI está acima de 95 E o preço de compra está abaixo de 200 Dias de idade média móvel, saída quando o preço de compra está abaixo da média móvel de 5 dias.g
Quando volto a fazer testes, tenho lucro negativo toda vez que não sei por quê. A melhor parte é que às vezes isso me dá erro 134 o que significa não ter dinheiro suficiente.
Em uma nota lateral, posso saber o que é turno e ma_shift e como devo preenchê-lo? é um parâmetro necessário para o indicador iRSI() eu não sabia o que escrever, então eu apenas atribuo 0 a ele.
eis o código