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
obrigado por ter respondido mal quando cheguei em casa
u estão certos, houve um bug que alguém me apontou e parece ter sido corrigido. aqui está a nova versão. Também mudei o intervalo para 1 min - mas acho que 15 a 30 min é melhor... evitará algumas contra-operações quando o mercado se movimenta muito rápido.
cumprimentos,
//+------------------------------------------------------------------+//| MakeGrid.mq4 |//| Copyright © 2005, hdb |//| http://www.dubois1.net/hdb |//+------------------------------------------------------------------+#property copyright "Copyright © 2005, hdb "# linkproperty "http://www.dubois1.net/hdb"//#property version "1.4beta "string externa GridName = "Grid"; // identifica a grid. permite a coexistência de vários lotes duplos de gridsexternos = 0,1; // tamanho duplo de grid externo = 6; // pips entre pedidos - grid ou mesh sizeextern double GridSteps = 12; // número total de pedidos para colocar o dobro de TakeProfit = 6; // número de ticks para ter lucro. normalmente é = tamanho da grid, mas u pode substituir o StopLoss duplo de grid externo = 0; // se você quiser adicionar um stop loss. grelhas normais não usam stop lossesextern double UpdateInterval = 1; // ordens de atualização a cada x minutesextern bool wantLongs = true; // queremos posição comprida - bool wantShorts = true; // queremos posição curta - bool wantBreakout = true; // queremos longos acima do preço, curtos abaixo do preço - bool wantCounter = true; // queremos longos abaixo do preço, curtos acima do preço - bool limitEMA34 = false; // queremos longs acima de ema somente, shorts abaixo de ema somenteexternos duplo LastUpdate = 0; // contador usado para anotar o tempo da última atualizaçãoexternos duplo GridMaxOpen = 0; // número máximo de posições abertas///+------------------------------------------------------------------+//| função de inicialização expert |///+------------------------------------------------------------------+int init() {//---- #property show_inputs // mostra os parâmetros - obrigado Slawa... if ( TakeProfit <= 0 ) // { TakeProfit = GridSize; }//---- return(0); }//+------------------------------------------------------------------------+//| tests if there is an open position or order in the region of atRate |//| will check for longs if checkLongs is true, else will check |///| for shorts |//+------------------------------------------------------------------------+bool IsPosition(double atRate, double inRange, bool checkLongs ) { int totalorders = OrderTotal(); for(int j=0;j<totalordens;j++) // escanear todas as ordens e posições.... { OrderSelect(j, SELECT_BY_POS); if ( OrderSymbol()==Symbol() && OrderComment() == GridName ) // só procurar se mygrid e símbolo... { int type = OrderType(); if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // não procurar preço exato mas proximidade de preço (menos que o tamanho da grade) { if ( ( checkLongs && ( type == OP_BUY ||| type == OP_BUYLIMIT || type == OP_BUYSTOP ) ) ||| (!checkLongs && ( type == OP_SELLL || type == OP_SELLLIMIT ||| type == OP_SELLSTOP ) ) { return(true); } } } } } return(false); }//+------------------------------------------------------------------+//| função script program start |//+------------------------------------------------------------------+int start() {//---- int i, j,k, ticket, entermode, totalorders; bool doit; double point, startrate, traderate; //---- if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // atualizamos a primeira vez que é chamado e a cada minuto do UpdateInterval { LastUpdate = CurTime(); Print("Updating"); point = MarketInfo(Symbol(),MODE_POINT); startrate = ( Ask + point*GridSize/2 ) / point / GridSize; // redondo para um número de ticks divisíveis por GridSize k = startrate ; k = k * GridSize ; startrate = k * point - GridSize*GridSteps/2*point ; // calcular o ponto de entrada mais baixo duplo EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0); for( i=0;i<GridSteps;i++) { traderate = startrate + i*point*GridSize; if ( wantLongs && (!limitEMA34 || traderate > EMA34)) { if ( IsPosition(traderate,point*GridSize,true) == falso ) // testar se não tenho ordens abertas próximas ao meu preço: se sim, colocar uma em { double myStopLoss = 0; se ( StopLoss > 0 ) { myStopLoss = traderate-point*StopLoss ; } if ( traderate > Ask ) { entermode = OP_BUYSTOP; } else { entermode = OP_BUYLIMIT ; } if ((traderate > Ask ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) ) { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,0,Green); } } } } if ( wantShorts && (!limitEMA34 || traderate < EMA34)) { if (IsPosition(traderate,point*GridSize,false)== false ) // testar se não tenho ordens abertas próximas ao meu preço: se sim, colocar uma em { myStopLoss = 0; se ( StopLoss > 0 ) { myStopLoss = traderate+point*StopLoss ; } if ( traderate > Bid ) { entermode = OP_SELLLIMIT; } else { entermode = OP_SELLSTOP ; } if ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red); } } } } } } return(0); }//+------------------------------------------------------------------+Sim, talvez você esteja certo... então o melhor seria atualizar freqüentemente, mas apenas alguns slots de grade... precisa ser testado. Eu não tenho uma opinião forte.
reagrado,
Na semana após minha última atualização, eu estava de férias e a rede foi interrompida. Na semana passada, a grade estava funcionando a maior parte do tempo.
Eu a desliguei algumas vezes quando a margem de disponibilidade era zero e ativei "só por muito tempo" na maioria das majors.
Hoje foi um super dia de retorno.
Saldo : 93 (+10 desde 10 dias atrás)
Margem utilizada : +15k
Disponibilidade mrg : +28k
unreal. p&l : -49k (-11 desde 10 dias atrás)
Equilíbrio : 44k
O líquido está 1k pior do que há 10 dias e 5k abaixo do saldo inicial.
A parte realmente difícil em tudo isso é tentar limitar o drawdown. Eu realmente tenho que encontrar maneiras de fazer isto!
ou seja, saber quando parar de adicionar ordens e quando gostar de adicionar posições curtas, digamos assim.
Começou com um saldo de 100K após ter começado mal, usando para grandes lotes e sendo forçado a fechar muitas posições.
Saldo: 97 594,19 Saldo há cerca de 2 semanas 83k
Margem Livre: 6 016,88
P/L flutuante: -38 960.45 foi tão ruim quanto -56k
Margem: 52 616,86
os últimos dois dias tinham sido realmente lentos o nível da margem foi tão baixo quanto 93%.
mas agora todas as majors pareciam ter dado uma reviravolta, por enquanto
O nível de margem está de volta a cerca de 130%.
Um amigo também tem um com um stoploss funcionando... e está lutando para se manter à tona! Mas isso realmente resolve o problema de drawdown!
Enquanto isso, limpei minhas posições - todas as posições com um forte interesse negativo e bem em prejuízo ( uns poucos 100 pips) foram fechadas.
Portanto, minhas grades agora estão prontas para outro golpe na cabeça (margem de lucro de 430%)!
Sorte que podemos tentar em contas demo!
Agora que estou de volta a uma posição "razoável", defini todos os pares de moedas para fazer o seguinte:
1) negociar somente na direção de um interesse positivo (a menos que o interesse esteja próximo de 0, então faça as duas coisas)
2) só anseia acima de 34 ema, shorts só abaixo de 34 ema
3) para moedas de 2 vias, use macd na tabela de 5 minutos para decidir se é longo ou curto
Veremos o que isso dá!
ps. Desejo que os testes posteriores funcionem!
Tomei seu conselho sobre o EURUSD, negociando com ambos os lados como um breakout.
Agora eu gostaria de lhe perguntar, se você já está correndo no seguinte problema:
Depois de um tempo, tenho mais de uma ordem em algumas das mesmas posições da grade. Às vezes há duas, mas também já vi 5 e mais delas.
Tanto quanto eu entendo o código, apenas um deve estar aberto em uma posição de grade de cada vez.
Eu mexi na conversão de todas as duplas para int antes de comparar, porque na MQL2 encontrei um problema semelhante ao comparar valores duplos.
Você encontrou algo semelhante?
Com respeito,
cori