Неужели никто не глядел код? Не могу понять, что не так? Спотыкается здесь:
MomSumBuffer[i]=iMAOnArray(MomBuffer,0,PeriodTDI,0,MODE_SMA,i);
Переделал код, чтобы в лоб вручную сумму считать, ничего не получилось. Я понимаю, что в array mql-4 ничего не понимаю.
Вспоминается предмет "Квантовая механика" и поговорка оттуда - "Кванты нельзя понять, к ним можно только привыкнуть" . Неужели такая же ситуация?
Вспоминается предмет "Квантовая механика" и поговорка оттуда - "Кванты нельзя понять, к ним можно только привыкнуть" . Неужели такая же ситуация?
Конечно, победил я с помощью функции-"паразита" ArrayResize(). :)
Но все равно не понимаю, разве на быстродействии не сказывается, что на каждом тике происходит
актуализация размера массива?
Но все равно не понимаю, разве на быстродействии не сказывается, что на каждом тике происходит
актуализация размера массива?
ArrayResize(MomBuffer,limit);
ArrayResize(MomAbsBuffer,limit);
ArrayResize(MomSumBuffer,limit);
ArrayResize(MomSumAbsBuffer,limit);
ArrayResize(MomAbsSumBuffer,limit);
ArrayResize(MomAbsSum2Buffer,limit);
ArraySetAsSeries(MomBuffer,true);
ArraySetAsSeries(MomAbsBuffer,true);
ArraySetAsSeries(MomSumBuffer,true);
ArraySetAsSeries(MomSumAbsBuffer,true);
ArraySetAsSeries(MomAbsSumBuffer,true);
ArraySetAsSeries(MomAbsSum2Buffer,true);
ArrayResize(MomAbsBuffer,limit);
ArrayResize(MomSumBuffer,limit);
ArrayResize(MomSumAbsBuffer,limit);
ArrayResize(MomAbsSumBuffer,limit);
ArrayResize(MomAbsSum2Buffer,limit);
ArraySetAsSeries(MomBuffer,true);
ArraySetAsSeries(MomAbsBuffer,true);
ArraySetAsSeries(MomSumBuffer,true);
ArraySetAsSeries(MomSumAbsBuffer,true);
ArraySetAsSeries(MomAbsSumBuffer,true);
ArraySetAsSeries(MomAbsSum2Buffer,true);
Дык массив у тебя динамический, и он очивидно просто выходит за границы массива. При объявлении массива надо указывать его длину:
В Делфи это делается так:
MomSumBuffer: array[1..1000] of double;
а на МкуЛе, очивидно, так:
double MomSumBuffer[1000];
Причем динамические массивы нужны, как правило, для хранения промежуточных данных, а потом удаляются для экономии памяти.
В Делфи так
MomSumBuffer:=NIL;
А на МкуЛе не знаю, у квотесов спроси. И вообще без ФАГа программировать - занятие для мазахиста.
В Делфи это делается так:
MomSumBuffer: array[1..1000] of double;
а на МкуЛе, очивидно, так:
double MomSumBuffer[1000];
Причем динамические массивы нужны, как правило, для хранения промежуточных данных, а потом удаляются для экономии памяти.
В Делфи так
MomSumBuffer:=NIL;
А на МкуЛе не знаю, у квотесов спроси. И вообще без ФАГа программировать - занятие для мазахиста.
Здесь уже работающий вариант, если интересно.
http://forexsystems.ru/phpBB/viewtopic.php?t=622
http://forexsystems.ru/phpBB/viewtopic.php?t=622
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Кто чего увидит - скажите , где ошибка?
//+------------------------------------------------------------------+ //| TDI.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 DarkBlue #property indicator_color2 Red //---- input parameters extern int PeriodTDI=20; //---- buffers double TDI_Buffer[]; double Direction_Buffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,TDI_Buffer); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,Direction_Buffer); SetIndexLabel(0,"Trend Direction Index"); SetIndexLabel(1,"Direction"); //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- TODO: add your code here //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { double MomBuffer[]; double MomAbsBuffer[]; double MomSumBuffer[]; double MomSumAbsBuffer[]; double MomAbsSumBuffer[]; double MomAbsSum2Buffer[]; bool First=true; int limit,i; int counted_bars=IndicatorCounted(); //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; if (First){limit=Bars-PeriodTDI; First=false;} else limit=Bars-counted_bars; // limit=Bars-PeriodTDI; ArraySetAsSeries(MomBuffer,true); ArraySetAsSeries(MomAbsBuffer,true); ArraySetAsSeries(MomSumBuffer,true); ArraySetAsSeries(MomSumAbsBuffer,true); ArraySetAsSeries(MomAbsSumBuffer,true); ArraySetAsSeries(MomAbsSum2Buffer,true); //---- TODO: add your code here for(i=0; i<limit; i++) { MomBuffer[i]=Close[i]-Close[i+PeriodTDI]; MomAbsBuffer[i]=MathAbs(MomBuffer[i]); // TDI_Buffer[i]=MomBuffer[i]; здесь будет выходить на экран // Direction_Buffer[i]=MomAbsBuffer[i]; } for(i=limit; i>=0; i--) { MomSumBuffer[i]=iMAOnArray(MomBuffer,0,PeriodTDI,0,MODE_SMA,i); MomSumAbsBuffer[i]=MathAbs(MomSumBuffer[i]); TDI_Buffer[i]=MomSumBuffer[i]; // здесь получаются нулевые значения Direction_Buffer[i]=MomSumAbsBuffer[i]; } // for(int l=limit; l>=0; l--) // { // MomAbsSumBuffer[l]=iMAOnArray(MomAbsBuffer,0,PeriodTDI,0,MODE_SMA,l)*PeriodTDI; // MomAbsSum2Buffer[l]=iMAOnArray(MomAbsBuffer,0,2*PeriodTDI,0,MODE_SMA,l)*2*PeriodTDI; // TDI_Buffer[l]=MomAbsSumBuffer[l]-MomAbsSum2Buffer[l]; // } //---- done //---- return(0); } //+------------------------------------------------------------------+