ESTRATEGIA ICHIMOKU

 

He estado tratando de crear un asesor experto que comprará automáticamente 1 unidad cuando el tenkan-sen>kijun-sen (cuando la línea tenkan-sen está por encima de la línea kijun-sen) y luego venderlo una vez que el tenkan-sen es menor que el kijun-sen.

Soy un completo novato y lo empecé ayer tratando de juntar muestras, etc.

Abajo está el resultado y aprecio que es probablemente un montón de mierda.

Me sale el clásico "'(' - definición de función inesperada" en las líneas int start() (copiadas del script "trade" en el navegador) al intentar compilar

Por favor, podéis sugerirme cómo puedo conseguir que esta idea funcione y gracias de antemano.


#property copyright "#copyright#"
#property link "#link#"

extern double Lots = 0.1
extern double Tenkan = 9;
extern double Kijun = 26;

//+------------------------------------------------------------------+
//| función de inicialización de expertos ||.
//+------------------------------------------------------------------+
int init()
{
Bares<=Tenkan, Bares<=Kijun;
//----
if(Bars<=Tenkan>Bars<=Kijun)
{
Print ("Tenkan-sen mayor que Kijun-sen");
return(0);
}
//----
//+------------------------------------------------------------------+
//| script "trading para todo el dinero" |
//+------------------------------------------------------------------+
int inicio()
{
//----
if(MessageBox("¿Realmente quiere COMPRAR 1,00"+Símbolo()+" al precio ASK?",
"Script",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1);
//----
int ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0, "comentario experto",255,0,CLR_NONE);
if(ticket<1)
{
int error=GetLastError();
Print("Error = ",ErrorDescription(error));
devolver;
}
//----
OrderPrint();
return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
Bares<=Tenkan, Bares<=Kijun;
//----
if(Bars<=Tenkan<Bars<=Kijun)
{
Print ("Tenkan-sen menos que Kijun-sen");
return(0);
}
//----
int inicio()
{
//----
if(MessageBox("¿Realmente quiere VENDER 1,00"+Símbolo()+" al precio de la Oferta? ",
"Script",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1);
//----
int ticket=OrderSend(Symbol(),OP_SELL,1.0,Bid,3,0,0, "expert comment",255,0,CLR_NONE);
if(ticket<1)
{
int error=GetLastError();
Print("Error = ",ErrorDescription(error));
devolver;
}
//----
OrderPrint();
return(0);
}
//+------------------------------------------------------------------+

 

Mire el código de ejemplo de MACD.

Cambie las variables obtenidas para el indicador interno Use By MACD para obtener los valores del indicador Ichmoku.

Haga pequeños cambios y luego complie el código para comprobar que su sintaxis es correcta.

edit - También es de utilidad cómo utilizar el indicador Ichmoku aquí

 

Hola ToBa,

Tres cosas;

Sólo debería haber 1 x init, 1 x deinit + 1 x start.

La función start es el cuerpo principal de tu script que procesa el movimiento del mercado (o ticks).

Además de eso, asegúrese de que cada llave se cierra correctamente y declarar todas las variables.

 
Ickyrus:

Mire el código de ejemplo de MACD.

Cambie las variables obtenidas para el indicador interno Use By MACD para obtener los valores del indicador Ichmoku.

Haga pequeños cambios y luego complie el código para comprobar que su sintaxis es correcta.

edit - También es útil como usar el indicador Ichmoku aquí


Ok lo he rehecho basándome en el ejemplo del MACD, pero con estos errores:

'\end_of_program' - ending bracket '}' expected C:\gram Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

'\_end_of_program' - paréntesis izquierdo desequilibrado C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)


Esta es la nueva versión:

//+------------------------------------------------------------------+
//| ICHIMOKU.mq4
//| Copyright © 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30
extern double Tenkan = 9
extern double Kijun = 26;

//+------------------------------------------------------------------+
//| función de inicialización de expertos ||.
//+------------------------------------------------------------------+
int inicio()
{
double tenkan_sen
double kijun_sen;
int cnt, ticket, total;
//----
if(Bares<100)
{
Print("barras menos de 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit menos de 10");
return(0); // comprobar TakeProfit
}
//----
total=Total de pedidos();
if(total<1)
{
// no se identifican órdenes abiertas
if(AccountFreeMargin()<(1000*Lots))
{
Print("No tenemos dinero. Margen libre = ", AccountFreeMargin());
return(0);
}
// comprobar la posibilidad de una posición larga (BUY)
if(tenkan_sen>kijun_sen)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ichimoku",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);

// es importante entrar en el mercado correctamente,
// pero es más importante salir de él correctamente...
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // comprueba la posición abierta
OrderSymbol()==Symbol()) // comprueba el símbolo
{
if(OrderType()==OP_BUY) // se abre una posición larga
{
// ¿se debe cerrar?
if((tenkan_sen<kijun_sen)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // cierra la posición
return(0); // salir
}
// comprobar el trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Punto*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
}
}
return(0);
}


 

En este punto de "su" código . . .

}
else Print("Error opening BUY order : ",GetLastError()); 
return(0); 

                       //   <------  here  ! ! ! 

// it is important to enter the market correctly, 
// but it is more important to exit it correctly... 
for(cnt=0;cnt<total;cnt++)
{

¡. . . marcado aquí ! ¡! ¡! ... has pasado de colocar Órdenes a cerrarlas ... pero te faltan quizás 2 llaves de cierre ( } ) de la parte de compra del código ... si indentas tu código de forma razonable es fácil de ver.

 

Bien, gracias. He hecho este cambio que elimina '\end_of_program' - corchete final '}' esperado C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

Se marca <=======

// comprueba la posibilidad de posición larga (BUY)
if(tenkan_sen>kijun_sen)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ichimoku",16384,0,Green);
if(ticket>0)
} <=======
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Orden de COMPRA abierta : ",OrderOpenPrice());
}
else Print("Error al abrir la orden de COMPRA : ",GetLastError());
return(0);
}
// es importante entrar en el mercado correctamente,

