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

 
Vinin:

O forse solo fare una lista di strumenti attivi con l'aiuto di un EA. L'approccio è piuttosto complicato. Potrebbe essere risolto in un modo più semplice
Potremmo semplicemente specificare un numero nei parametri di input, ma il fatto è che durante il trading, possono verificarsi situazioni in cui il trading è sospeso su alcune valute. Poi gli EAs su altre valute dovrebbero ricalcolare i loro parametri.
 
forexnew:
Si potrebbe semplicemente specificare un numero nei parametri di input, ma il punto è che nel processo di trading ci possono essere situazioni in cui il trading è sospeso su alcune valute. Quindi gli EA su altre valute devono ricalcolare i loro parametri.

Perché specificare. L'Expert Advisor può ottenerlo da solo. E allo stesso tempo, può gestire altri Expert Advisors. Tutto dipende dal compito
 

Figar0:

В самой функции ошибок нет, наверно ошибки возникают при попытке ее использовать, но это вы нам не показываете. Выкладывайте то что не компилится прямо файлом и гадать будет не надо.

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
double Lots()      // Расчет используемого лота
  {
   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
     return(Lots);
  }
//+------------------------------------------------------------------+  

// to simplify the coding and speed up access
// data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   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(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",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); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // 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(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 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);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.
 
Vinin:

Perché specificare questo? L'Expert Advisor può ottenerlo da solo. E allo stesso tempo, può gestire altri Expert Advisors. Tutto dipende dal compito.

Non conosco la gestione di altri EA. L'EA è lo stesso su tutte le coppie di valute, e il modello è questo:

se 2 coppie di valute: sulla prima mostra 2, sulla seconda mostra 1

Se 3 coppie di valute: la prima mostra 3, la seconda 2, la terza 1

se si tratta di 4 coppie di valute: la prima mostra 4, la seconda mostra 3, la terza mostra 2, la quarta mostra 1.

Ho la sensazione che ciò che viene calcolato sulla prima valuta non viene preso in considerazione dall'Expert Advisor sull'altra coppia di valute, oppure dipende in qualche modo dal numero di finestre aperte (coppie di valute)!

 
Vinin:

Perché specificare. Il consigliere può procurarselo da solo. E allo stesso tempo può gestire altri consulenti. Tutto dipende dal compito.
Grazie. L'ho già capito da solo. Ho solo bisogno di rimuovere la linea e contare i kp da 1
if(OrderSymbol()==Symbol())   break;
 
skyjet:

Per cominciare, la vostra funzione di calcolo del lotto è dichiarata all'interno della funzione start. Tiralo fuori. Poi ci saranno alcuni errori con variabili non dichiarate, ma penso che tu possa gestirli da solo.
 
skyjet:
Perché ho bisogno di NormalizeDlouble() nel calcolo del lotto?

Affinché ci siano due cifre dopo la virgola. Altrimenti una posizione con lotto 0,009 non sarà aperta, perché non sarà un multiplo del passo minimo del lotto.

   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     else       Lots=NormalizeDouble(Lots,0);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     } 

 

Ragazzi!

come faccio a rendere ogni 40° ordine un lotto più grande? :: mercato e in attesa

che ne dici di questo?

int Nom = OrderTicket();                        // Номер ордера

a= Nom%40;                                      // к-во делить на 40 без остатка
if a = 0
lot = 2;  

 
 
Figar0:

Per cominciare, la vostra funzione di calcolo del lotto è dichiarata all'interno della funzione start. Tiralo fuori. Poi ci saranno alcuni errori con variabili non dichiarate, ma penso che tu possa gestirli da solo.
Grazie per l'aiuto.
 
DDFedor:
skyjet:
a cosa serve NormalizeDlouble() nel calcolo del lotto?

Affinché ci siano due cifre dopo la virgola. Altrimenti, una posizione con un lotto di 0,009 non sarà aperta, perché non sarà un multiplo del passo minimo del lotto.

Grazie per il chiarimento.
Motivazione: