Creador de cuadrículas 1.1 - página 3

 
Hola de nuevo

gracias por tu respuesta te agrego cuando llegue a casa
 
Encuentro que este código tiene problemas a veces para mantener la cuadrícula perfecta (al menos cuando la ejecuto como una cuadrícula de retroceso y no de ruptura). He visto agujeros formar y no se actualizan y he visto la rejilla no se forma completamente a veces con todos los 10 órdenes. Además, parece que no le gustan los ajustes de tiempo de actualización que son muy cortos y no entiendo por qué. Parece que 15 minutos es demasiado tiempo para actualizar una cuadrícula (¡más bien 15 segundos!) así que esto es un problema importante. Apreciaría saber si usted ha experimentado algo de esto. Sin embargo, es un gran trabajo el haber conseguido que esto funcione. Buen trabajo.
 
soma,

tienes razón, había un error que alguien me señaló y parece que se ha solucionado. aquí está la nueva versión. Tambien he cambiado el intervalo a 1 min - pero creo que de 15 a 30 mins es mejor.. esto evitara algunas contraoperaciones cuando el mercado se mueve muy rapido.

saludos,

//+------------------------------------------------------------------+ //| MakeGrid.mq4 | //| Copyright © 2005, hdb | //| http://www.dubois1.net/hdb |+------------------------------------------------------------------+ #property copyright "Copyright © 2005, hdb" #property link "http://www.dubois1.net/hdb" //#property version "1.4beta" extern string GridName = "Grid"; // identifica la rejilla. permite la coexistencia de varias rejillas extern double Lots = 0.1; // extern double GridSize = 6; // pips entre órdenes - tamaño de la rejilla o de la malla extern double GridSteps = 12; // número total de órdenes a colocar extern double TakeProfit = 6 ; // número de ticks para tomar beneficios. normalmente es = tamaño de la rejilla pero se puede anular extern double StopLoss = 0; // si se quiere añadir un stop loss. las cuadrículas normales no usan stop loss extern double UpdateInterval = 1; // actualiza las órdenes cada x minutos extern bool wantLongs = true; // queremos posiciones largas extern bool wantShorts = true; // queremos posiciones cortas extern bool wantBreakout = true; // queremos largos por encima del precio, cortos por debajo del precio extern bool wantCounter = true; // queremos largos por debajo del precio, cortos por encima del precio extern bool limitEMA34 = false;      // queremos largos por encima de la ema solamente, cortos por debajo de la ema solamente extern double LastUpdate = 0; // contador utilizado para anotar la hora de la última actualización extern double GridMaxOpen = 0; // número máximo de posiciones abiertas //+------------------------------------------------------------------+ //| función de inicialización experta | //+------------------------------------------------------------------+ int init() { //---- #property show_inputs // muestra los parámetros - gracias Slawa...    
 if ( TakeProfit <= 0 ) // { TakeProfit = GridSize; } //---- return(0); } //+------------------------------------------------------------------------+ //| comprueba si hay una posición u orden abierta en la región de atRate | //| comprobará los largos si checkLongs es verdadero, si no, comprobará | //| los cortos | //+------------------------------------------------------------------------+ bool IsPosition(double atRate, double inRange, bool checkLongs ) { int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++) // escanea todas las órdenes y posiciones... { OrderSelect(j, SELECT_BY_POS); if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // sólo busca si mi cuadrícula y símbolo... { int type = OrderType(); if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // no busca el precio exacto sino la proximidad del precio (menos que el tamaño de la cuadrícula) { if ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT | type == OP_SELLSTOP ) ) ) { return(true); } } } 

   return(false); } //+------------------------------------------------------------------+ //| función de inicio del programa de script | //+------------------------------------------------------------------+ int start() { //---- int i, j,k, ticket, entermode, totalorders; bool doit; double point, startrate, traderate; //---- if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // actualizamos la primera vez que se llama y cada UpdateInterval minutos { LastUpdate = CurTime();
   Print("Updating"); point = MarketInfo(Symbol(),MODE_POINT); startrate = ( Ask + point*GridSize/2 ) / point / GridSize; // redondea a un número de ticks divisible por GridSize k = startrate ; k = k * GridSize ; startrate = k * point - GridSize*GridSteps/2*point ;          ¡// calcular el punto de entrada más bajo double 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) == false )           // prueba si no tengo órdenes abiertas cerca de mi precio: si es así, pon una { double myStopLoss = 0; if ( 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 )           // comprueba si no tengo órdenes abiertas cerca de mi precio: si es así, pon una { myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate+punto*StopLoss ; } if ( traderate > Bid ) { entermode = OP_SELLLIMIT; } 
              si no { 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); }+------------------------------------------------------------------+
 
