[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 323

 
Dentro de la selección, después de los filtros por símbolo y magik (si lo hay), es decir, comprobamos la orden por la hora de cierre, si no es igual a cero (la orden está cerrada), prohibimos que se vuelva a cerrar
 
FAQ:
Dentro de la selección, después de los filtros por símbolo y magik (si los hay), es decir, comprobamos la orden por la hora de cierre, si no es igual a cero (la orden está cerrada), entonces prohibimos volver a cerrarla


Gracias. ¡Probaré el de arriba entonces!

Aquí, trató de insertar, lo corrió en la demo, pero algo sale más errores y diferente. Pregunto primero, desde la estufa, sobre este código de Doka:

  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)
    {
     datetime ctm=OrderOpenTime();
     int      ticket=OrderTicket();
     if(ctm>0) Print("Время открытия ордера № ",ticket," ",ctm);
     ctm=OrderCloseTime();
     if(ctm>0) Print("Время закрытия ордера № ",ticket," ",ctm);
    }
  else
    Print("OrderSelect() вернул ошибку ",GetLastError());

Lo que es superfluo aquí, intercalar entre Selecta Trades, controles de símbolos, magik... и ... tipo de orden. ¿Quizás introducir datetime cmt e int ticket al principio? Y la impresora escribe otros errores.

Y añade una condición de cierre:

if(ctm == 0) {CloseOrder(OrderTicket(),OrderLots(),Bid,slip,Yellow);return(0);} else continue;

Ayuda, por favor.

 

Hola, ¿podría darme una pista?

Quiero abrir una orden no inmediatamente con stp y sl, sino establecer stp y sl después de abrir la orden modificándola

Lo hice:

ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen)
{
OrderSelect(ticket,SELECT_BY_TICKET);
}
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Blue);
return(0);

}


No sé qué demonios estoy haciendo.

¿verdad?

 
RMX13:

Hola, ¿podría darme una pista?

Quiero abrir una orden no inmediatamente con stp y sl, sino establecer stp y sl después de abrir la orden modificándola

Lo hice:

ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen)
{
OrderSelect(ticket,SELECT_BY_TICKET);
}
{
OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Blue);
return(0);

}


No sé qué demonios estoy haciendo.

¿verdad?



¡Y no lo entiendo y más! Utilizar el SRC para delinear el código, ver arriba?
 
int orderOpen(int cmd, double open, int stopLossPips, int takeProfitPips, int magicNumber){       
      double sl=0, tp=0;
      if(stopLossPips>0){
         stopLossPips = MathMax(stopLossPips,MarketInfo(Symbol(),MODE_STOPLEVEL)+3*_pipsMultiplyer);
      }
      if(takeProfitPips>0){
         takeProfitPips = MathMax(takeProfitPips,MarketInfo(Symbol(),MODE_STOPLEVEL)+3*_pipsMultiplyer);
      }
      int ticket=-1;
      if(_doTrade){        
         double lots  = OrderLotSize();
         if(lots>=MarketInfo(Symbol(), MODE_MINLOT)){          
            //wait context
            if(TradeIsBusy() < 0) {
                 return(-1); 
            }
            if(cmd==OP_BUYSTOP || cmd==OP_BUY || cmd==OP_SELLLIMIT){
               RefreshRates();
               if(cmd==OP_BUY){
                  open=Ask;
               }
               if(stopLossPips>0){
                  sl=NormalizeDouble(open-stopLossPips*Point,Digits);
               }
               if(takeProfitPips>0){
                  tp=NormalizeDouble(open+takeProfitPips*Point,Digits);
               }
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,sl,tp,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,SpringGreen);              
            }else{
               RefreshRates();
               if(cmd==OP_SELL){
                  open=Bid;
               }
               if(stopLossPips>0){
                  sl=NormalizeDouble(open+stopLossPips*Point,Digits);
               }
               if(takeProfitPips>0){
                  tp=NormalizeDouble(open-takeProfitPips*Point,Digits);
               }
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,sl,tp,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,Red);
            }
Para empezar, ¿es esta pieza la responsable de abrir un pedido?
 
Lo descubrí yo solo.
 
borilunad:


Gracias. ¡Probaré lo anterior entonces!

Aquí, trató de insertar, lo corrió en la demo, pero algo sale más errores y diferente. Primero pregunto, desde la estufa, sobre este código de Doki:

Lo que sobra aquí es insertar entre Selecta Trades, controles de símbolos, magik... и ... tipo de orden. ¿Quizás introducir datetime cmt e int ticket al principio? Y la impresora escribe otros errores.

Y añade una condición de cierre:

¡Por favor, ayuda!


Eh, como dice el refrán: "aprende el alumno" (c)

for(int i=OrdersTotal()-1;i>=0;i--){
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES){
      if(OrderSymbol()!=Symbol()){continue;}// фильтр по символу(если не наш символ, то пропускаем)
      if(OrderMagicNumber()!=magik){continue;}// фильтр по магику
      if(OrderCloseTime()!=0){continue;}// фильтр по времени закрытия (если не=0 то ордер уже закрыт)
      if(OrderType()<=OP_SELL){//закрытие для рыночных ордеров
         OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
      }else{// закрытие для отложенных ордеров
         OrderDelete(OrderTicket());
      }
   }
}

