STRATÉGIE ICHIMOKU

 

J'ai essayé de créer un conseiller expert qui achète automatiquement une unité lorsque le tenkan-sen>kijun-sen (lorsque la ligne tenkan-sen est au-dessus de la ligne kijun-sen) et la vend lorsque le tenkan-sen est inférieur au kijun-sen.

Je suis complètement novice et j'ai commencé hier en essayant de rassembler des échantillons, etc.

Je suis complètement novice et j'ai commencé hier en essayant d'assembler des échantillons, etc. Voici le résultat et je sais que c'est probablement un tas de conneries.

J'obtiens le classique "'(' - function definition unexpected" sur les lignes int start() (copiées du script "trade" dans le navigateur) lorsque j'essaie de compiler.

S'il vous plaît, pouvez-vous me suggérer comment je peux faire fonctionner cette idée et merci d'avance.


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

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

//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+
int init()
{
Bars<=Tenkan, Bars<=Kijun ;
//----
si(Bars<=Tenkan>Bars<=Kijun)
{
Print ("Tenkan-sen supérieur à Kijun-sen") ;
return(0) ;
}
//----
//+------------------------------------------------------------------+
//| script "trading pour tout l'argent" |
//+------------------------------------------------------------------+
int start()
{
//----
if(MessageBox("Voulez-vous vraiment ACHETER 1,00 "+Symbole()+" au prix ASK ? ",
"Script",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1) ;
//----
int ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0, "commentaire expert",255,0,CLR_NONE) ;
si(ticket<1)
{
int error=GetLastError() ;
Print("Erreur = ",ErrorDescription(error)) ;
retour ;
}
//----
CommanderImprimer() ;
return(0) ;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| fonction de désinitialisation de l'expert |
//+------------------------------------------------------------------+
int deinit()
{
Bars<=Tenkan, Bars<=Kijun ;
//----
si(Bars<=Tenkan<Bars<=Kijun)
{
Print ("Tenkan-sen inférieur à Kijun-sen") ;
return(0) ;
}
//----
int start()
{
//----
if(MessageBox("Voulez-vous vraiment VENDRE 1,00 "+Symbole()+" au cours acheteur ? ",
"Script",MB_YESNO|MB_ICONQUESTION)!=IDYES) return(1) ;
//----
int ticket=OrderSend(Symbol(),OP_SELL,1.0,Bid,3,0,0, "commentaire expert",255,0,CLR_NONE) ;
si(ticket<1)
{
int error=GetLastError() ;
Print("Erreur = ",ErrorDescription(error)) ;
retour ;
}
//----
CommanderImprimer() ;
return(0) ;
}
//+------------------------------------------------------------------+

 

Regardez l'exemple de code MACD.

Changez les variables récupérées pour l'indicateur interne Use By MACD pour obtenir les valeurs de l'indicateur Ichmoku.

Faites de petits changements et ensuite compilez le code pour vérifier que votre syntaxe est correcte.

edit - Vous pouvez également trouver ici comment utiliser l'indicateur Ichmoku.

 

Salut ToBa,

Trois choses ;

Il ne devrait y avoir que 1 x init, 1 x deinit + 1 x start.

La fonction start est le corps principal de votre script qui traite le mouvement du marché (ou ticks).

En plus de cela, assurez-vous que chaque accolade est correctement fermée et déclarez chaque variable.

 
Ickyrus:

Regardez l'exemple de code MACD.

Changez les variables récupérées pour l'indicateur interne Use By MACD pour obtenir les valeurs de l'indicateur Ichmoku.

Faites de petits changements et ensuite compilez le code pour vérifier que votre syntaxe est correcte.

edit - Vous pouvez également trouver ici comment utiliser l'indicateur Ichmoku.


Ok, je l'ai refait en me basant sur l'exemple MACD, mais avec ces erreurs :

'\end_of_program' - parenthèse finale '}' attendu C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

'\end_of_program' - parenthèse gauche non équilibrée C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)


Voici la nouvelle version :

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

//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert
//+------------------------------------------------------------------+
int start()
{
double tenkan_sen ;
double kijun_sen ;
int cnt, ticket, total ;
//----
if(Bars<100)
{
Print("barres inférieures à 100") ;
return(0) ;
}
if(TakeProfit<10)
{
Print("TakeProfit inférieur à 10") ;
return(0) ; // vérifier TakeProfit
}
//----
total=OrdersTotal() ;
si(total<1)
{
// aucun ordre ouvert n'a été identifié
if(AccountFreeMargin()<(1000*Lots))
{
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin()) ;
return(0) ;
}
// vérification de la possibilité d'une position longue (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("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
sinon Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
return(0) ;

// il est important d'entrer correctement sur le marché,
// mais il est encore plus important d'en sortir correctement...
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;
if(OrderType()<=OP_SELL && // vérification de la position ouverte
OrderSymbol()==Symbol()) // vérification du symbole
{
if(OrderType()==OP_BUY)) // une position longue est ouverte
{
// doit-elle être fermée ?
if((tenkan_sen<kijun_sen)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ; // fermer la position
return(0) ; // sortie
}
// vérification du trailing stop
if(TrailingStop>0)
{
si(Bid-OrderOpenPrice()>Point*TrailingStop)
{
si(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green) ;
retour(0) ;
}
}
}
}
}
}
return(0) ;
}


 

A ce stade de "votre" code... . .

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

. . . marqué ici ! ! ! vous êtes passé du placement des ordres à leur fermeture... mais il vous manque peut-être deux accolades fermantes ( } ) dans la partie du code consacrée à l'achat... si vous indentez votre code de manière raisonnable, cela se voit facilement.

 

Ok, merci. J'ai fait ce changement qui a supprimé '\end_of_program' - parenthèse finale '}' attendu C:\Program Files (x86)\MetaTrader 4\experts\ICHIMOKU.mq4 (80, 13)

Il est marqué <=======

// vérification de la possibilité d'une position longue (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("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
return(0) ;
}
// il est important d'entrer correctement sur le marché,

// mais il est encore plus important d'en sortir correctement...


Il ne semble pas que cela devrait être là pourtant

 

Vous avez un surplus de support d'ouverture sur cette ligne....

if  ( (  tenkan_sen<kijun_sen )   // <--  surplus  (
 
Veuillez utiliser ceci pour afficher le code . . il est plus facile à lire.

 

Vous initialisez ces variables mais ne leur donnez aucune valeur . . .

if (  tenkan_sen  > kijun_sen  )

... donc le test sera toujours faux. Cet EA ne passera jamais d'ordre.

 

Votre code dans une version avec indentation et qui compile . . .

//+------------------------------------------------------------------+
//| 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);
   }
 
Merci beaucoup :)
Raison: