[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 198

 
mmmmmmm.... Beh, personalmente penso che sia scritto correttamente - l'unico problema è il posizionamento degli snippet di codice.... Potresti posizionarlo correttamente? Non mi è chiaro come farlo.
 
splxgf:
Onestamente, non so se si può descrivere una funzione all'interno di un'altra, non l'ho mai incontrato.
Non confondere noi neri. A livello di questo ramo, è sufficiente affermare che tutte le funzioni utente devono essere situate al di fuori della funzione Start.
 
CLAIN:
mmmmmmm.... Beh, personalmente, penso che sia tutto scritto correttamente - l'unico problema è il posizionamento degli snippet di codice.... Potresti posizionarlo correttamente? Non mi è chiaro come farlo

Beh, non lo posterò esattamente, ma come è già stato scritto tutte le funzioni personalizzate sono oltre l'inizio.

A livello di concetto

Start (){}

MACD{}

AnalizzaSegnale(){}

Rimuovete la descrizione delle funzioni personalizzate in un file separato, assicuratevi che il resto del programma compili senza messaggi di parentesi di errore e agganciate ogni funzione alla fine del codice risultante.

 

Grazie, ha funzionato =) solo le offerte non si aprono, ma questa è una piccola cosa =) non avrei potuto farlo senza di te )

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

 

chiedere consiglio a un programmatore


avatar
1
Metamql 20.09.2011 14:31
Cari professionisti, per favore date qualche consiglio. Ci sono due medie mobili con periodi di 5 e 60. Quando si incrocia la MA veloce su quella lenta dal basso verso l'alto + filtri, si apre un trade Buy. Il problema è, come fare in modo che un trade si apra solo una volta e quando si chiude, non aprire un nuovo trade, anche se ci sono le condizioni adatte per aprire, fino a quando c'è un crossover inverso?
 

Salve.

Per favore aiutatemi - per favore rispondete al mio post a pagina 196. (domanda su int MAGIC;)

Grazie in anticipo.

 
nemo811:

Salve.

Per favore aiutatemi - per favore rispondete al mio post a pagina 196. (domanda su int MAGIC;)

Grazie in anticipo.


Avete provato a fare funzioni con parametri? Per non usare variabili globali esterne (ognuno può chiamarle con il proprio nome)
 
sergeev:

chiedere consiglio a un programmatore


1
Metamql 20.09.2011 14:31
Cari professionisti, per favore date qualche consiglio. Ci sono due medie mobili con periodi di 5 e 60. Quando si incrocia una MA veloce su una MA lenta dal basso verso l'alto + i filtri, si apre un trade su Buy. Il problema è, come fare in modo che un trade si apra solo una volta e quando si chiude, non aprire un nuovo trade, anche se ci sono le condizioni adatte per aprire, fino a quando si verifica un crossover inverso?

impostare una bandiera per proibire ulteriori aperture e rimuovere la bandiera quando si torna indietro, un paio di barre possono essere ritardate per evitare il rimbalzo
 
Vinin:

Avete provato a fare funzioni con parametri? Per non usare variabili globali esterne (ognuno può chiamarle a modo suo)

Voglio dire:

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);
 }

???

...e la condizione

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

sarà tracciato correttamente?

 
nemo811:

Voglio dire:

???

...e la condizione

sarà tracciato correttamente?


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);
 }
In questo modo, alla variabile OrdTicket dovrebbe essere assegnato un valore predefinito. Altrimenti non ci sono posizioni aperte e la funzione restituirà qualcosa