Come aggiornare gli indicatori per Build 600+? - pagina 2

 
perché per qualche motivo (probabilmente un bug) gli array non vengono inizializzati
 
qjol:
perché per qualche ragione (probabilmente un bug) gli array non sono inizializzati


Finora non sto ottenendo valori per 'T3MA' e 'HMA'.

Probabilmente questo è il motivo per cui questo EA non apre alcun ordine, dato che entrambi questi indici sono utilizzati in esso.

O ho fatto qualche errore nell'EA?

File:
xxp.mq4  5 kb
 
Arav007:


Finora non sto ottenendo valore per 'T3MA' e 'HMA'.

Te l'ho già detto

qjol:
perché per qualche motivo (probabilmente un bug) gli array non sono inizializzati

Probabilmente questo è il motivo per cui questo EA non sta aprendo alcun ordine dato che entrambi questi indici sono usati in esso.

Non so forse, probabilmente, forse, possibile, probabile, ragionevole

O avevo fatto qualche errore nell'EA?

Non credo

 
Arav007:


Sì, hai ragione. Ma perché?

Li ho compilati come ha detto SDC e ho trovato '0' Error o Warning.

Allora cosa posso fare per aggiornarli a B-600+?

HMA.mq4 ha un bug, cambia questa linea in init():

   if(!SetIndexBuffer(0,ind_buffer0) && !SetIndexBuffer(1,ind_buffer1))

a
   if(!SetIndexBuffer(0,ind_buffer0) || !SetIndexBuffer(1,ind_buffer1))
 
qjol:



Questo EA non apre alcun trade anche nella Build 509 dove sia 'T3MA' che 'HMA' funzionano bene.

Quale può essere la ragione allora?

 

Bug simile in T3MA.mq4, cambiare in :

   if(
      !SetIndexBuffer(0,e7) ||
      !SetIndexBuffer(1,e2) ||
      !SetIndexBuffer(2,e3) ||
      !SetIndexBuffer(3,e4) ||
      !SetIndexBuffer(4,e5) ||
      !SetIndexBuffer(5,e6) ||
      !SetIndexBuffer(6,e1)
      )

Questi sono bug logici che il compilatore non può catturare.

Questi bug sono già presenti nella build 509, ma non portano a un problema perché SetIndexBuffer ha poche possibilità di essere falso. Ora è un problema a causa di questo cambiamento:

Shortened conditions check is now used in logical operations, unlike the old MQL4 version where all expressions have been calculated and the check has been performed afterwards. Suppose there is a check of two conditions with the use of logical AND

  if(condition1 && condition2)
    {
     // some block of operations
    }

Se l'espressione condition1 è falsa, il calcolo dell'espressione condition2 non viene eseguito, poiché il risultato false && true è ancora uguale a false.


 
angevoyageur:

Bug simile in T3MA.mq4, cambiare in :

Questi sono bug logici che il compilatore non può catturare.

Grazie mille signore.

Sì, questi erano i bug e ora funzionano :)

Puoi per favore dare un'occhiata al perché l'EA non apre alcun ordine nonostante questi indicatori funzionino?

Saluti

 
Arav007:


Puoi per favore dare un'occhiata al perché l'EA non apre alcun ordine nonostante questi indicatori funzionino?



mostra il tuo codice EA
 
qjol:

mostra il tuo codice EA


Eccolo qui:

extern double    LotSize=0.01;
extern double    StopLoss=15.0;
extern double    TakeProfit=20.0;
extern int       iMaxOrders=10;
extern int       Slippage=5;
extern int       MagicNumber=814;


extern int       iOrderType_Buy=0;
extern int       iOrderType_Sell=1;


int BuyOrder;
int SellOrder;

int iOpenOrders_Sell;
int iOpenOrders_Buy;

int iLastError;


double dPip;
double dStopLossPrice, dTakeProfitPrice;


