[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 180

 
solnce600:

¡Buenos días a todos!

Soy un principiante. Es la primera vez que intento plasmar una idea en código en el probador.

La idea es simple: abrir una orden al precio de apertura de cada vela horaria, alternativamente hacia arriba y hacia abajo.

He escrito un código sencillo .... Pero el problema es que el programa a veces abre más de 1 orden en la apertura de una vela.

Me parece que ocurre cuando se produce más de un tick en un segundo.

Como alternativa, he intentado poner en la cabecera de la condición if( ) ...

Total de pedidos()==0

Sólo se abre realmente una orden.



Pero esta variante no me conviene porque al día siguiente la vela dada no se abre, ya que en el momento de la apertura de esta vela

ya hay un número aleatorio de órdenes en el comercio.

También he intentado interrumpir OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP); interrumpir la ejecución de start() con return; ..... no ayudó.


Te agradecería que me dijeras cómo hacer para que sólo se abra 1 orden en cualquier tick en 1 segundo.

int inicio()

{
doble Precio=Preguntar;
doble SL=Precio-300*Punto;
doble TP=Precio+300*Punto;
if( Hora()==10 && Minuto()== 00 && Segundos()==00)
OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP);
}

Prueba esta variante:
int TimeNow, TimePrev, PrevType;

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

  TimeNow=iTime(NULL,0,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);
   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);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }
 }
 
alsu:


Muchas gracias por su pronta respuesta.
 
Diubakin:
Prueba esta opción:
Muchas gracias por su pronta respuesta.
 
Estimados profesionales ¿Dónde puedo encontrar la función SloseBy() que funciona en modo manual? Quiero añadirlo a mis búhos, para poder cerrar la posición con máximo menos a la de máximo más, no manualmente, sino automáticamente según las condiciones. No he podido encontrarlo en codebase. No lo he encontrado en codebase. ¡Gracias!
 
borilunad:
¡Ev. profesionales! ¿Dónde puedo encontrar la función СloseBy(), que funciona en modo manual? Quiero añadirlo a mis Búhos, para que no sea posible cerrar la posición con el máximo menos al contrario con el máximo más, sino automáticamente, según las condiciones. No he podido encontrarlo en codebase. No lo he encontrado en codebase. ¡Gracias!

Prueba esta opción:

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); }
 

Sergei, a simple vista vale la pena. Lo atornillaré, haré las condiciones y lo probaré. ¡Muchas gracias!

Lo he probado, ¡funciona sin errores! ¡Ahora sólo queda experimentar con las condiciones, para conseguir el efecto, y estará bien! ¡Pero eso es para mañana!

Muchas gracias. ¡Y sueños interesantes!

 
borilunad:
Sergei, a simple vista vale la pena. Lo atornillaré, haré las condiciones y lo probaré. ¡Muchas gracias!
Sólo que en lugar de un comando de contra-cierre, inserte una función de contra-cierre completa - de lo contrario es sólo para el probador. E inicializar las variables en la función.
 
artmedia70:
Sólo que en lugar de un comando de contra-cierre, inserte una función de contra-cierre completa - de lo contrario es sólo para el probador. E inicializar las variables en la función.
Gracias Artyom, era demasiado tarde. ¡Haré todo de acuerdo a las reglas para el online hoy!
 
borilunad:
¡Gracias, Artyom! Era demasiado tarde. ¡Hoy se hará todo según las reglas para el online!
Buena suerte...
 

Buenas tardes. Tengo una pregunta de este tipo.

He rediseñado este indicador para mis propias necesidades con gran dificultad a partir de trozos de código de otros Asesores Expertos e Inductores. No es un código grande y funciona como quiero.

El asunto es que realiza algunos cálculos internamente y muestra flechas hacia arriba o hacia abajo en el gráfico.

Por favor, aconsejar cómo hacer un Asesor Experto para abrir una orden en la dirección correcta cuando la flecha aparece en el gráfico

Más concretamente, sólo necesito saber qué flecha está activa ahora, creo que puedo hacer el resto

Aquí hay un trozo de código para que quede más claro; es una inicialización en el indicador

   SetIndexBuffer(1, Vverh);

   SetIndexStyle(1,DRAW_ARROW);

   SetIndexArrow(1,233);

   

   SetIndexBuffer(2,Vniz);

   SetIndexStyle(2,DRAW_ARROW);

   SetIndexArrow(2,234); 

Gracias de antemano

Razón de la queja: