Как обновить индикаторы для Build 600+? - страница 2

 
потому что по какой-то причине (возможно, ошибка) массивы не инициализируются
 
qjol:
потому что по какой-то причине (возможно, ошибка) массивы не инициализируются.


Пока что я не получаю значения для 'T3MA' и 'HMA'.

Возможно, именно поэтому советник не открывает ни одного ордера, так как в нем используются оба этих индекса.

Или я допустил какую-то ошибку в советнике?

Файлы:
xxp.mq4  5 kb
 
Arav007:


Пока что я не получаю значения для 'T3MA' и 'HMA'.

Я уже говорил вам

qjol:
потому что по какой-то причине (возможно, ошибка) массивы не инициализируются.

Возможно, именно поэтому советник не открывает ни одного ордера, поскольку в нем используются оба этих индекса.

Я не знаю, возможно, вероятно, возможно, возможно, вероятно, вероятно, разумно.

Или я допустил какую-то ошибку в советнике?

я так не думаю

 
Arav007:


Да, вы правы. Но почему?

Я скомпилировал их, как сказал SDC, и обнаружил "0" ошибок или предупреждений.

Тогда что я могу сделать, чтобы обновить их до B-600+?

В HMA.mq4 есть ошибка, измените эту строку в init() :

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

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



Этот советник не открывает ни одной сделки даже в Build 509, где и 'T3MA' и 'HMA' работают нормально.

В чем может быть причина?

 

Аналогичная ошибка в T3MA.mq4, измените на :

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

Это логические ошибки, которые компилятор не может отловить.

Эти ошибки уже присутствуют в билде 509, но не приводят к проблеме, так как у SetIndexBuffer мало шансов оказаться ложным. Теперь это стало проблемой из-за этого изменения:

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
    }

Если выражение условия1 равно false, то вычисление выражения условия2 не выполняется, так как результат false && true все равно равен false.


 
angevoyageur:

Аналогичная ошибка в T3MA.mq4, измените на :

Это логические ошибки, которые компилятор не может поймать.

Большое спасибо, сэр.

Да, это были баги и сейчас они работают :)

Не могли бы вы посмотреть, почему советник вообще не открывает ордера, несмотря на то, что эти индикаторы работают?

С уважением,

 
Arav007:


Посмотрите, пожалуйста, почему советник вообще не открывает ордера, несмотря на то, что эти индикаторы работают?



покажите код вашего советника
 
qjol:

покажите свой код эксперта


Вот он:

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

Вычисляет указанный пользовательский индикатор и возвращает его значение.

double iCustom(
string символ, // символ
int timeframe, // таймфрейм
string name, // путь/имя скомпилированной программы пользовательского индикатора
... // входные параметры пользовательского индикатора (если необходимо)
int mode, // индекс строки
int shift // сдвиг
);

Параметры

символ

[in] Имя символа, на данных которого будет рассчитываться индикатор. NULL означает текущий символ.

таймфрейм

[in] Таймфрейм. Это может быть любое из значений перечисления ENUM_TIMEFRAMES. 0 означает текущий таймфрейм графика.

name

[in] Имя скомпилированной программы пользовательского индикатора, относительно корневого каталога индикаторов (MQL4/Indicators/). Если индикатор находится в подкаталоге, например, в MQL4/Indicators/Examples, то его имя должно быть указано как "Examples\\\indicator_name" (в качестве разделителя вместо одинарной обратной косой черты "\\\"должен быть указан двойной обратный слэш).

...

[in] Пользовательские входные параметры индикатора, разделенные запятыми.

Передаваемые параметры и их порядок должны соответствовать порядку объявления и типу внешних переменных пользовательского индикатора. Если значения входных параметров не указаны, будут использованы значения по умолчанию.