STRATEGIA ICHIMOKU

 

Sto cercando di creare un expert advisor che compri automaticamente 1 unità quando il tenkan-sen>kijun-sen (quando la linea tenkan-sen è sopra la linea kijun-sen) e poi la venda quando il tenkan-sen è inferiore al kijun-sen.

Sono un completo principiante e ho iniziato ieri cercando di mettere insieme i campioni ecc.

Qui sotto c'è il risultato e mi rendo conto che probabilmente è un mucchio di stronzate.

Ottengo il classico "'(' - function definition unexpected" sulle linee int start() (copiate dallo script "trade" nel navigatore) quando provo a compilare

Per favore potete suggerirmi come posso far funzionare questa idea e grazie in anticipo.


#proprietà copyright "#copyright#"
#proprietà link "#link#"

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

//+------------------------------------------------------------------+
//| funzione di inizializzazione esperto |
//+------------------------------------------------------------------+
int init()
{
Bars<=Tenkan, Bars<=Kijun;
//----
se(Bars<=Tenkan>Bars<=Kijun)
{
Stampa ("Tenkan-sen maggiore di Kijun-sen");
return(0);
}
//----
//+------------------------------------------------------------------+
//| script "trading per tutti i soldi
//+------------------------------------------------------------------+
int start()
{
//----
if(MessageBox("Vuoi veramente COMPRARE 1.00"+Symbol()+" al prezzo ASK? ",
"Script",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1);
//----
int ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0, "commento esperto",255,0,CLR_NONE);
if(ticket<1)
{
int error=GetLastError();
Print("Error = ",ErrorDescription(error));
return;
}
//----
OrderPrint();
return(0);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| funzione di deinizializzazione esperto |
//+------------------------------------------------------------------+
int deinit()
{
Bars<=Tenkan, Bars<=Kijun;
//----
if(Bars<=Tenkan<Bars<=Kijun)
{
Stampa ("Tenkan-sen meno di Kijun-sen");
return(0);
}
//----
int start()
{
//----
if(MessageBox("Vuoi davvero VENDERE 1,00"+Symbol()+" al prezzo dell'offerta? ",
"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);
se(ticket<1)
{
int error=GetLastError();
Print("Errore = ",ErrorDescription(errore));
return;
}
//----
OrderPrint();
return(0);
}
//+------------------------------------------------------------------+

 

Guardate il codice di esempio MACD.

Cambia le variabili recuperate per l'indicatore interno Use By MACD per ottenere i valori dell'indicatore Ichmoku.

Fai piccole modifiche e poi complica il codice per verificare che la sintassi sia corretta.

edit - Anche di uso è come usare l'indicatore Ichmoku qui

 

Ciao ToBa,

Tre cose;

Ci dovrebbe essere solo 1 x init, 1 x deinit + 1 x start.

La funzione start è il corpo principale del tuo script che elabora il movimento del mercato (o tick).

Inoltre, assicurati che ogni parentesi graffa sia chiusa correttamente e dichiara ogni variabile.

 
Ickyrus:

Guardate il codice di esempio MACD.

Cambia le variabili recuperate per l'indicatore interno Use By MACD per ottenere i valori dell'indicatore Ichmoku.

Fai piccole modifiche e poi complica il codice per verificare che la sintassi sia corretta.

edit - Anche di uso è come utilizzare l'indicatore Ichmoku qui


Ok, l'ho rifatto sulla base dell'esempio MACD, ma con questi errori:

'\fine_di_programma' - parentesi finale '}' attesa C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

'\fine_di_programma' - parentesi sinistra sbilanciata C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)


Questa è la nuova versione:

//+------------------------------------------------------------------+
//| 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;

//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'esperto |
//+------------------------------------------------------------------+
int start()
{
doppio tenkan_sen;
doppio kijun_sen;
int cnt, ticket, total;
//----
se(Bars<100)
{
Print("barre inferiori a 100");
return(0);
}
se(TakeProfit<10)
{
Print("TakeProfit inferiore a 10");
return(0); // controlla TakeProfit
}
//----
total=OrdiniTotali();
se(totale<1)
{
// nessun ordine aperto identificato
if(ContoFreeMargin()<(1000*Lotti))
{
Print("Non abbiamo soldi. Margine libero = ", AccountFreeMargin());
return(0);
}
// verificare la possibilità di una posizione lunga (BUY)
if(tenkan_sen>kijun_sen)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ichimoku",16384,0,Green);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto : ",OrderOpenPrice());
}
altrimenti Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());
return(0);

// è importante entrare nel mercato correttamente,
// ma è ancora più importante uscirne correttamente...
for(cnt=0;cnt<totale;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // controlla la posizione aperta
OrderSymbol()==Symbol()) // controlla il simbolo
{
if(OrderType()==OP_BUY) // la posizione lunga è aperta
{
// deve essere chiusa?
if((tenkan_sen<kijun_sen)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // chiude la posizione
return(0); // uscire
}
// controllare il 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);
}


 

A questo punto del "tuo" codice . . .

}
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++)
{

. . . segnato qui! ! ! Sei passato dal piazzare gli ordini alla loro chiusura... ma ti mancano forse 2 parentesi graffe di chiusura ( } ) dalla parte di acquisto del codice... se indenti il tuo codice in modo ragionevole è facile da vedere.

 

Ok, grazie. Ho fatto questa modifica che ha rimosso '\fine_di_programma' - parentesi finale '}' atteso C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

È segnato <=======

// controlla la possibilità di posizioni lunghe (BUY)
se(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)) Stampa("Ordine BUY aperto : ",OrderOpenPrice());
}
altrimenti Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());
return(0);
}
// è importante entrare nel mercato correttamente,

// ma è ancora più importante uscirne correttamente...


Non sembra che dovrebbe essere lì, però

 

Avete una parentesi di apertura in eccesso su questa linea. . .

if  ( (  tenkan_sen<kijun_sen )   // <--  surplus  (
 
Si prega di utilizzare questo per postare il codice . . rende più facile la lettura.

 

Si inizializzano queste variabili ma non si dà loro alcun valore . . .

if (  tenkan_sen  > kijun_sen  )

. . . quindi il test sarà sempre falso. Questo EA non piazzerà mai un ordine.

 

Il tuo codice in una versione con indentazione e che 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);
   }
 
Grazie mille :)