¿Un poco de ayuda? - página 2

 
WHRoeder:
  1. Por supuesto que no. RTFM. Sólo se obtiene un nuevo tick cuando se vuelve del inicio.
  2. RTFM y limitaciones del probador NO se puede dormir en el probador
  3. ¿Qué son los valores de retorno de la función? ¿Cómo los utilizo? - Foro MQL4


Gracias por su ayuda, he eliminado el bucle while y la ruptura a la función de inicio en cada ejecución de la orden, he eliminado la función IsTesting (por ahora) y mi OrderSend parece funcionar.


Ahora, sin importar dónde tenga la función Print(), no aparece nada en el diario (o en el libro de registro), la orden inicial se abre bien y luego nada, incluso si tengo mi orden de impresión como la siguiente línea en el código.

 
j.w.msb:

Gracias por su ayuda, he eliminado el bucle while y la pausa a la función de inicio en cada ejecución de la orden, he eliminado la función IsTesting (por ahora) y mi OrderSend parece estar funcionando.


Al ejecutarlo ahora no importa donde tenga una función Print() no aparece nada en el diario (o en el libro de registro) la orden inicial se abre bien y luego nada - incluso si tengo mi orden de impresión como la siguiente línea en el código?


¿como se ve el código ahora?
 
¡Siento ser una pesadilla en esto! Traté de encontrar información sobre los errores en el probador de la estrategia, pero googles no ser útil :s
//+------------------------------------------------------------------+
//|                                                   SMA scripy.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern int z=1234;
int total;
//---
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   int i;
   total=0;
   if (OrdersTotal()!=0)
      {
      for (i=OrdersTotal()-1; i>=0; i--)                                                     
         {
         if (OrderSelect(i,SELECT_BY_POS))
            {
            if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==z))
               {
               if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                  
               }
               if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                  
               }
               else 
                  {
                  total++;                                                                 
               }
            }
         }
      }
   }
//----
   return;
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
}
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int start()
   {
//----
   int i,L;
   if (AccountBalance()>50)                                                                                     
   {
//-----
double SMA6=iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0);
double SMA21=iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0);
double RSI70=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)<70;
double RSI30=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)>30;                                                                                                            
//----
   if (total==0)
      {
      if ((RSI70)&&(SMA6>SMA21))
         {                                                                                                                       
         OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,"",z,0,Red); 
         Print("WE ARE HERE");
         total+=1;                                                       
      }
      if ((RSI30)&&(SMA6<SMA21))
         {
         OrderSend(Symbol(),OP_SELL,0.1,Bid,0,0,0,"",z,0,Blue);
         total+=1;
      }  
   }
//---
   if (total!=0)
      {
      L=0;
      for (i=OrdersTotal()-1; i>=0; i--)                                                    
         {
         if (OrderSelect(i,SELECT_BY_POS))
            {
            if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==z))
               {
               if ((OrderType()==OP_BUY)&&(SMA6<SMA21))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);
                     total+=-1;
                     break;
               }
               if ((OrderType()==OP_SELL)&&(SMA6>SMA21))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                 
                     total+=-1;
                     break;
               }
               else 
                  {
                  L++;                                                                  
               }
            }
            total=L;
         }
      }
   }
//----
}
//----
return;
}
//-------------------------------------------
 

double, int, string, bool, datetime, color, ........ ¿qué tengo que usar? ....

//-----
double SMA6=iMA(Symbol(),0,6,0,MODE_SMA,PRICE_CLOSE,0);
Print("SMA6=  ",SMA6);
double SMA21=iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0);
Print("SMA21=  ",SMA21);
double RSI70=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)<70;
Print("RSI70=  ",RSI70);
double RSI30=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)>30;
Print("RSI30=  ",RSI30);                                                                                                            
//----

¿Son dobles?

         OrderSend(Symbol(),OP_BUY,0.1,Ask,0,0,0,"",z,0,Red); 
         Print("WE ARE HERE");

SEEEEEE ¿Qué son los valores de retorno de las funciones? ¿Cómo los utilizo? - Foro MQL4

gran explicación

Cuando una función devuelve un int, como por ejemplo OrderSend(), podemos utilizar código como este para comprobar que la función ha funcionado e informar de un error a los registros si no ha funcionado....

int TicketNumber;

TicketNumber = OrderSend( . . . . . . . . );

**(*******************)
   {
   Print(******************);
   }
else
   {
   Print(************************);
   }

. Mira el enlace que te ha dado WHRoeder y encontrarás lo que he escondido aquí con las estrellas ......

utilízalo también comprobando el cierre de las operaciones

Haz algo así dentro de tu código.... de esa manera cuando el ordersend falle sabrás de que tipo y de donde viene el error

.

que pasa si orderclose falla.......?????

 

Tanto el RSI como las MA's son dobles por lo que las variables deben serlo también no?

https://docs.mql4.com/indicators/iRSI && https://docs.mql4.com/indicators/iMA

He codificado los errores de impresión, pero no se imprime nada en el diario, así que no puedo saber qué errores se están produciendo. ¿Me falta algo obvio? Ahora vuelvo a abrir una venta y luego no puedo cerrarla...

//+------------------------------------------------------------------+
//|                                                   SMA scripy.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern int z=1234;
int total;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   int i;
   total=0;
   if (OrdersTotal()!=0)
      {
      for (i=OrdersTotal()-1; i>=0; i--)                                                     
         {
         if (OrderSelect(i,SELECT_BY_POS))
            {
            if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==z))
               {
               if ((OrderType()==OP_BUY)&&(iMA(Symbol(),0,6,-3,MODE_SMA,PRICE_CLOSE,0)<iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  { 
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                  
               }
               if ((OrderType()==OP_SELL)&&(iMA(Symbol(),0,6,-3,MODE_SMA,PRICE_CLOSE,0)>iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0)))
                  {
                  OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);                  
               }
               else 
                  {
                  total++;                                                                 
               }
            }
         }
      }
   }
