[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 706

 

stava creando degli indicatori di freccia. Se Dio vuole, li ho creati, ho imparato una cosa o due. Ora ho deciso di combinarli, per farne due in uno ....... L'essenza dell'idea: avere MACD, impostare alcuni livelli nel + e -. Quando il MACD è dietro questi livelli (sia in + che in -), allora appariranno le frecce di acquisto e di vendita. Sembra fatto, compila senza errori MA non funziona così bene non così....

//+------------------------------------------------------------------+
//|                                               Indicator_MACD.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       Fast_EMA=8;
extern int       Slow_EMA=34;
extern double    N = 0.0015;
extern int       A = 10;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,Fast_EMA,Slow_EMA,1,1,MODE_MAIN, i);
      if ((MACD[i]>MACD[i+1]) || (MACD[i]<MACD[i+1]))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

questo è un indicatore di lavoro

 

E questo è quello che ho ottenuto.......

//+------------------------------------------------------------------+
//|                                           ndicator_MACD_OsMA.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       F_EMA=8;      // пар-ры MACD
extern int       S_EMA=34;     // пар-ры MACD
extern double    N = 0.0015;   // контр. линия
extern int       A = 10;       // расстояние от бара
extern int       Fast_EMA=12;  // пар-ры OsMA
extern int       Slow_EMA=26;  // пар-ры OsMA
extern int       Signal_EMA=9; // пар-ры OsMA
extern double    Z = 0.00005;  // контр. линия
extern int       B = 10;       // расстояние от бара

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];
double OsMA[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(2,OsMA);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,F_EMA,S_EMA,1,1,MODE_MAIN, i);
      OsMA[i]=iOsMA(NULL,0,Fast_EMA,Slow_EMA,Signal_EMA,PRICE_OPEN,i);
      if (((MACD[i]>MACD[i+1])||(MACD[i]<MACD[i+1]))&&((OsMA[i]>OsMA[i+1])||(OsMA[i]<OsMA[i+1])))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point;
       if( OsMA[i] <-Z) ExtMapBuffer2[i] = Low[i] -B*Point;
       if( OsMA[i] > Z) ExtMapBuffer1[i] = High[i]+B*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

Sento che c'è qualcosa di sbagliato nel codice e non capisco cosa sia............................. AIUTATE IL MALE..... :-))

 
Perché le coppie più basilari : EUR/USD, USD/JPY non sono nell'archivio delle quotazioni? Forse sto facendo qualcosa di sbagliato?
 

Grazie ad Artem per le funzioni di KimIV.

