Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 94

 
void CheckForClose()
  {
   double PriceHigh, PriceLow;
//---- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
   
   PriceHigh = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 1, 0); 
   PriceLow = iCustom (Symbol(), 0, "ExtremeTMALine", TimeFrame, HalfLength , Price, ATRMultiplier, ATRPeriod, Interpolate, TrendThreshold, Distances, 2, 0); 
   
   
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
      //---- check order type 
      if(OrderType()==OP_BUY)
        {
         if(Low[1]<=PriceHigh && Ask>PriceHigh) OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(Ask<=PriceLow && High[1]>PriceLow) OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
         break;
        }
     }
//----
  }

artmedia70

Volviendo a mis espolones, respecto a cerrar una posición cuando el precio cruza una línea indicadora. Creo que el error está en esta función

if(Volumen[0]>1) return;

He leído en el tutorial que en lugar de contar los ticks podemos abrir (cerrar) una posición al aparecer las barras. ¿Es posible? Si es así, puedes darme una pista de cómo programarlo para mi situación.

 
alexey1979621:

artmedia70

Volviendo a mis espolones, respecto a cerrar una posición cuando el precio cruza una línea indicadora. Creo que el error está en esta función

if(Volumen[0]>1) return;

He leído en el tutorial que en lugar de contar los ticks podemos abrir (cerrar) una posición al aparecer las barras. ¿Es posible? Si es así, puedes enviarnos una pista sobre cómo programarlo para mi situación.

Tal vez sea útil:

La función devuelve true cuando aparece una nueva barra en M15

bool CheckOpenM15()
{
   static int PrevTime=0;
   if (PrevTime==iTime(NULL, PERIOD_M15,0)) return(false);
   PrevTime=iTime(NULL, PERIOD_M15,0);
   return(true);
}
 
ex1m:

Por favor, ¡acompáñeme!

Escribo los pedidos pendientes a una hora determinada

{

Definir la hora de apertura

}

if ((condition)==true)//
{
OrderSend ( OP_BUYSTOPP, parameters);// abrir una orden BuyStop pendiente
OrderSend ( OP_SELLSTOP, parameters);// abrir una orden SellStop pendiente
}

Creo que escribí la hora correctamente; la detecta pero por alguna razón, abre o bien Sell Stop o Buy Stop y no abre dos órdenes a la vez. Intento abrir dos órdenes pendientes de diferentes tipos (Bistop y Sellstop) al mismo tiempo y una por una. La pregunta parece ser primitiva, por favor, ayuda para dummies).

Para pegar el código correctamente aquí, haga clic primero en SRC y luego copie el código allí.

Si he entendido bien, ¿en un momento determinado tengo que abrir un OP_BUYSTOP y un OP_SELLSTOP? ¿Es aceptable tener otras órdenes pendientes en este momento? Por ejemplo, hay pedidos pendientes, pero tenemos que borrar los antiguos antes de abrir los nuevos?

 
artmedia70:
Este error se refiere a los objetos gráficos, no a las órdenes

.
¡Exactamente! El error se refiere a los objetos, pero no tengo objetos en este EA...


borilunad:
¡Buenas tardes, Víctor! Es extraño, ¡la orden pendiente no es un objeto! Tal vez tenga algún objeto que ya debería haber sido eliminado, pero no lo fue.

¡Buenas tardes, Boris! El Asesor Experto no crea objetos. Este error proviene de la función que coloca una orden pendiente. Aquí está la versión de la función (para el probador):

bool OpenPendingBuy(double lot, double price)
{
   int g_ticket = -1;
   double OOP = price + i_distanceFromLastPos * pt;

   if (OOP > Ask)
   {
       fCheck_ValidPendingOOP(Symbol(), OP_BUYSTOP, OOP);
       
       g_ticket = OrderSend(Symbol(), OP_BUYSTOP, lot, ND(OOP), 30, 0, 0, NULL, i_magic, 0, CLR_NONE);
   }
   if (g_ticket > 0)
   {
       return (true);
   }
   else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());
   
   return (false);
}

Si no se ha realizado un pedido, significa que se ha producido un bloqueo:

else
       pr ("OpenPendingBuy(): Ордер послать не удалось " + GetLastError());

Este es el bloque que informa de un error.


¿Alguien ha entendido la lógica?

 
artmedia70:

Ya que no hay respuesta a la pregunta, aquí hay una función que devolverá el ticket del último pedido establecido:



Gracias!!! justo lo que necesito

 
hoz:
¡Exactamente! El error se refiere a los objetos, pero no tengo objetos en este EA...

¡Buenas tardes, Boris! El Asesor Experto no crea objetos. Este error proviene de la función que coloca una orden pendiente. Aquí está la versión de la función (para el probador):

Si el pedido no se ha realizado, significa que se ha producido un bloqueo:

Este es el bloque que informa de un error.

¿Alguien ha entendido la lógica?

Entonces, ¿revisa su comprobación de errores? Debe haber algún fallo ahí.
 
borilunad:
Entonces, ¿revisa su comprobación de errores? Debe haber algún fallo ahí.

Je)) ¿Qué hay de malo en Boris? Todo es transparente...

pr es una función de impresión. Y el error, ya es una constante estándar. Lógicamente, no es en absoluto inaceptable un acuerdo de este tipo. Si todavía tienes alguna sospecha sobre la función pr, aquí la tienes:

//+-------------------------------------------------------------------------------------+
//| Распринтовка на экран                                                               |
//+-------------------------------------------------------------------------------------+
void pr (string txt)
{
string info [];
ArrayResize(info,20);
string h,m,s,cm; int i;
h=DoubleToStr(Hour(),0);    if (StringLen(h)<2) h="0"+h;
m=DoubleToStr(Minute(),0);  if (StringLen(m)<2) m="0"+m;
s=DoubleToStr(Seconds(),0); if (StringLen(s)<2) s="0"+s;
txt=h+":"+m+":"+s+" - "+txt;
for(i=20-1; i>=1; i--)
info[i]=info[i-1];
info[0]=txt;
for(i=20-1; i>=0; i--)
if(info[i]!=""){
cm=info[i];
ObjectCreate ("txtw"+i,OBJ_LABEL,0,0,0);
ObjectSet    ("txtw"+i,OBJPROP_CORNER,1);
ObjectSet    ("txtw"+i,OBJPROP_XDISTANCE,10);
ObjectSet    ("txtw"+i,OBJPROP_YDISTANCE,30+15*i);
ObjectSetText("txtw"+i,cm, 10, "Times New Roman", Green);}}
 

  • ¿Alguien entiende la lógica?


¿Está el lote normalizado? Bueno y comprueba el precio.

¿Son globales i_magic, pt, i_distanceFromLastPos?

 
splxgf:

i_magic, pt, i_distanceFromLastPos son globales?


Sí. Las variables con i_ son variables de entrada (de la palabra intut, que puede ser cambiada por el usuario...), y pt es una variable global también, que es visible en todas partes...
splxgf:


  • ¿Alguien entiende la lógica?


¿Está el lote normalizado? Bueno y comprueba el precio.


No, el lote no se ha normalizado. Nunca lo encontré en el probador... ¿Y qué tiene que ver el lote con el objeto (error 4200)?
 
hoz:

De vez en cuando, pero no constantemente, me sale un error 4200 cuando pongo una orden pendiente. Según la documentación, este error significa que el objeto ya existe:

ERR_OBJECT_ALREADY_EXISTS 4200 Объект уже существует

¿Resulta que una orden de este tipo ya está en el mercado cuando se envía la orden pendiente?

Tal vez, algún otro programa crea un objeto gráfico con el mismo nombre, al que el EA reacciona. Tal vez haya que cambiar los nombres de los objetos.