[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 198

 
mmmmm.... personnellement, je pense que c'est écrit correctement - le seul problème est le placement des bouts de code.... Pourriez-vous le placer correctement ? Je ne sais pas comment faire.
 
splxgf:
Honnêtement, je ne sais pas si on peut décrire une fonction à l'intérieur d'une autre, je ne l'ai jamais rencontré.
Ne nous embrouillez pas les noirs. Au niveau de cette branche, il suffit d'indiquer que toutes les fonctions utilisateur doivent être situées en dehors de la fonction Start.
 
CLAIN:
mmmmm.... personnellement, je pense que tout est écrit correctement - le seul problème est le placement des extraits de code.... Pourriez-vous le placer correctement ? Je ne sais pas comment faire.

Je ne vais pas l'afficher exactement, mais comme cela a déjà été écrit toutes les fonctions personnalisées au-delà du démarrage.

Au niveau du concept

Start (){}

MACD{}

AnalyzeSignal(){}

Retirez la description des fonctions personnalisées dans un fichier séparé, assurez-vous que le reste du programme se compile sans messages de parenthèses d'erreur et amarrez chaque fonction à la toute fin du code résultant.

 

Merci, ça a marché =) seules les offres ne s'ouvrent pas, mais c'est une petite chose =) je n'aurais pas pu le faire sans vous ;)

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

extern int TP = 100; 
extern int TS = 100;
extern double lots = 0.1;
int slip = 3;
int Magic = 1;

int total;
int ticket = 0; //объявил тотал и тикет



//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----


int signal = signal_MACD(); 
AnalyzeSignal(signal);




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






int signal_MACD()
{
   int MACD[8] = {0,1,2,3,4,5,6,7};
MACD[0] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,7);
MACD[1] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,6);
MACD[2] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,5);
MACD[3] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,4);
MACD[4] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,3);
MACD[5] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,2);
MACD[6] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,1);
MACD[7] = iMACD(Symbol(),1,5,34,5,PRICE_CLOSE,MODE_MAIN,0);
   total = OrdersTotal();
   if(total<1)
   {
      if(MACD[0]<0)
      {
         if(MACD[1]>0)
         {
            if(MACD[2]>0)
            {
               if(MACD[3]>0)
               {
                  if(MACD[4]>0)
                  {
                     if(MACD[5]>0)
                     {
                        if(MACD[6]>0)
                        {
                           if(MACD[7]<0)
                           {
                              return(-100);
                           }
                        }
                     }
                  }
               }
            }
         }
      }
      if(MACD[0]>0)
      {
         if(MACD[1]<0)
         {
            if(MACD[2]<0)
            {
               if(MACD[3]<0)
               {
                  if(MACD[4]<0)
                  {
                     if(MACD[5]<0)
                     {
                        if(MACD[6]<0)
                        {
                           if(MACD[7]>0)
                           {
                              return(100);
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }
}

void AnalyzeSignal(int signal)
{
   if(signal == 100)
   {
      ticket = OrderSend(Symbol(),OP_BUY,lots,Ask,slip,Bid-TS*Point,Bid+TP*Point,"покупаем",Magic,0,Green);
      if(ticket>0)
      {
         OrderSelect(ticket,SELECT_BY_TICKET);
         Print("открылись на покупку по цене:", OrderOpenPrice());
      }
      else
      {
         Print("открыться не удалось по причине:", GetLastError());
         return(0);
      }
   }
   if(signal == -100)
   {
      ticket = OrderSend(Symbol(),OP_SELL,lots,Bid,slip,Ask+TS*Point,Ask-TP*Point,"Продаем",Magic,0,Green);
      if(ticket>0)
      {
         OrderSelect(ticket,SELECT_BY_TICKET);
         Print("открылись на продажу по цене:", OrderOpenPrice());
      }
      else
      {
         Print("открыться не удалось по причине:", GetLastError());
         return(0);
      }
   }
}

 

demander conseil à un programmeur


avatar
1
Metamql 20.09.2011 14:31
Chers professionnels, je vous prie de me donner des conseils. Il existe deux moyennes mobiles avec des périodes de 5 et 60. Lorsque le croisement de la MA rapide sur la MA lente de bas en haut + filtres, cela ouvre une transaction d'achat. Le problème est le suivant : comment faire en sorte qu'une transaction ne s'ouvre qu'une seule fois et que, lorsqu'elle se ferme, on n'ouvre pas de nouvelle transaction, même s'il existe des conditions favorables à l'ouverture, jusqu'à ce qu'il y ait un croisement inverse ?
 

Bonjour.

Aidez-nous, s'il vous plaît - répondez à mon message de la page 196. (question sur l'int MAGIC ;)

Merci d'avance.

 
nemo811:

Bonjour.

Aidez-nous, s'il vous plaît - répondez à mon message de la page 196. (question sur l'int MAGIC ;)

Merci d'avance.


Avez-vous essayé de créer des fonctions avec des paramètres ? Afin de ne pas utiliser de variables globales externes (chacun peut les appeler par leur propre nom)
 
sergeev:

demander conseil à un programmeur


1
Metamql 20.09.2011 14:31
Chers professionnels, je vous prie de me donner des conseils. Il existe deux moyennes mobiles avec des périodes de 5 et 60. Lorsque l'on croise une MA rapide sur une MA lente de bas en haut + filtres, on ouvre un trade sur Buy. Le problème est le suivant : comment faire en sorte qu'une transaction ne s'ouvre qu'une seule fois et que, lorsqu'elle se ferme, on n'ouvre pas de nouvelle transaction, même s'il existe des conditions favorables à l'ouverture, jusqu'à ce qu'un croisement inverse se produise ?

définir un drapeau pour interdire toute ouverture supplémentaire et retirer le drapeau lors du retour en arrière, quelques barres peuvent être retardées pour éviter tout rebondissement.
 
Vinin:

Avez-vous essayé de créer des fonctions avec des paramètres ? Afin de ne pas utiliser de variables globales externes (chacun peut les appeler à sa façon)

Je veux dire, comme :

int OrdTicket_b(int MAGIC)
 {
  string SMB=Symbol();
  int OrdTicket;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)
         {
          if(OrderType()==OP_BUY || OrderType()==OP_SELL)
           {
            OrdTicket=OrderTicket();
           }  
         }  
       }          
     }
   }
  return(OrdTicket);
 }

? ??

...et la condition

    if(OrderMagicNumber()==MAGIC || OrderMagicNumber()==777)

sera suivi correctement ?

 
nemo811:

Je veux dire, comme :

? ??

...et la condition

sera suivi correctement ?


int OrdTicket_b(int lMAGIC)
 {
  string SMB=Symbol();
  int OrdTicket=0;
  int i;
  for(i=0;i<OrdersTotal();i++)
   {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == true)
     {
      if(OrderSymbol()==SMB)
       {
        if(OrderMagicNumber()==lMAGIC)
         {
          if(OrderType()==OP_BUY || OrderType()==OP_SELL)
           {
            OrdTicket=OrderTicket();
           }  
         }  
       }          
     }
   }
  return(OrdTicket);
 }
Comme ceci, la variable OrdTicket devrait être assignée à une valeur par défaut. Sinon, il n'y a pas de postes ouverts et la fonction renvoie quelque chose.
Raison: