EMA1[] and EMA2[] arrays are too small, because the first two indices of EMA3[] are used.
Thanks for the reply!
After altering Raffs indicator:
for(i=0; i<Bars; i++) ind_buffer1[i]=iMA(NULL,0,TRIX_Period,0,MODE_EMA,PRICE_CLOSE,i);
for(i=0; i<Bars; i++) ind_buffer2[i]=iMAOnArray(ind_buffer1,Bars,TRIX_Period,0,MODE_EMA,i);
for(i=0; i<Bars; i++) ind_buffer5[i]=iMAOnArray(ind_buffer2,Bars,TRIX_Period,0,MODE_EMA,i);
i=Bars-2;
while(i>=0)
{
ind_buffer1[i]=((ind_buffer5[i]-ind_buffer5[i+1])/ind_buffer5[i+1])*10000;
i--;
}
for(i=0; i<Bars; i++) ind_buffer2[i]=iMAOnArray(ind_buffer1,Bars,Signal_Period,0,MODE_EMA,i);
Comment("B1 ", ArraySize(ind_buffer1), "\nB2 ", ArraySize(ind_buffer2), "\nB5 ", ArraySize(ind_buffer5)); // On operation, this shows that the array sizes are the same!
I then altered this:
ArrayResize(EMA1, period);
ArrayResize(EMA2, period);
ArrayResize(EMA3, period);
to
ArrayResize(EMA1, period * or + a number );
ArrayResize(EMA2, period * or + a number);
ArrayResize(EMA3, period);
and got very strange results. Perhaps I misunderstood something?
Depending on how many bars you want to look back, it should be increased by 1 or 2.
Code isn't tested.
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- double Trix[2][2]; if(TriX(_Symbol,0,Period,Signal,Trix)!=4) return; if(Trix[0][0]>Trix[0][1] && Trix[1][0]<Trix[1][1]) OrderSend(OP_BUY,...); //--- return; } //+------------------------------------------------------------------+ //| TriX | //+------------------------------------------------------------------+ char TriX(const string symbol, ENUM_TIMEFRAMES timeframe, const int period, const int signal, double &trix[2][2]) { if(period<2 || signal<2) return(0); char count=0; //--- static double EMA1[],EMA2[],EMA3[],Trix[]; if(ArrayResize(EMA1,period+2)!=period+2 || ArrayResize(EMA2,period+2)!=period+2 || ArrayResize(EMA3,signal+2)!=signal+2 || ArrayResize(Trix,signal+1)!=signal+1) return(0); //--- for(int i=0;i<period+2;i++) EMA1[i]=iMA(symbol,timeframe,period,0,MODE_EMA,PRICE_CLOSE,i); for(int i=0;i<period+2;i++) EMA2[i]=iMAOnArray(EMA1,0,period,0,MODE_EMA,i); for(int i=0;i<signal+2;i++) EMA3[i]=iMAOnArray(EMA2,0,period,0,MODE_EMA,i); for(int i=0;i<signal+1;i++) Trix[i]=(EMA3[i+1]!=0.0)?(EMA3[i]-EMA3[i+1])/EMA3[i+1]:0.0; //--- trix[0][0]=Trix[0]; count++; trix[1][0]=Trix[1]; count++; trix[0][1]=iMAOnArray(Trix,0,signal,0,MODE_SMA,0); count++; trix[1][1]=iMAOnArray(Trix,0,signal,0,MODE_SMA,1); count++; //--- return(count); } //+------------------------------------------------------------------+
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello! I'm hoping someone out there can help me... I have taken the Trix indicator made by Raff here: https://www.forex-tsd.com/forum/debates-discussions/3142-trend-deviation-trd#comment_73338
and have tried to convert it to a function for EAs. However, the output result is NEVER the same as the indicator. I have looked over and messed with this code for a week now. The function is below:
double Trix(int period, int signal, int tf, int mode, int shift) {
if (period == 0) { return 0; }
if (signal == 0) { return 0; }
if (tf == 0) { return 0; }
double dataArray[];
//ArraySetAsSeries(dataArray, true);
ArrayResize(dataArray, period); // Load extra data
// Load data to the array
for (int i = 0; i < period; i++) { dataArray[i] = Close[i]; }
double EMA1[];
double EMA2[];
double EMA3[];
int i = 0;
//ArraySetAsSeries(EMA1, true);
//ArraySetAsSeries(EMA2, true);
//ArraySetAsSeries(EMA3, true);
ArrayResize(EMA1, period);
ArrayResize(EMA2, period);
ArrayResize(EMA3, period);
for (i = 0; i < period; i++) { EMA1[i] = iMAOnArray(dataArray, 0, period, 0, MODE_EMA, i); }
//for(i = 0; i < period; i++) EMA1[i] = iMA(Symbol(), tf, period, 0, MODE_EMA, PRICE_CLOSE, i);
for (i = 0; i < period; i++) { EMA2[i] = iMAOnArray(EMA1, 0, period, 0, MODE_EMA, i); }
for (i = 0; i < period; i++) { EMA3[i] = iMAOnArray(EMA2, 0, period, 0, MODE_EMA, i); }
i = period - 2;
while (i >= 0) {
EMA1[i] = ((EMA3[i] - EMA3[i + 1]) / EMA3[i + 1]) * 10000; // The *10000 is to see the number better
i--;
}
//ArraySetAsSeries(EMA2, true);
for (i = 0; i < period; i++) { EMA2[i] = iMAOnArray(EMA1, 0, signal, 0, MODE_EMA, i); }
//ArraySetAsSeries(EMA2, false);
if (mode == 1) { return EMA1[shift]; }
if (mode == 2) { return EMA2[shift]; }
if (mode == 3) { return EMA1[shift] - EMA2[shift]; }
return 0;
}