¿Código de error "0"?

 

Me cuesta entender por qué las posiciones largas funcionan y las cortas no?

Tengo la sensación de que tiene algo que ver con mi función init para determinar el número de decimales con el corredor dado a mano. (ya que esto parece ser el culpable de por qué las órdenes fantasmas son lanzadas justo al principio de cuando inicio el probador...)

¿Alguien tiene alguna idea de por qué el lado corto me está diciendo este error?


Gracias de antemano (el código es un poco desordenado en este momento, tengo la intención de limpiarlo, por supuesto)

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {

   double ticksize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (ticksize == 0.00001 || ticksize == 0.001) // if you set this to 0 it WONT throw an order out straight away.
   pips = ticksize*10;
   else pips = ticksize;  
   

   return(0);
  }
//+----

//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   
  int PositionIndex;    //  <-- this variable is the index used for the loop
  int TotalNumberOfOrders;   //  <-- this variable will hold the number of orders currently in the Trade pool
  TotalNumberOfOrders = OrdersTotal();    // <-- we store the number of Orders in the variable
   
   
   double s12 = iMA(NULL,60,60,0,1,0,1); 
   double i121 = iMA(NULL,60,60,0,1,0,1);
   
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;

   int iTBT= iBarShift(NULL,60, triggerBarTime, true),
        iHH= iHighest(NULL,60, MODE_HIGH, iTBT + 1, 0); 
            double buyPrice = High[iHH]+PadAmount*pips;
   
   
    int iTBT_1= iBarShift(NULL,60, triggerBarTime1, true),
        iLL= iLowest(NULL,60, MODE_LOW, iTBT_1 + 1, 0); 
            double sellPrice = Low[iLL]-PadAmount*pips;
            
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = buyPrice-buy_stop_price;         
   double buy_takeprofit_price = (pips_to_bsl*RewardRatio)+buyPrice;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; 
   double pips_to_ssl = sell_stop_price-sellPrice;     
   double sell_takeprofit_price = sellPrice-(pips_to_ssl*RewardRatio);
   
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//+----------------------------------------------------------------------------------------------------------------------------------------+   
   
  
if (direction==0) //--Buy--//
   {
      
      {
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) 
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
      
      if(BuyTicketOrder > 0)
         {
         Print("Order Placed #", BuyTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
  
      }
   }

            
if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  
      int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
      if(SellTicketOrder > 0)
         {
         Print("Order Placed #", SellTicketOrder);
         }
      else
         {
         Print("Order Send Failed, error # ", GetLastError());   
         }
 
      }
   }
} 
 

¿entra en las operaciones cuando comentas?

//if(OpenOrdersThisPair(Symbol())==0
¿entra en las operaciones cuando
LotSize = 0.1;
etc. Trabaje hasta que empiece a entrar en las operaciones, una vez allí probablemente sabrá cuál es el problema.
 
Sí, entra en el lado largo, incluso con el tamaño del lote "0"...

Cambiar el OpenOrderThisPair tampoco funciona.... Hmmm. Es muy extraño...
 
DomGilberto:
Si entra en el lado largo incluso con tamaño de lote "0"...

Cambiar el OpenOrderThisPair tampoco funciona.... Hmmm. Es muy extraño...

Si esta prueba devuelve un valor distinto de cero. . .

if(OpenOrdersThisPair(Symbol()) == 0)  

. . no se llama a OrderSend(), pero se sigue comprobando si SellTicketOrder es mayor que 0 . . .

Haz esto. . .

if (direction==1)//--Sell--//
   {
      {
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)
         {
         int SellTicketOrder = OrderSend(Symbol(),OP_SELLSTOP,LotSize,sellPrice,3,ssl,stp,NULL,MagicNumber,0,Red); 
  
         if(SellTicketOrder > 0)
            {
            Print("Order Placed #", SellTicketOrder);
            }
         else
            {
            Print("Order Send Failed, error # ", GetLastError());   
            }
         }
      }
 
No - parece que no quiere enviar la orden de venta...

Debe ser un error en la forma en que escribí el código con respecto a las declaraciones "IF" dentro del bucle for que envía la función OrderEntry para activar una orden...
 
DomGilberto:
No - parece que no quiere enviar la orden de venta...

Debe ser un error en la forma en que escribí el código con respecto a las declaraciones "IF" dentro del bucle for que envía la función OrderEntry para activar una orden...

Entonces, ¿qué error obtiene ahora? si no obtiene ninguno y no obtiene "Order placed # 12345" entonces el OrderSend() no está siendo llamado y tiene un problema con su función OpenOrdersThisPair()... publique su código.
 
Cuando esto se ejecuta, funciona bien para el lado largo (he estado jugando con esto durante las últimas 2 horas). La cosa es, que muy probablemente le daré cuerda a usted y a cierta persona, ya que sé dónde me estoy equivocando (donde llamo a la función"CheckForMaTrade") con respecto a las declaraciones IF relativas a los parámetros de la media móvil, y cómo si son "verdaderos" enviará OrderEntry a OrderSend... El problema es que todavía estoy aprendiendo a escribir esa parte correctamente...
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

int start()
  {
//----
   
   if(OpenOrdersThisPair(Symbol())>=1)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();
      if(UseTrailingStop)AdjustTrail();
      if(Use_MA_Trail)MA_Trail();
      }
      if(IsNewCandle())CheckForMaTradeLong();
      if(IsNewCandle())CheckForMaTradeShort();
//----
   return(0);
  }
 
DomGilberto:
Cuando esto se ejecuta, funciona bien para el lado largo (he estado jugando con esto durante las últimas 2 horas). La cosa es, que muy probablemente le daré cuerda a usted y a cierta persona, ya que sé dónde me estoy equivocando (donde llamo a la función "CheckForMaTrade") con respecto a las declaraciones IF relativas a los parámetros de la media móvil, y cómo si son "verdaderos" enviará OrderEntry a OrderSend... El problema es que aún estoy aprendiendo a escribir bien esa parte...

RaptorUK:
¿Qué error obtienes ahora? Si no obtienes ninguno y no obtienes "Order placed # 12345" entonces el OrderSend() no está siendo llamado y tienes un problema con tu función OpenOrdersThisPair()... publica tu código.


Entonces .. . . qué error obtiene, etc...
 
Oh, lo siento - Ya no estoy recibiendo ningún error de lo que sea. Sólo recibo órdenes de compra y no órdenes de venta...

¡Es en relación con mi hilo anterior con respecto a los cruces de MA - Todavía no lo entiendo! ¡Pero no quiero dar cuerda a nadie y golpear un caballo muerto mientras la gente me está dando la respuesta (aunque no entiendo la respuesta lol)! ¡Gracias RaptorUK por su ayuda!
 
     if(IsNewCandle())CheckForMaTradeLong();
     if(IsNewCandle())CheckForMaTradeShort();
Aunque apoyo las operaciones de factorización en funciones, no lo hago para la mayoría de las variaciones de Nueva Vela/Nueva Barra porque esa función sólo puede ser llamada UNA VEZ [por start()].
int start(){
   static datetime time0; bool isNewCandle = time0 != Time[0]; time0 = Time[0]; // Once per start only.
   :
      if(isNewCandle)CheckForMaTradeLong();
      if(isNewCandle)CheckForMaTradeShort();
 
Gracias WHRoeder - ¡buen consejo!