// pero es más importante salir de él correctamente...


Aunque no parece que deba estar ahí

 

Te sobra el corchete de apertura en esta línea. . .

if  ( (  tenkan_sen<kijun_sen )   // <--  surplus  (
 
Por favor, utilice esto para publicar el código . . hace que sea más fácil de leer.

 

Inicializas estas variables pero no les das ningún valor . . .

if (  tenkan_sen  > kijun_sen  )

. . por lo que la prueba siempre será falsa. Este EA nunca colocará una Orden.

 

Su código en una versión con sangría y que compila . . .

//+------------------------------------------------------------------+
//| ICHIMOKU.mq4                                                     |
//| Copyright © 2012, MetaQuotes Software Corp.                      |
//| http://www.metaquotes.net                                        |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double Tenkan = 9;
extern double Kijun = 26;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int start()
   {
   double tenkan_sen;
   double kijun_sen;
   int cnt, ticket, total;
   //----
   if(Bars<100)
      {
      Print("bars less than 100");
      return(0); 
      }
   
   if(TakeProfit<10)
      {
      Print("TakeProfit less than 10");
      return(0); // check TakeProfit
      }

   //----
   total=OrdersTotal();
   if(total<1) 
      {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
         {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0); 
         }
      // check for long position (BUY) possibility
      if(tenkan_sen>kijun_sen)
         {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"ichimoku",16384,0,Green);
         if(ticket>0)
            {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
            }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
         
         }   //  added by RaptorUK
      }   //  added by RaptorUK
            
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly... 
   for(cnt=0;cnt<total;cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && // check for opened position 
         OrderSymbol()==Symbol()) // check for symbol
         {
         if(OrderType()==OP_BUY) // long position is opened
            {
            // should it be closed?
            if(tenkan_sen<kijun_sen)   //  removed surplus (  RaptorUK
               {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
               return(0); // exit
               }
                  
            // check for trailing stop
            if(TrailingStop>0) 
               { 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                  {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                     {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                     }
                  }
               }
            }
         }
      }
   return(0);
   }
 
Muchas gracias :)