Всем доброго времени суток! Вопрос по mql4 , а конкретнее по функции ArraySort() Вот мой код
double LoY[31][31];
int P1;
voidOnTick()
{
if (TimeCurrent()==1262568096)
{
for(int r=0; r<31;r++)
{
LoY[r][0]=1.6104;
LoY[r][1]=r;
P1=1;
}
}
if (TimeCurrent()>1262568095)
{
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
for( r=0; r<31;r++)
Print("-------------------------------------LoY[r][1]--------------=", LoY[r][1]," r ", r," LoY[r][0] ", DoubleToString( LoY[r][0],5));
}
if (Bid-LoY[0][0]>=0.0030)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+300*Point,Ask-100*Point,"300",0);
LoY[0][0]=Bid;
}
}
После того как LoY[0][0] после открытия ордера получила значение Bid( то есть 1.6134) функция ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) отсортировала массив по возрастанию по первому измерению и поместила элемент массива с самым большим значением в самый верх массива. То есть LoY[0][0] вместе со своим значением стала LoY[30][0] в отсортированном по возрастанию массиве. Это логично и поэтому я с этим согласен.
Что на мой взгляд не логично и не приемлемо для меня? Почему ArraySort() LoY[15][0] поместила под индексом 0 не смотря на то что ее значение (1.61040) равно значениям всех остальных элементов массива кроме тридцатого. Так же не понятно почему ArraySort() LoY[30][0] поместила под индексом 15 не смотря на то что ее значение (1.61040) равно значениям всех остальных элементов массива кроме тридцатого.
ВОПРОС. Как сделать так что бы на данном тике элементом с индексом 0 был LoY[1][0] , а элементом с индексом 15 был LoY[15][0], а элементом с индексом 29 был LoY[30][0] То есть как сделать так что функция и в дальнейшем не сортировала элементы с одинаковыми значениями. Ведь это не логично и бессмысленно.
Для работы с графикой в MQL5 создана специальная библиотека Graphic.mqh. В статье описан пример ее практического применения и поясняется сама суть сортировок. По каждой сортировке существует как минимум отдельная статья, а по ряду из них уже опубликованы целые исследования, поэтому здесь описывается лишь общая идея.
MakarFX: Очень странно, на всех новых открытых графиках ставит метку, только один график игнорирует (
Внимательно почитайте документацию и пример кода. У вас неправильно организован цикл.
//--- переменные для идентификаторов графиковlong currChart,prevChart=ChartFirst();
int i=0,limit=100;
Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
while(i<limit)// у нас наверняка не больше 100 открытых графиков
{
currChart=ChartNext(prevChart); // на основании предыдущего получим новый графикif(currChart<0) break; // достигли конца списка графиковPrint(i,ChartSymbol(currChart)," ID =",currChart);
prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
i++;// не забудем увеличить счетчик
}
Только не говорите, что цикл for и while одинаково работают. Проблема не в этом, а в выделенных строках.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вопрос по mql4 , а конкретнее по функции ArraySort()
Вот мой код
После того как LoY[0][0] после открытия ордера получила значение Bid( то есть 1.6134) функция ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND) отсортировала массив по возрастанию по первому измерению и поместила элемент массива с самым большим значением в самый верх массива. То есть LoY[0][0] вместе со своим значением стала LoY[30][0] в отсортированном по возрастанию массиве. Это логично и поэтому я с этим согласен.
Что на мой взгляд не логично и не приемлемо для меня? Почему ArraySort() LoY[15][0] поместила под индексом 0 не смотря на то что ее значение (1.61040) равно значениям всех остальных элементов массива кроме тридцатого. Так же не понятно почему ArraySort() LoY[30][0] поместила под индексом 15 не смотря на то что ее значение (1.61040) равно значениям всех остальных элементов массива кроме тридцатого.
ВОПРОС. Как сделать так что бы на данном тике элементом с индексом 0 был LoY[1][0] , а элементом с индексом 15 был LoY[15][0], а элементом с индексом 29 был LoY[30][0]
То есть как сделать так что функция и в дальнейшем не сортировала элементы с одинаковыми значениями. Ведь это не логично и бессмысленно.
Спасибо за помощь.
Вероятно такой алгоритм сортировки. Происходят некоторые перестановки элементов массива.
Попробуйте другие варианты сортировки.
Вероятно такой алгоритм сортировки. Происходят некоторые перестановки элементов массива.
Попробуйте другие варианты сортировки.
Спасибо большое за совет. Подскажите пожалуйста в mql4 другие варианты сортировки есть? Если есть где они находятся в Справочнике?
попробуйте:
правда функция для одномерного массива, но можно переделать
попробуйте:
правда функция для одномерного массива, но можно переделать
Спасибо большое.
Подскажите, пожалуйста,
код ищет открытые графики и создает метку с названием символа, но если два графика с одинаковым символом,
то создает метку только на одном графике.Что я делаю не так?
Подскажите, пожалуйста,
код ищет открытые графики и создает метку с названием символа, но если два графика с одинаковым символом,
то создает метку только на одном графике.Что я делаю не так?
Идентификаторы графиков (ChartID()) одного и того же символа отличаются. Их используйте.
Идентификаторы графиков (ChartID()) одного и того же символа отличаются. Их используйте.
ChartFirst()+iт.е. перебираю все открытые графики
или я не правильно тебя понял? Можно как-то наглядно, в виде кода?
Очень странно, на всех новых открытых графиках ставит метку, только один график игнорирует (
Внимательно почитайте документацию и пример кода. У вас неправильно организован цикл.
Только не говорите, что цикл for и while одинаково работают. Проблема не в этом, а в выделенных строках.