Forse qualcuno lo sa: una delle funzioni TakeProfitLastClosePos() (restituisce il prezzo TakeProfit dell'ultima posizione chiusa o -1), restituisce il valore TakeProfit con quattro cifre decimali, e il mio DC dà cinque cifre decimali (coppia EURUSD). Non posso piazzare l'ordine successivo perché il valore di TakeProfit dell'ultima posizione chiusa e il prezzo per piazzare l'ordine successivo sono direttamente collegati tra loro.Potete aiutarmi ad uscire da questa situazione? Grazie in anticipo!!!

double TakeProfitLastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 
dimon74:

Grazie ad Artem per le funzioni di KimIV.

Forse qualcuno lo sa: una delle funzioni TakeProfitLastClosePos() (restituisce il prezzo TakeProfit dell'ultima posizione chiusa o -1), restituisce il valore TakeProfit con quattro cifre decimali, e il mio DC dà cinque cifre decimali (coppia EURUSD). Non posso piazzare l'ordine successivo perché il valore di TakeProfit dell'ultima posizione chiusa e il prezzo per piazzare l'ordine successivo sono direttamente collegati tra loro.Potete aiutarmi ad uscire da questa situazione? Grazie in anticipo!!!


In realtà, la funzione restituisce un valore con tutte le cifre significative dopo il punto decimale. Anche otto cifre decimali. È solo che l'uscita predefinita è di 4 cifre. Ma se usate DoubleToStr() prima, potete assicurarvi che
 
drknn:
OrderSend(Nome della coppia di valute.... e altri parametri......)


Ho bisogno di aiuto per capire il codice per l'EA multicurrency, ho bisogno che un EA funzioni e che i trade siano aperti su qualsiasi coppia di valute.

Ho scavato EA multicurrency in CodeBase, ma non riesco a capire cosa è dove e perché.

Se non capisci il codice dell'EA multicurrency non sarai in grado di controllarlo nello Strategy Tester (( Per favore spiegami, sulla base di questo codice o di qualche altro codice, cosa dovrebbe andare dove e perché, in modo che il mio EA faccia trading su tutte le coppie. Non lo capisco, ma se taglio il codice senza capirlo, funzionerà, ma ancora non capisco l'implementazione e dovrò chiedere di nuovo aiuto.

extern string Instrument = "EURUSD";
extern double Lots = 0.1;
extern int    TakeProfit = 50;
extern int    TrailingStop = 0;
extern int    StopLoss = 50;
extern int    FirstOpenLevel = 5;
extern int    LastOpenLevel = 20;
extern int    Slope = 2;
extern int    CloseLevel = 20;
 

int start()
{
   double MacdCurrent, MacdPrevious, SignalCurrent, SignalPrevious;
   int    i, total, p1, p2, p3, p4, p5, p6, p7, p8, p9;
  
   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);
      
   p1=0; p2=0; p3=0; p4=0; p5=0; p6=0; p7=0; p8=0; p9=0;
      
     OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
      
     OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(2,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(3,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(4,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
   
   total=OrdersTotal();
   for(i=0;i<total;i++)
   {
     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        
     if(OrderSymbol()==Instrument)
      {
         if(OrderType()==OP_BUY) 
          {
            if(MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent>CloseLevel*0.1*Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                 return(0);
                }
            if(TrailingStop>0)  
              {      
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
          if(OrderType()==OP_SELL)
           {
            if(SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent>CloseLevel*0.1*Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
            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);
                    }
                 }
              }
           }
        }
     }
   
   total=OrdersTotal();  
   if(total<5)
   {
     if((Instrument=="EURUSD" && p1<1) || (Instrument=="GBPUSD" && p2<1) || 
        (Instrument=="USDCHF" && p3<1) || (Instrument=="USDJPY" && p4<1) ||
        (Instrument=="EURCHF" && p5<1) || (Instrument=="EURGBP" && p6<1) ||
        (Instrument=="AUDUSD" && p7<1) || (Instrument=="USDCAD" && p8<1) ||
        (Instrument=="EURJPY" && p9<1)) 
      {
        if(MacdCurrent<0 && MacdCurrent-SignalCurrent>SignalCurrent*FirstOpenLevel*(-0.01)
           && MacdCurrent-SignalCurrent<SignalCurrent*LastOpenLevel*(-0.01)
           && MacdCurrent-MacdPrevious>MacdPrevious*Slope*(-0.01)
           && MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent<(CloseLevel-10)*0.1*Point)  
          {
           OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
           return(0); 
          }   
      
         if(MacdCurrent>0 && SignalCurrent-MacdCurrent>SignalCurrent*FirstOpenLevel*0.01
            && SignalCurrent-MacdCurrent<SignalCurrent*LastOpenLevel*0.01
            && MacdPrevious-MacdCurrent>MacdPrevious*Slope*0.01
            && SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent<(CloseLevel-10)*0.1*Point)
          {
           OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
           return(0); 
          }
       }
    }
}
 
igrok2008:

E questo è quello che ho ottenuto.......
Sento qualcosa di sbagliato nel codice e non so cosa sia................

Hai aggiunto una quarta matrice di indicatori, ma ne hai ancora tre nel tuo codice, qui sotto c'è il codice modificato:
int init(){
//---- indicators
   IndicatorBuffers(4);   
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);   
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);   
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(3,OsMA);   
//----
}
 
Infinity:
Ho bisogno di aiuto per capire il codice dell'EA multicurrency.

Ho scavato un EA multicurrency in CodeBase, ma non riesco a scoprire cosa c'è dove e perché.
Se non capisci il codice, non puoi controllarlo nello Strategy Tester. (( Per favore, spiegami, sulla base di questo codice o di qualche altro codice, cosa dovrebbe andare dove e perché, in modo che il mio EA possa operare su tutte le coppie. Non capisco il codice, ma potrebbe funzionare, ma ancora non capisco l'implementazione, e dovrò chiedere di nuovo aiuto.

Questo codice non è adatto a voi, in quanto apre le transazioni solo sulla coppia, a cui è attaccato, si può vedere sulle linee:

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);

La funzione Symbol () restituisce la coppia attuale. Di conseguenza, per aprire su altre coppie di valute, invece di questa funzione, basta inserire il nome desiderato dello strumento finanziario.

 
ToLik_SRGV:

Questo codice non è adatto a te perché apre solo trade sulla coppia a cui è collegato, questo si può vedere dalle linee:

La funzione Symbol () restituisce la coppia attuale. Di conseguenza, per aprire trade su altre coppie di valute, invece di questa funzione, basta digitare il nome dello strumento finanziario di cui avete bisogno.


Non è così facile. Dovete anche cambiare il Punto al valore giusto, e chiedere. E anche Bid.
 
ToLik_SRGV:

Questo codice non è adatto a te perché apre solo trade sulla coppia a cui è collegato, questo si può vedere dalle linee:

La funzione Symbol () restituisce la coppia attuale. Di conseguenza, per aprire trade su altre coppie di valute, invece di questa funzione, basta digitare il nome dello strumento finanziario di cui avete bisogno.


Questo è il punto. Il mio Expert Advisor riceve segnali da diverse coppie di valute e al posto della funzione Symbol(), riceve il nome della valuta da cui è stato ricevuto il segnale e al posto di una variabile nell'ordine, a cui viene assegnato il valore della coppia di valute. Ciò significa che se il segnale proviene da EUR, gli viene assegnato EURUSD se proviene da Yen, allora USDJPY ma l'EA vede tutti i segnali, ma apre solo la valuta su cui sta.

Ecco come faccio il seguente codice di esempio

//---- ранее на обработке переменная Symb получает значение валютной пары с которой пришол сигнал
// далее я сравниваю и пытаюсь открыть ордер
 if (Symb == "GBPUSD") {val ="GBPUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "EURUSD") {val ="EURUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "USDJPY") {val ="USDJPY"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
Motivazione: