Изучаем язык программирования MQL4

DomovenokBrest

♔♕♖♗♘♙
Потому что индексы массивов, как и нумерация символов в списке начинаются с 0 и заканчиваются размер - 1.
for(int i=list-1; i>=0; i--)
Да, но так выводит один пустой "символ"
 

Вложения

  • Снимок.JPG
    Снимок.JPG
    51,1 КБ · Просмотры: 16

vladradon

Программист
Потому что индексы массивов, как и нумерация символов в списке начинаются с 0 и заканчиваются размер - 1.
for(int i=list-1; i>=0; i--)
Переменная в цикле For когда приобретает значение -1, цикл останавливается - к массивам это никак не относится - как был отсчет с 0 и далее, так и продолжится.
 

Ugar

Гуру форума
Да, но так выводит один пустой "символ"
Пригляделся, там вообще живого места нет от ошибок. Зачем там n? Зачем массив? Зачем 2 цикла?
Есть список напечатать и всё
Код:
int total=SymbolsTotal(true);
Print("Символов ",total);
for(int i=0; i<total; i++)Print(i," ",SymbolName(i,true));
 

BorisSedov

Активный участник
Да, но так выводит один пустой "символ"
В массиве вы задействовали переменную i, а также n для подсчета. На первой итерации n = 1, и вы первый и последующие символы из массива запрашиваете по индексу = 1, 2, 3, .. .. . А нужно начинать с 0 или с SymbolsTotal(true)-1.

Пример на основе вашего кода:
C++:
#property strict

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
int n=0;

for(int i=SymbolsTotal(true)-1; i>=0; i--)
   {
   n++;
   Print("Symbol = ",SymbolName(i,true)," - ",n);
   }
}
//+------------------------------------------------------------------+
 

Ugar

Гуру форума
Ну а если так хочется загнать символы в массив, а потом напечатать из него. Например если нужен массив с символами не только для печати
Код:
int total=SymbolsTotal(true);
Print("Символов ",total);
string Symbols[];
ArrayResize(Symbols,total);
for(int i=0; i<total; i++)Symbols[i]=SymbolName(i,true);
for(int i=0; i<total; i++)Print(i," ",Symbols[i]);
 

BorisSedov

Активный участник
Может посоревнуемся - кто больше вариантов решения тех же задач напишет без применения %? Ты для меня не тот уровень...
Принимаю вызов и предлагаю следующую задачу.
Нужно написать скрипт, который определяет является ли число простым.
Результат проверки выводить при помощи функции Print.
Код написать без использования операций / и %.
Скрипт принимает число k (ulong) в диапазоне от 0 до 18446744073709551615 включительно, и определяет – является ли заданное число простым.
(последовательность простых чисел начинается так: 2, 3, 5, 7, 11, .. ..)

Лучшим решением будет тот вариант, который работает быстрее. По этому много вариантов реализации представлять не нужно, достаточно выбрать самый быстрый.
 

Ugar

Гуру форума
А я, а я, а я вообще динозавр. Калькулятор программировал. Да, когда то были программируемые калькуляторы. И да, в них не было кнопки =.
Господа!. Может хватит мериться "клавиатурами"? Здесь ветка не про это. Новичкам пользы от этого будет не много. Разве что увидят что программисты хоть и научились думать как компьютеры, но не растеряли навык собачиться как люди.
 

Ugar

Гуру форума
Многомерные массивы. Измерений в массивах может быть не больше 4, 0 - 3. Каждое измерение в отдельных квадратных скобках. В многомерном массиве можно менять размер только 0 измерения. Размеры всех остальных измерений задаются при объявлении и изменяться не могут. Например int Array[][10][5];
Можно представить одномерный массив int Array[] как цепочку, где каждое каждое звено это ячейка.
Двухмерный int Array[10][10] массив можно представить как плоскость с координатной сеткой где 0 измерение это ширина, а 1 измерение высота. 10 ячеек в ширину, 10 в высоту.
3х мерный массив int Array[10][10][10] можно представить как куб, где 0 измерение это ширина, а 1 измерение высота, а 2 измерение глубина. 10 ячеек в ширину, 10 в высоту, 10 в глубь.
4х мерный массив int Array[10][10][10][10] я не могу представить как геометрическую фигуру, но это не мешает ими пользоваться.
 

vladradon

Программист
Значение k задается во входных параметрах скрипта (input).
Можно ведь сделать один раз расчет в заданном диапазоне с использованием всех доступных средств и вычислить все простые числа, занести их в массив(ы) и потом тупо проверять заданное число, есть ли оно в списке, так сказать - никаких делений и процентов - один раз создаем базу данных простых чисел и просто если не находим в ней заданное число, значит оно не простое. Т.е. активную часть, даже если без деления и % мы запускаем один раз и храним в файле (к примеру), а пассивную используем по надобности. Но я опять же не вижу в этом какого-то смысла - у меня не возникает мыслей, где это в реале может пригодиться, поэтому !(пишется слитно!) писать никому ненужный код не вижу смысла.
 
Последнее редактирование:

BorisSedov

Активный участник
Можно ведь сделать один раз расчет в заданном диапазоне с использованием всех доступных средств и вычислить все простые числа, занести их в массив(ы) и потом тупо проверять заданное число, есть ли оно в списке, так сказать - никаких делений и процентов - один раз создаем базу данных простых чисел и просто если не находим в ней заданное число, значит оно не простое. Т.е. активную часть, даже если без деления и % мы запускаем один раз и храним в файле (к примеру), а пассивную используем по надобности. Но я опять же не вижу в этом какого-то смысла - у меня не возникает мыслей, где это в реале может пригодиться, поэтому !(пишется слитно!) писать никому ненужный код не вижу смысла.
Вы предлагаете хранить в файле приблизительно 4 * 10^17 чисел размером по 8 байт. Вы задумывались о том, какого размера получится этот файл. Если нет, то я для вас это уже подсчитал – файл займет приблизительно 3 000 петабайт. :)
Если вы владеете такими мощностями для решения такой простой задачи, то решайте так. А я предлагаю решить эту задачу без использования массивов и файлов, также не применяя операции / и %.
А смысл решения этой простой задачи в том, чтобы убедиться в вашем высоком уровне, и сравнить ваше решение с моим по быстродействию.
Или эта задача для вас слишком сложная?
 

DomovenokBrest

♔♕♖♗♘♙
Прежде чем задавать задачи нужно рассказать и показать и тем более объяснить материал по задаче!
Утверждение не лишено логического смысла ))), а с другой стороны, иногда плавать учат бросив в воду... :ROFLMAO::ROFLMAO::ROFLMAO:
 

BorisSedov

Активный участник
Тема вроде для начинающих??? К сожалению как и на всех форумах одно и тоже... Программисты меряются тем "у кого что есть".
Мне предложили посоревноваться, я предложение принял.
Задача предназначалась не для начинающих, хотя и достаточно простая.
В контексте раздела форума "Язык программирования MQL4", а также темы "Изучаем язык программирования MQL4", считаю что идея с решением задач очень полезна для получения навыков программирования.
 

vladradon

Программист
Вы предлагаете хранить в файле приблизительно 4 * 10^17 чисел размером по 8 байт. Вы задумывались о том, какого размера получится этот файл. Если нет, то я для вас это уже подсчитал – файл займет приблизительно 3 000 петабайт. :)
Для начала я не предлагаю хранить все 18 446 744 073 709 551 615 возможных вариантов, а увеличивать индексацию массива на 1 и записывать данные только в случае пройденной проверки на "простое"!!! и Этот объем инфы займет "копейки" по килобайтам!)))
Можно вообще просто один раз сформировать массив простых чисел и просто использовать его - создание такого массива вообще не проблема - его не нужно перепроверять, т.к. данные в нем являются константами.
 
Последнее редактирование:

BorisSedov

Активный участник
Для начала я не предлагаю хранить все 18 446 744 073 709 551 615 возможных вариантов, а увеличивать индексацию массива на 1 и записывать данные только в случае пройденной проверки на "простое"!!! и Этот объем инфы займет "копейки" по килобайтам!)))
Можно вообще просто один раз сформировать массив простых чисел и просто использовать его - создание такого массива вообще не проблема - его не нужно перепроверять, т.к. данные в нем являются константами.
Простых чисел в диапазоне от 0 до 18 446 744 073 709 551 615 приблизительно 2,3 %,
а это объем данных приблизительно 3 000 петабайт (4 * 10^17 чисел размером по 8 байт).
О каких "копейках" вы ведете речь? :)
3 000 петабайт – это гигантский объем данных.
 
Последнее редактирование:

Ugar

Гуру форума
Практическое применение многомерных массивов.
Например можно в двухмерный массив Price[][4] загнать цены бара High, Low, Open, Close. В 0 измерении будут бары, а в 1 измерении 4 цены.
Код:
double Price[10][4];
for(int i=0; i<10; i++)
{
Price[i][0]=iHigh(NULL,PERIOD_M1,i);
Price[i][1]=iLow(NULL,PERIOD_M1,i);
Price[i][2]=iOpen(NULL,PERIOD_M1,i);
Price[i][3]=iClose(NULL,PERIOD_M1,i);
}
Этот цикл заполнит ценами последних 10 баров М1 таймфрейма.

Задача по делу, для тех кто учится программировать вспомогательные средства для торговли, а не для решения задач из учебника математики, которые скорее всего никогда не пригодятся.
Напишите скрипт, который запишет в двухмерный массив цены открытия, цены закрытия, лоты, прибыль в валюте депозита с учётом свопов и комиссий, всех исторических ордеров счёта.
После этого, напечатает в лог всё что в массиве. Построчно. Каждый ордер в отдельной строке.
В конце напечатает среднюю прибыль в валюте депозита по всем ордерам.
 

BorisSedov

Активный участник
А откуда у Вас такая информация о количестве данных;)?
-https://ru.wikipedia.org/wiki/Функция_распределения_простых_чисел
В данной статье есть таблица, в которой можно найти долю простых чисел в нужном диапазоне.
 
Последнее редактирование модератором:

Ugar

Гуру форума
-https://ru.wikipedia.org/wiki/Функция_распределения_простых_чисел
В данной статье есть таблица, в которой можно найти долю простых чисел в нужном диапазоне.
Кстати. Я так и не увидел практического применения здоровенных простых чисел. Есть пример? Может есть торговая система на них, которая вычисляет точки входя и выхода для прибыльных сделок? Хоть что то полезное для торговли? А то у меня создаётся впечатление что единственная польза, это хвастаться знанием даже не программирования, а математики.
 
Последнее редактирование модератором:
Верх