Gracias, hdb. Pero quizás no entiendo exactamente cómo piensas en las cuadrículas porque no veo una razón por la que actualizar demasiado pronto sería malo. La omisión de una entrada impediría que la parrilla alcance todo su potencial. Cuando la ejecuto manualmente, actualizo las órdenes en el momento en que algo cambia. Yo ejecuto rejillas de retroceso, no rejillas de ruptura, así que tal vez ahí radica la diferencia, pero con los retrocesos usted se beneficia de la picada y así mantener la rejilla libre de agujeros es ideal.
 
soma,

Sí, tal vez tengas razón... así que lo mejor sería actualizar con frecuencia pero sólo unas pocas ranuras de la red... aunque hay que probarlo. No tengo una opinión firme.

reagrds,
 
Bueno, estaba esperando un momento favorable para publicar una actualización de la red, ya que su rendimiento ha sido realmente pésimo últimamente.
La semana siguiente a mi última actualización, estuve de vacaciones y la red estuvo parada. La semana pasada, la red estuvo funcionando la mayor parte del tiempo.
La desconecté unas cuantas veces cuando el margen disponible era cero y puse "sólo largos" en la mayoría de los mayores.
Hoy ha sido un día de superretorno.

Saldo : 93 (+10 desde hace 10 días)
Margen utilizado : +15k
Margen disponible : +28k
p&l irreal : -49k (-11 desde hace 10 días)
Saldo : 44k

El neto es 1k peor que hace 10 días y 5k por debajo del saldo inicial.

Lo realmente difícil en todo esto es tratar de limitar el drawdown. ¡Realmente tengo que encontrar la manera de hacerlo!
 
Creo que la única manera de evitar el drawdown es utilizar métodos discrecionales
es decir, saber cuándo dejar de añadir órdenes y cuándo dejar de añadir, por ejemplo, posiciones cortas.

Empecé con un balance de 100K después de empezar mal por usar un tamaño de lote demasiado grande y ser forzado a cerrar muchas posiciones.

Saldo: 97 594.19 Saldo hace 2 semanas 83k
Margen libre: 6 016,88
P/L flotante: -38 960,45 fue tan malo como -56k
Margen: 52 616,86

el último par de días había sido realmente lento el nivel de margen era tan bajo como 93%

pero ahora todas las grandes empresas parecen haber dado un giro por el momento
el nivel de margen ha vuelto a ser del 130%.
 
De acuerdo, darkstonexa, creo que u puede ser correcto - pero estoy probando algunas variaciones automatizadas basadas om ema y macd... No soy demasiado optimista sin embargo.

Un amigo también tiene uno con un stoploss corriendo... ¡y está luchando por mantenerse a flote! Pero eso sí que resuelve el problema de la reducción de la rentabilidad.

Mientras tanto, he limpiado mis posiciones - todas las posiciones con un fuerte interés negativo y bien en la pérdida (unos 100 pips) se cerraron.

¡Así que mis parrillas ahora están listas para otro golpe en la cabeza (margen bact al 430%) !
 
Bueno, lo que es un buen 2 días que tuvimos ... ayer vio mi red + 5k en el verde (la equidad fue 54k, empecé con 49k ) después de semanas de comercio bastante catastrófico.

¡Suerte que podemos probar en cuentas demo!

Ahora que he vuelto a una posición "razonable", he configurado todos los pares de divisas para que hagan lo siguiente
1) negociar sólo en la dirección del interés de arrastre positivo (a menos que el interés esté cerca de 0, entonces hacerlo en ambos sentidos)
2) sólo se puede operar en largo por encima de la ema 34, y en corto por debajo de la ema 34
3) para las divisas de 2 vías, utilizar el macd en el gráfico de 5 minutos para decidir si es largo o corto

¡Veremos lo que da esto!

ps. ¡Me gustaría que el back testing funcionara!
 
Hola hdb,

He tomado su asesor en EURUSD, el comercio de ambos lados como la ruptura.

Ahora me gustaría preguntarle, si ya se ejecuta en el siguiente problema:

Después de un tiempo, tengo más de una orden en algunas de las mismas posiciones de la red. A veces hay dos, pero también he visto 5 y más de ellos.

Por lo que entiendo del código, sólo debería haber una abierta en una posición de la cuadrícula a la vez.

He trasteado convirtiendo todos los dobles a int antes de comparar porque en MQL2 he encontrado un problema similar al comparar valores dobles.

¿Te has encontrado con algo similar?

Con saludos,

cori