//----
   return;
}
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int start()
   {
//----
   int ticket,i,L;
   bool x;
   if (AccountBalance()>50)                                                                                     
   {
//-----
double SMA6=iMA(Symbol(),0,6,-3,MODE_SMA,PRICE_CLOSE,0);
Print("SMA6 is ",SMA6);
double SMA21=iMA(Symbol(),0,21,0,MODE_SMA,PRICE_CLOSE,0);
Print("SMA21 is ",SMA21);
double RSI70=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)<70;
Print("RSI70 is ",RSI70);
double RSI30=iRSI(Symbol(),PERIOD_D1,14,PRICE_CLOSE,0)>30; 
Print("RSI30 is ",RSI30);                                                                                                           
//----
   if (total==0)
      {
      if ((RSI70)&&(SMA6>SMA21))
         {                                                                                                                       
         ticket=OrderSend(Symbol(),OP_BUY,v(AccountBalance()),Ask,0,0,0,"",z,0,Red); 
         total+=1;                                                       
         if (ticket<0)
            {
            Print("OrderSend Failed", GetLastError());
         }
      }
      if ((RSI30)&&(SMA6<SMA21))
         {
         ticket=OrderSend(Symbol(),OP_SELL,v(AccountBalance()),Bid,0,0,0,"",z,0,Blue);
         total+=1;
         if (ticket<0)
            {
            Print("OrderSend Failed", GetLastError());
         }
      }  
   }
//---
   if (total!=0)
      {
      L=0;
      for (i=OrdersTotal()-1; i>=0; i--)                                                    
         {
         if (OrderSelect(i,SELECT_BY_POS))
            {
            if ((OrderSymbol()==Symbol())&&(OrderMagicNumber()==z))
               {
               if ((OrderType()==OP_BUY)&&(SMA6<SMA21))
                  { 
                  x=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);
                     if (x==false)
                        {
                        Print("Error is ", GetLastError());
                     }
                     else total+=-1;
                     break;
               }
               if ((OrderType()==OP_SELL)&&(SMA6>SMA21))
                  {
                  x=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Green);   
                     if (x==false)
                        {
                        Print("Error is ", GetLastError());
                     }
                     else 
                        {
                        total+=-1;
                     }
                     break;
               }
               else 
                  {
                  L++;                                                                  
               }
            }
            total=L;
         }
      }
   }
//----
}
//----
return;
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return(0);
}
//-------------------------------------------------------------------+
double v(double k)
{
   double v=((k*0.015)/1000);
   if (v<MarketInfo(Symbol(),MODE_MINLOT))
      {
      v=MarketInfo(Symbol(),MODE_MINLOT);
      return(v);
   }
   else
      {
      return(v);
   }
}
//-------------------------------------------------------------------+
 

¡duuuhhhh iRSI es doble pero la comparación da como resultado 1 - así que reemplacé RSI30 y RSI70 con sólo RSI y tuve una comparación y todo funciona HOORAY! EXCEPTO cuando cambio el SMA6 a shift sale SMA6=0 siempre? ¿por qué?

¡Gracias a todos por la ayuda! ¡Espero no molestar tanto la próxima vez!

 
j.w.msb:

Tanto el RSI como las MA's son dobles por lo que las variables deben serlo también no?

https://docs.mql4.com/indicators/iRSI && https://docs.mql4.com/indicators/iMA

He codificado los errores de impresión, pero no se imprime nada en el diario, así que no puedo saber qué errores se están produciendo. ¿Todavía me falta algo obvio? Ahora estoy de vuelta a la apertura de una venta y luego no ser capaz de cerrar ...

colocar el EA en un gráfico de una cuenta demo

no busques sólo en el diario de la terminal ...
busque también en los expertos en terminales .....

¿Qué ves allí impreso?

 
deVries:

colocar el EA en un gráfico de una cuenta demo

no mire sólo en el diario de la terminal ...
mira también en los expertos de la terminal .....

¿qué ves allí impreso


Imprimiendo y ejecutando ahora :) gracias por tu ayuda - me equivoqué definiendo iRSI<70 como un doble (ya que era una comparación) y estaba causando problemas. Se imprime ahora y funciona como se esperaba, excepto, si cambio el cambio de SMA sus impresiones SMA = 0?
 
j.w.msb:

Imprimiendo y ejecutando ahora :) gracias por tu ayuda - me equivoqué definiendo iRSI<70 como un doble (ya que era una comparación) y estaba causando problemas. Se imprime ahora y funciona como se esperaba, excepto, si cambio el cambio de SMA sus impresiones SMA = 0?

Coloca una SMA con la misma configuración en el gráfico de tu EA y mira lo que has hecho...
 
   if (total==0)
      {
      if ((RSI70)&&(SMA6>SMA21))
         {                                                                                                                       
         ticket=OrderSend(Symbol(),OP_BUY,v(AccountBalance()),Ask,0,0,0,"",z,0,Red); 
         total+=1;                                                       
         if (ticket<0)
            {
            Print("OrderSend Failed", GetLastError());
         }
      }

Por qué el total += 1;

en este momento no sé si la orden de venta tuvo éxito

y si falla no veo que tipo de orden trató de abrir podría ser también una operación de venta que trató de abrir