//+------------------------------------------------------------------+
#define  MODE_DEMA    4
#define  MODE_TEMA    5
#define  MODE_T3MA    6
#define  MODE_JMA     7
#define  MODE_HMA     8
#define  MODE_DECEMA  9
#define  MODE_SALT    10
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
extern   int      MA_Period               = 34;
extern   int      MA_Type                 = MODE_HMA;
extern   int      MA_Applied              = PRICE_CLOSE;
extern   double   T3MA_VolumeFactor       = 0.8;
extern   double   JMA_Phase               = 0.0;
extern   int      Step_Period             = 3;
extern   int      BarsCount               = 100;
extern   bool     DebugMode               = false;
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{

if(Digits==3){
        dPip = 0.01;
}else{
        dPip = 0.0001;
}

return(0);

}

int deinit()
{

Comment("");
return(0);

}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+



int start()
{

   double  signal = iCustom(NULL,0,"xpMA",MA_Period,MA_Type,MA_Applied ,T3MA_VolumeFactor,JMA_Phase,Step_Period,DebugMode,3,0);
   
   bool BuyCondition = false , SellCondition = false , CloseBuyCondition = false , CloseSellCondition = false; 
   
   if (signal==1)
       BuyCondition = true;
       
   if (signal==-1)
      SellCondition = true;

///////////////////////////// Checking Buying Condition
if(BuyCondition)
{               
                double OpenPrice=Ask;

                
                dStopLossPrice = NormalizeDouble(OpenPrice - StopLoss * dPip,Digits);
                dTakeProfitPrice = NormalizeDouble(OpenPrice + TakeProfit * dPip,Digits);
                

                BuyOrder=OrderSend(Symbol() , iOrderType_Buy , LotSize,OpenPrice,Slippage ,dStopLossPrice ,dTakeProfitPrice , "Buy Order",MagicNumber , 0,Blue);
                
                
                 if(BuyOrder>0) {
                                Print("Buy Order was Opened");
                                iLastError = 0;
                        }
                        else
                        {                       
                                iLastError = GetLastError();                    
                        
                        }
        
}
        

if(SellCondition)
{       
                OpenPrice=Bid;
                
                dStopLossPrice = NormalizeDouble(OpenPrice + StopLoss * dPip,Digits);
                dTakeProfitPrice = NormalizeDouble(OpenPrice - TakeProfit * dPip,Digits);

                SellOrder=OrderSend(Symbol() , iOrderType_Sell , LotSize,OpenPrice,Slippage ,dStopLossPrice ,dTakeProfitPrice , "Sell Order",MagicNumber , 0,Red);
                
                
                if(SellOrder>0) {
                                Print("Sell Order was opened");
                                iLastError = 0;
                        }else{
                                iLastError = GetLastError();
                        
                        }               
        }
                


return (0);

}
 

iCustom

Calcola l'indicatore personalizzato specificato e restituisce il suo valore.

doppio iCustom(
stringa simbolo, // simbolo
int timeframe, // timeframe
string name, // percorso/nome del programma compilato dell'indicatore personalizzato
... // parametri di input dell'indicatore personalizzato (se necessario)
int mode, // indice della linea
int shift // shift
);

Parametri

simbolo

[nome del simbolo sui dati di cui verrà calcolato l'indicatore. NULL significa il simbolo corrente.

timeframe

[in] Timeframe. Può essere uno qualsiasi dei valori dell'enumerazione ENUM_TIMEFRAMES. 0 significa il timeframe del grafico corrente.

nome

[in] Nome del programma compilato dell'indicatore personalizzato, relativo alla directory principale degli indicatori (MQL4/Indicators/). Se l'indicatore si trova in una sottodirectory, per esempio, in MQL4/Indicators/Examples, il suo nome deve essere specificato come "Examples\indicator_name" (il doppio backslash "\"deve essere specificato come separatore invece di uno singolo).

...

[in] Parametri di ingresso dell'indicatore personalizzati, separati da virgole.

I parametri passati e il loro ordine devono corrispondere all'ordine di dichiarazione e al tipo di variabili esterne dell'indicatore personalizzato. Se i valori dei parametri di input non sono specificati, verranno utilizzati i valori predefiniti.