Eliminar (comentar) lo que no es necesario.

 
               ticket=OrderSend(Symbol(),cmd,lots,NormalizeDouble(open,Digits),5*_pipsMultiplyer,_orderComment,GenerateMagicNumber(magicNumber,Symbol(),Period()),0,Red);
            OrderSelect(ticket,SELECT_BY_TICKET);
            OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0);

Un fragmento de código que abre una orden y establece un stop loss y un take profit

El terminal genera los siguientes errores: EURUSD,M30: OrderSend error 130

EURUSD,M30: entrada no válida para la función OrderModify

EURUSD,M30: Error de OrderModify 4051

EURUSD,M30: OrderSend failed with error #4051 bid:1.23674000 ask:1.23683000 Open:1.23674000 SL:1.2423 TP:1.2283 MODE_STOPLEVEL:0.00000000 LOT:0.01000000

¿Cuál es el problema?


 
FAQ:


Eh, como dice el refrán: "Estudia, estudiante" (c).

Eliminar lo innecesario (comentarlo)


¡Muchas gracias! Yo también soy un aprendiz de por vida. Y en general, aprender es más interesante que trabajar. Voy a intentar ajustarlo ahora, no quiero cambiar el orden en el código. En cualquier momento cambio o añado condiciones en función de los cambios en el comportamiento del mercado. ¡Todo lo mejor para ti y buenas noches!
 
RMX13:

Un fragmento de código que abre una orden y establece un stop loss y un take profit

El terminal genera los siguientes errores: EURUSD,M30: OrderSend error 130

EURUSD,M30: entrada no válida para la función OrderModify

EURUSD,M30: Error de OrderModify 4051

EURUSD,M30: OrderSend failed with error #4051 bid:1.23674000 ask:1.23683000 Open:1.23674000 SL:1.2423 TP:1.2283 MODE_STOPLEVEL:0.00000000 LOT:0.01000000

¿Cuál es el problema?

RMX13, todos tienen el mismo problema. Para evitar el error 130, es necesario normalizar todos los cálculos con los precios, los lotes y las condiciones, especialmente cerca de los precios teniendo en cuenta el spread, el stoplevel y el freezevel, y el slippage, que debe ser aumentado en función de la volatilidad. Sólo asc no necesita ser normalizado, pero si se le añade algo, tiene que ser con Dígitos, y lotes con 2 (centavos), etc. en todo el código, y por supuesto el manejo de errores en todas las funciones de comercio, para no molestar al CC para nada. Buena suerte.

¡Ver en Doc: OrderSend(Todo debe coincidir con el contenido en el orden establecido)! Por eso hay errores(:((

Razón de la queja: