Grid maker 1.1 - página 3

 
Oi novamente

obrigado por ter respondido mal quando cheguei em casa
 
Acho que este código tem problemas às vezes para manter a grade perfeita (pelo menos quando eu a executo como um pullback e não como uma grade de fuga). Já vi buracos se formarem e não serem atualizados e já vi a grade não se formar totalmente às vezes com todos os 10 pedidos. Além disso, parece que não gosto de ajustes de tempo de atualização que são muito curtos e não entendo por quê. Parece que 15 minutos é muito tempo para atualizar uma grade (mais como 15 segundos!), portanto, este é um grande problema. Eu gostaria de saber se você já experimentou alguma dessas coisas. Ótimo trabalho, no entanto, para que isto funcione. Bom trabalho.
 
soma,

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); }//+------------------------------------------------------------------+
 
Obrigado, hdb. Mas talvez eu não entenda exatamente como você pensa em grades porque não consigo ver uma razão pela qual atualizar muito cedo seria ruim. A falta de uma entrada manteria a grade longe do seu potencial máximo. Quando eu a executo manualmente, atualizo as ordens no segundo momento em que alguma coisa muda. Eu faço o funcionamento de redes de arrasto e não de grelhas de fuga, então talvez seja aí que reside a diferença, mas com arrasto você lucra com a falta de buracos e assim manter a grelha livre de buracos é o ideal.
 
soma,

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,
 
Bem, eu estava esperando por um momento favorável para postar uma atualização da grade - já que seu desempenho tem sido realmente péssimo recentemente.
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!
 
Penso que a única maneira de evitar o saque é usar métodos discricionários
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%.
 
Concordo, darkstonexa, acho que você pode estar certo - mas estou testando algumas variações automatizadas baseadas em om ema e macd... não estou muito otimista.

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%)!
 
Bem, que belo dois dias que tivemos... ontem vi minha grade +5k no verde (a equidade era 54k, comecei com 49k ) depois de semanas de negociações bastante catastróficas.

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!
 
Olá hdb,

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
Razão: