Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 84
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Тогда ответь пожалуйста на мой предыдущий вопрос
1) Запись массива структур
2) передача по другим функциям
3) извлечение и сравнение между собой элементов массива структур
4) принт массива структур
мне важна сама запись в виде кода чтоб я понимал как это должно выглядеть
Всё зависит от поставленной задачи. Так как задачи могут быть сколь угодно разными, то что именно показывать?
Ну напишу, потрачу время, а что написал - оно квадратное. А отверстие - треугольное. И куда квадратное запихнуть тогда?
Всё зависит от поставленной задачи. Так как задачи могут быть сколь угодно разными, то что именно показывать?
Ну напишу, потрачу время, а что написал - оно квадратное. А отверстие - треугольное. И куда квадратное запихнуть тогда?
возьмем пост 699 и около него
как это передавать в другие функции и сравнивать элемент структуры с предыдущим элементом
и чтоб я мог взять какойто ордер по порядку и вывести все значения в принт
разница в том что там не число и действуют другие правила записи.
возьмем пост 699 и около него
как это передавать в другие функции и сравнивать элемент структуры с предыдущим элементом
и чтоб я мог взять какойто ордер по порядку и вывести все значения в принт
разница в том что там не число и действуют другие правила записи.
Вам нужно в цикле пройтись по всем нужным вам ордерам.
После определения очередного нужного ордера, увеличиваете массив на 1, и записываете в новую его ячейку все данные по этому ордеру. В саму же ячейку массива записываете время открытия ордера (если ищете закрытые, то время закрытия). Остальные данные вписываете в поля структуры
После окончания цикла сортируете массив по возрастанию значений.
Вот сделайте сначала это. Далее остальное можно обсуждать.
В пределах одного цикла такая задача не решается.
Спасибо.
//| test.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
struct myorder
{
int Ticket;
double orderopenprice;
int ordertype;
double profit;
double stoploss;
double lot;
};
myorder orders[][5];
int i;
int Magic=444;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
CalcOrders();
}
//+------------------------------------------------------------------+
void CalcOrders()
{
int count1=-1;
ArrayResize(orders,AccountInfoInteger(ACCOUNT_LIMIT_ORDERS),10);
for(i=OrdersTotal()-1; i>=0; i--)
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
&& (OrderMagicNumber()==Magic) && (OrderType()<2))
{
count1++;
orders[count1][0].Ticket=OrderTicket();
orders[count1][1].lot=OrderLots();
orders[count1][2].orderopenprice=OrderOpenPrice();
orders[count1][3].ordertype=OrderType();
orders[count1][4].profit=OrderProfit();
orders[count1][5].stoploss=OrderStopLoss();
}
}
ArraySort(orders,WHOLE_ARRAY,0,MODE_ASCEND);
}
//+------------------------------------------------------------------+
Я разместил ваш код в ваше сообщение.
А теперь если начать разбираться, то
Я разместил ваш код в ваше сообщение.
А теперь если начать разбираться, то
1) посчитал что Х ордер У номер параметра более соответствует данной задаче
2) у меня он равен 50 или 100 в зависимости от типа счета, и никак иначе
3) так если count1++; будет при каждом проходе увеличиваться а массив приобретать его значение
1) посчитал что Х ордер У номер параметра более соответствует данной задаче
2) у меня он равен 50 или 100 в зависимости от типа счета, и никак иначе
3) так если count1++; будет при каждом проходе увеличиваться а массив приобретать его значение
1. А для чего тогда структура?
2. Вам этот параметр для массива рыночных позиций "что шёл, что ехал"... Массив перед циклом должен иметь нулевой размер.
3. Всё правильно. Сначала массив имеет нулевой размер. С каждым новым найденным ордером массив становится равным по размеру количеству нужных вам ордеров.
1. А для чего тогда структура?
2. Вам этот параметр для массива рыночных позиций "что шёл, что ехал"... Массив перед циклом должен иметь нулевой размер.
3. Всё правильно. Сначала массив имеет нулевой размер. С каждым новым найденным ордером массив становится равным по размеру количеству нужных вам ордеров.
1) компилятор ругается если второе измерение не поставить, сразу выскочит "укажите тип класса, неизвестные параметры"
2) тогда бот сдохнет сразу же при запуске с "critical error array out of range"
3) сразу задаем int count1=-1; Далее проходим по циклу. Что тут не так?
1) компилятор ругается если второе измерение не поставить
2) тогда бот сдохнет сразу же при запуске с "critical error array out of range"
3) сразу задаем int count1=-1; Что тут не так?
1. Он как раз вам говорит, что одно из измерений нужно убрать. Вы объявляете одномерный массив, а записывать хотите в двумерный. Что в итоге? Конечно ошибку получите от компилятора.
2. Чтобы не сдох, нужно правильно заполнить массив в цикле, а не задать ему не0пойми-какой-размер, а потом туда пихать не-пойми-сколько-чего.
3. Это вы переменную задаёте равной -1. А массив должен иметь перед циклом нулевой размер. Что тут не понятно?
Давайте поиграем в ассоциации:
- Представьте, что у вас есть сдутый шарик (пустой массив), имеющий нулевой внутренний объём (нулевой размер массива). Внутрь этого шарика (в массив) вы хотите складывать монетки (нужные вам ордера). Вот каждая монетка, как только вы решите, что она подходит для хранения в шарике (каждый найденный нужный ордер), будет увеличивать внутренний объём шарика (только монетка сама растянет шарик, а вам нужно этим самому озадачиться - увеличить размер массива на 1 и впихнуть в него один ордер).
Такая вот вам ассоциация.В конце, когда вы найдёте все монетки и впихнёте их в шарик, он будет уже не сдутым - его внутренний объём растянули монетки (в конце цикла поиска нужных ордеров размер массива будет равен количеству найденных нужных ордеров, так как вы с каждым найденным нужным ордером увеличивали размер массива на 1).
А теперь представьте себе, что вы изначально складываете монетки не в шарик, который резиновый и может менять свой размер, а в маленькую копилку, имеющую ограниченный объём (вы изначально задали размер массива, и больше его не увеличивали). Что будет? Не все монетки в копилку поместятся. А в шарик - все.