[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 190

 

Sergey Dubakin ofreció amablemente la función CloseBy, pero lamentablemente no cumple la condición importante para mí de cerrar una posición con una pérdida máxima con la posición opuesta con un beneficio máximo:


avatar
19
Diubakin 25.02.2013 23:26
borilunad:
¡Uv. pro! ¿Dónde puedo encontrar la función СloseBy() que funciona en modo manual? Quiero insertarlo en mi búho para poder no manualmente, sino automáticamente según las condiciones cerrar la posición con un máximo menos el contrario con un máximo más. No he podido encontrarlo en codebase. No lo he encontrado en codebase. ¡Gracias!

Prueba esta variante:

bool LockOFF(int posit, int oppos, color arrow_color) {
double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }

He hecho funciones que definen maxloss GetMaxLoss() y maxprofit GetMaxProfit(), pero no puedo hacer que LockOFF() seleccione un par que he especificado en lugar de cualquiera de ellos. Por favor, muéstrame en qué lugar poner mis máximos, y tal vez necesito más funciones para determinar la entrada o el índice de esas posiciones, entonces no es un problema para mí, pero ¿dónde poner todo en este LockOFF()? Gracias.

 
borilunad:

Sergey Dubakin ofreció amablemente la función CloseBy, pero desafortunadamente no cumple una condición importante para mí, es decir, cerrar una posición con una pérdida máxima por una posición opuesta con un beneficio máximo.

Hola, esta función cierra una posición con una pérdida máxima con la posición opuesta con un beneficio máximo. Aquí hay un EA de prueba para el probador:

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
 }

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие!"); return(false); }
 
 return(true); }

Abre posiciones de compra y venta alternativamente cuando aparece una nueva barra de 4 horas y hace un cierre opuesto cuando se abre un nuevo día.

 
Diubakin:

Hola, la función cierra la posición con la máxima pérdida con la posición opuesta con el máximo beneficio. Aquí hay un EA de prueba para el probador:

Abre posiciones de compra y venta alternativamente cuando aparece una nueva barra de 4 horas y hace un cierre opuesto cuando se abre un nuevo día.

Hola Sergey, ¡tengo un algoritmo diferente! El caso es que esta función cierra lo que tiene, y necesito que cierre el máximo, ¡no ninguno! Pues nada, ¡lo terminaré yo mismo si nadie me ayuda! Su versión sólo sirve para el probador, por lo que se añade a la cabecera de acuerdo con las normas. ¡Funciona bien sin errores, pero no selecciona el máximo! De todos modos, ¡gracias por su ayuda!
 
alsu:

Eso es, ya lo tengo. Si el precio en la barra actual alcanza Open[0] + 30, entonces abrimos. Si la barra ha terminado, entonces Open[0] ha cambiado y el nivel de apertura se desplaza en consecuencia. Sólo debería haber una operación en el mercado, ¿no?

Entonces es así:

No es necesario hacer un seguimiento de la nueva barra, porque cuando se forme, el sistema añadirá automáticamente un nuevo valor a Open[0] y esto significa que el nuevo nivel se calculará correctamente. Por favor, tenga en cuenta que la operación de COMPRA se abre al precio Ask actual, mientras que se cierra (TP y SL) al precio Bid. Además, los valores de los precios deben ser normalizados.


Muchas gracias por su ayuda.

Pero abre operaciones en el probador en cada vela minuto. La información está en este enlace http://clip2net.com/s/2T98Y

Quiero que abra una orden en una vela de cinco minutos, pero no en cada vela.

Pero sólo si la vela actual de cinco minutos es > o = 30 pips (desde el precio de apertura hasta su máximo).

Es decir, abrir una orden de mercado en el trigésimo punto desde el precio de apertura de la vela cero=actual de cinco minutos.

Y si el período actual de cinco minutos desde el precio de apertura hasta su máximo es inferior a 30 puntos, no debemos abrir una orden de mercado.

Es decir, las órdenes serán pocas, he contado en Excel, desde 1999 - un poco más de 3000 en euro-dólar en ambas direcciones.

Cambiamos al siguiente período de cinco minutos y si éste, es decir, el período actual de cinco minutos > o = 30 pips, entonces abrimos al trigésimo pips, si es menor, cambiamos al siguiente período de cinco minutos ... y así hasta el final del gráfico.

Pero la cosa es que, según una estimación aproximada, la mayoría de los pentaminos que > o = 30 pips están volando más de 15 pips que ser cerrados por un stop de 30 pips.

Usted tiene una condición - si no hay órdenes abiertas

Pero en mi sistema, se pueden formar dos periodos de cinco minutos con los parámetros descritos anteriormente de forma consecutiva y si la orden del periodo de cinco minutos anterior no se cierra, entonces no se abrirá ninguna orden en el segundo periodo de cinco minutos.

Necesito que se abra una orden en cada periodo de cinco minutos con los parámetros descritos anteriormente, independientemente de que haya una orden en la operación o no.

 
if (OrdesTotal()==0 && Close[0]>=Price)  
 
alsu:

Eso es, ya lo tengo. Si el precio en la barra actual alcanza Open[0] + 30, entonces abrimos. Si la barra ha terminado, Open[0] ha cambiado y el nivel de apertura se desplaza en consecuencia. Sólo debería haber una operación en el mercado, ¿no?

Entonces es así:

No es necesario hacer un seguimiento de la nueva barra, porque cuando se forme, el sistema añadirá automáticamente un nuevo valor a Open[0] y esto significa que el nuevo nivel se calculará correctamente. Por favor, tenga en cuenta que la operación de COMPRA se abre al precio Ask actual, mientras que se cierra (TP y SL) al precio Bid. Además, los valores de los precios deben ser normalizados.


Y también tiene una segunda condición - si el precio de cierre de los cinco minutos actuales >= precio de apertura de la orden.

Pero en mi idea el precio de cierre del período actual de 5 minutos puede ser cualquier precio, siempre y cuando su Alto sea > o = 30 pips.


Close[0]>=Price

 
borilunad:
Hola Sergei, ¡tengo un algoritmo diferente! Esa es la cuestión, esta función cierra lo que tiene y quiero que cierre las máximas, ¡no ninguna! Pues nada, ¡lo terminaré yo mismo si nadie me ayuda! Su versión sólo sirve para el probador, por lo que se añade a la cabecera de acuerdo con las normas. ¡Funciona bien sin errores, pero no selecciona el máximo! De todos modos, ¡gracias por su ayuda!

¿Cómo lo quieres? El que he puesto determina la posición más no rentable en la moneda de depósito (en dinero), luego determina la posición opuesta más rentable también en la moneda de depósito y hace un contracierre.

borilunad:

He implementado las funciones que determinan el maxloss GetMaxLoss() y el maxprofit GetMaxProfit() pero no puedo hacer que la función LockOFF() seleccione un par especificado por mí y no cualquiera de ellos. Por favor, muéstrame en qué lugar poner mis máximos, y tal vez necesito más funciones para determinar la entrada o el índice de esas posiciones, entonces no es un problema para mí, pero ¿dónde poner todo en este LockOFF()? Gracias.

La función lo tiene todo - definiendo la pérdida máxima, el beneficio máximo, la entrada también se define.

 
Diubakin:

¿Cómo lo quieres? El que has puesto, determina la posición más no rentable en la moneda de depósito (en dinero), luego determina la posición opuesta más rentable también en la moneda de depósito y hace un contracierre.

La función lo tiene todo: se define la pérdida máxima, el beneficio máximo y el ticket.

Se equivoca. Probablemente tú tengas el único par de posiciones opuestas, mientras que yo puedo tener más. Por eso pongo todos los datos en los comentarios y veo que no cierra maxiLoss maxiProfit, sino cualquiera de los primeros que me encuentro. Y mis funciones muestran claramente los índices de posición con máxima Pérdida y Beneficio. ¡Sólo queda añadir estas comprobaciones a LockOFF()!
 
borilunad:
Se equivoca. Probablemente tengas el único par de posiciones opuestas, mientras que yo puedo tener más, por eso pongo todos los datos en los comentarios y veo que cierra no maxiLoss maxiProfit, sino cualquiera de los primeros que salgan en la búsqueda. Y mis funciones muestran claramente los índices de posición con máxima Pérdida y Beneficio. ¡Sólo tengo que añadir estas comprobaciones a LockOFF()!
¿Ha visto el EA de prueba para esta función en el probador? Cierra exactamente la pérdida máxima con el beneficio máximo, sin importar cuántas órdenes haya: dos o veinte.
 
Vinin:

https://www.mql5.com/ru/code/7835 Sólo esto es un indicador. Hay que utilizar objetos en un EA.
Es el Asesor Experto lo que me interesa, los objetos - ¿debo dibujar una vela yo mismo?
 
Diubakin:
¿Has mirado la prueba EA para la función en el probador? Cierra exactamente la pérdida máxima con el beneficio máximo, sin importar cuántas órdenes haya: dos o veinte.
¡Claro que sí! Es cierto, no tengo más de tres. ¡He buscado por todas partes, en el probador en los resultados y en el diario, en la demo y en el gráfico también! Cuando lo haga, te lo enseñaré.