Поточнее чуть
Странную ситуацию наблюдаю.
создаю массив например MyArray[100000]
Заполняю его в индикаторе различными коэффициентами.
И поллучается такая вещь (например):
var = 11122;
MyArray[var] = 10;
MyArray[var+1] = 20;
Вывожу с помошью функции Print содержимое массива
Print(MyArray[var],",",MyArray[11122]);
и получается после каждого запуска расчета индикатора:
.... 20,10
.... 20,10
.... 10,10
.... 10,10
.... 20,10
Т.е. доступ по абсолютному значению индекса массива всегда постоянен, доступ по значению переменной плавает.
Причем я не нашел никакой закономерности.
Господа разработчики, гляньте плиз свой код.
Странную ситуацию наблюдаю.
создаю массив например MyArray[100000]
Заполняю его в индикаторе различными коэффициентами.
И поллучается такая вещь (например):
var = 11122;
MyArray[var] = 10;
MyArray[var+1] = 20;
Вывожу с помошью функции Print содержимое массива
Print(MyArray[var],",",MyArray[11122]);
и получается после каждого запуска расчета индикатора:
.... 20,10
.... 20,10
.... 10,10
.... 10,10
.... 20,10
Т.е. доступ по абсолютному значению индекса массива всегда постоянен, доступ по значению переменной плавает.
Причем я не нашел никакой закономерности.
Господа разработчики, гляньте плиз свой код.
по коду
Если взять за пример такой код:
Если взять за пример такой код:
array: MyArray[100000](0);
var: myvar(11122);
myvar=11122;
MyArray[myvar] = 10;
MyArray[myvar+1] = 20;
Print(MyArray[myvar],",",MyArray[11122]);
то все работает правильно, выдает
10,10
Проверьте Ваш код - возможно где то ошибка. Или пришлите свой код для проверки на stringo@metaquotes.ru
Отправил пример кода на указанный Вами ящик.
subj.
Жду результатов проверки.
Спасибо.
subj.
Жду результатов проверки.
Спасибо.
ответ ушёл по указанному Вами адресу
!!! Пожалуйста отнеситесь серьезнее к проблемме !!!
Вот выжимка для тестирования.
Тест проводить на eurusd5
Посмотрите плиз на линию индикатора - это не правильно!!!!
Все подтверждается логами функции Print.
/*[[
Name := Test_array12100
Author := Copyright © 2003, MetaQuotes Software Corp.
Link := https://www.metaquotes.net/
Notes := Sample Custom Indicator program
Separate Window := No
First Color := Red
First Draw Type := Line
First Symbol := 217
Use Second Data := Yes
Second Color := Blue
Second Draw Type := Line
Second Symbol := 218
]]*/
Vars : CurrentBar(0),shift(0),BeginBar(0),nAccountedBars(0),prevBars(0),LastAccBar(0);
Vars : LoopCount(0);
Vars : MinUp(0),MinDn(0);
Vars : Up(0),Dn(0),i(0),j(0),CentrBar(0);
Vars : File(0);
Vars : VarTest(12100);
Arrays : PriceL[100000](1);
//
SetLoopCount(0);
if BeginBar = 0 then
{
BeginBar = Bars - 500;
};
//
If BeginBar-1 = Bars-1 Then
{
Exit;
};
//
LoopCount = 0;
//
For CurrentBar = BeginBar To Bars-1
{
LastAccBar = LastAccBar + 1; // êîëè÷åñòâî ïðîñ÷èòàííûõ áàðîâ
shift = Bars - 1 - CurrentBar;
Dn = L[shift]/Point;
// print(" Dn=",Dn);
PriceL[VarTest] = VarTest;
//
if Dn > VarTest+1 then
{
//
i = Dn;
// ïðîñòî èùó êîãäà PriceL[12100] áóäåò ðàâåí 12100
While true
{
i--;
if (PriceL[i]= VarTest) then Break;
};
MinDn = i;
print(TimeToStr(Time[shift])," PriceL[",MinDn,"]=",PriceL[MinDn]," PriceL[",VarTest,"]= ",PriceL[VarTest]," PriceL[12101]= ",PriceL[12101]," Dn= ",Dn, " shift= ", shift, " i= ",i);
};
//
// SetIndexValue(shift, MinUp*Point);
SetIndexValue2(shift, MinDn*Point);
BeginBar = CurrentBar+1;
};
Вот выжимка для тестирования.
Тест проводить на eurusd5
Посмотрите плиз на линию индикатора - это не правильно!!!!
Все подтверждается логами функции Print.
/*[[
Name := Test_array12100
Author := Copyright © 2003, MetaQuotes Software Corp.
Link := https://www.metaquotes.net/
Notes := Sample Custom Indicator program
Separate Window := No
First Color := Red
First Draw Type := Line
First Symbol := 217
Use Second Data := Yes
Second Color := Blue
Second Draw Type := Line
Second Symbol := 218
]]*/
Vars : CurrentBar(0),shift(0),BeginBar(0),nAccountedBars(0),prevBars(0),LastAccBar(0);
Vars : LoopCount(0);
Vars : MinUp(0),MinDn(0);
Vars : Up(0),Dn(0),i(0),j(0),CentrBar(0);
Vars : File(0);
Vars : VarTest(12100);
Arrays : PriceL[100000](1);
//
SetLoopCount(0);
if BeginBar = 0 then
{
BeginBar = Bars - 500;
};
//
If BeginBar-1 = Bars-1 Then
{
Exit;
};
//
LoopCount = 0;
//
For CurrentBar = BeginBar To Bars-1
{
LastAccBar = LastAccBar + 1; // êîëè÷åñòâî ïðîñ÷èòàííûõ áàðîâ
shift = Bars - 1 - CurrentBar;
Dn = L[shift]/Point;
// print(" Dn=",Dn);
PriceL[VarTest] = VarTest;
//
if Dn > VarTest+1 then
{
//
i = Dn;
// ïðîñòî èùó êîãäà PriceL[12100] áóäåò ðàâåí 12100
While true
{
i--;
if (PriceL[i]= VarTest) then Break;
};
MinDn = i;
print(TimeToStr(Time[shift])," PriceL[",MinDn,"]=",PriceL[MinDn]," PriceL[",VarTest,"]= ",PriceL[VarTest]," PriceL[12101]= ",PriceL[12101]," Dn= ",Dn, " shift= ", shift, " i= ",i);
};
//
// SetIndexValue(shift, MinUp*Point);
SetIndexValue2(shift, MinDn*Point);
BeginBar = CurrentBar+1;
};
разберёмся
разобрались
для того, чтобы приводить числа с плавающей точкой(цены) к целым числам (индексам массива) используйте функцию Normalize
то есть вместо строки :
Dn = L[shift]/Point;
обязательно используйте :
Dn = Normalize(L[shift]/Point,0);
или
Dn = Round(L[shift]/Point);
Получилось вот что - число типа 12100.9999999999999999999999 любым принтом будет выведено как 12101.0
но если это число использовать в качестве индекса, то будет взята только целая часть, то есть 12100
для того, чтобы приводить числа с плавающей точкой(цены) к целым числам (индексам массива) используйте функцию Normalize
то есть вместо строки :
Dn = L[shift]/Point;
обязательно используйте :
Dn = Normalize(L[shift]/Point,0);
или
Dn = Round(L[shift]/Point);
Получилось вот что - число типа 12100.9999999999999999999999 любым принтом будет выведено как 12101.0
но если это число использовать в качестве индекса, то будет взята только целая часть, то есть 12100
Спасибо :)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Странную ситуацию наблюдаю.
создаю массив например MyArray[100000]
Заполняю его в индикаторе различными коэффициентами.
И поллучается такая вещь (например):
var = 111222;
MyArray[var] = 10
MyArray[var+1] = 20
Вывожу с помошью функции Print содержимое массива
Print(MyArray[var],MyArray[111222]);
и получается после каждого запуска расчета индикатора:
.... 20,10
.... 20,10
.... 10,10
.... 10,10
.... 20,10
Т.е. доступ по абсолютному значению индекса массива всегда постоянен, доступ по значению переменной плавает.
Причем я не нашел никакой закономерности.
Господа разработчики, гляньте плиз свой код.