Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 69
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Например здесь https://docs.mql4.com/ru/basis/preprosessor/compilation
в текущем примере я хочу иметь возможность положить туда бесконечное количество ордеров с любыми лотами чтобы не было выхода за его пределы
конечно границы мы знаем и все в курсе, но хочу именно так
исхожу из того что если указать в скобках элемент то он будет последним
вот у меня получилась вот такая хрень. Ожидалось вид орде по по порядку... лот? чтоб в ордерсенд вместо лота я добавил результат (лот такого-то ордера*коэффициент)
и вопрос извлечения данных оттуда
хочу получить так как я себе представляю
MyArray[0][0.01]
MyArray[1][0.01]
MyArray[2][0.02]
и т д...
Ну так а в чём собственно вопрос?
Вы записали массив с лотами, потом его отсортировать по размеру лота, это и будет сортировка по номерам открытия, потому как в вашем случае каждая следующая позиция открывается с бОльшим лотом
double SPosMass[];
void OnTick()
{
// Заполняем массивы
int b=-1,s=-1; // Объявим переменные с минусом
for(int i=0; i<OrdersTotal(); i++) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if(OrderSymbol()==Symbol() && (OrderMagicNumber()==Magic || Magic<0)) {
if(OrderType()==OP_BUY) {
b++;
ArrayResize(BPosMass,b+1);
BPosMass[b]= OrderLot();
}
if(OrderType()==OP_SELL) {
s++;
ArrayResize(SPosMass,s+1);
SPosMass[s]= OrderLot();
}
}}} // конец записи массив
// Читаем отсортированный массив с лотами
// Buy
if(b>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
ArraySort(BPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
// Работа с полученными данными
Comment("Самый старый Buy лот: ", BPosMass[0],
"\nПоследний Buy лот: ", BPosMass[b],
"\nПредпоследний Buy лот: ", BPosMass[b-1]
);
} // end Buy
// Sell
if(s>0) { // Если он не пустой и больше двух элементов - [0], иначе будет ошибка: "Выход за пределы массива"
ArraySort(SPosMass, WHOLE_ARRAY, 0, MODE_ASCEND); // Отсортируем по размеру лота
// Работа с полученными данными
Comment("Самый старый Sell лот: ", SPosMass[0],
"\nПоследний Sell лот: ", SPosMass[s],
"\nПредпоследний Sell лот: ", SPosMass[s-1]
);
} // end Sell
// Конец функции OnTick()
}
Применять потом так: считать сколько всего позиций, и если меньше трёх, то к массиву не обращаться, если больше, тогда читать массив и брать с него данные.
Выход за пределы массива происходит не в момент записи, а в момент чтения.
Выход за пределы массива происходит не в момент записи, а в момент чтения.
Неа. В момент обращения к несуществующему индексу массива.
Ну так а Я что написал?
2017.01.13 12:51:14.372 2017.01.05 16:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.13 12:51:14.372 2017.01.05 16:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01
CountOrders постоянное а лот меняется. Так быть не должно, а по другому не выходит
в идеале запись MyArray[CountOrders][OrderLots()]
чтобы выдало результат MyArray[0][0.01] MyArray[1][0.01]
но в мкл такое не прокатывает
ну и потом это как то извлекать из функции в поток2017.01.13 12:51:14.372 2017.01.05 16:30:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.02
2017.01.13 12:51:14.372 2017.01.05 16:25:00 martin GBPUSD,M5: MyArray[CountOrders][0]0.01
CountOrders постоянное а лот меняется. Так быть не должно, а по другому не выходит
в идеале запись MyArray[CountOrders][OrderLots()]
чтобы выдало результат MyArray[0][0.01] MyArray[1][0.01]
но в мкл такое не прокатывает
Структуры вам помогут. Создаёте структуру с нужными полями, объявляете массив таких структур, заполняете его данными ордеров в цикле по времени открытия, а далее уже ищете в нём всё, что душе угодно. Проверяете поля структуры по индексу и сравниваете с нужным вам значением. Индекс как раз будет указывать на порядковый номер ордера по его времени открытия, а в полях структуры будут все нужные вам данные по этому конкретному ордеру.
У нас получилась вооот такая хреновина
{
int Ticket;
double orderopenprice;
int ordertype;
double profit;
double stoploss;
double lot;
};
myorder orders[];
int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
&& (OrderMagicNumber()==Magic) && (OrderType()<2))
orders[i].Ticket=OrderTicket();
orders[i].lot=OrderLots();
orders[i].orderopenprice=OrderOpenPrice();
orders[i].ordertype=OrderType();
orders[i].profit=OrderProfit();
orders[i].stoploss=OrderStopLoss();
}
}
я хочу вытащить к примеру лот 5 ордера и сравнить его со лотом третьего
просуммировать цену открытия и разделить на количество позиций
нужна сама запись в виде команд для подобного
У нас получилась вооот такая хреновина
{
int Ticket;
double orderopenprice;
int ordertype;
double profit;
double stoploss;
double lot;
};
myorder orders[];
int i;
void CalcOrders()
{
for(i=OrdersTotal()-1; i>=0; i--)
{
if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
&& (OrderMagicNumber()==Magic) && (OrderType()<2))
orders[i].Ticket=OrderTicket();
orders[i].lot=OrderLots();
orders[i].orderopenprice=OrderOpenPrice();
orders[i].ordertype=OrderType();
orders[i].profit=OrderProfit();
orders[i].stoploss=OrderStopLoss();
}
}
я хочу вытащить к примеру лот 5 ордера и сравнить его со лотом третьего
просуммировать цену открытия и разделить на количество позиций
нужна сама запись в виде команд для подобного
Так как индекс цикла i ссылается на любые ордера, а не только на нужные вам, то нужно в функции объявить переменную (например n=0;), которая будет отвечать за размер массива. Внутри цикла после прохождения проверок увеличить значение этой переменной, увеличить размер массива на величину этой переменной, и уже по индексу n-1 заполнять поля структуры: orders[n-1].xxx=XXX;
Скажите, почему при переборе ордеров функцией OrdersTotal() пишут -1.
Пример: for (i=OrdersTotal()-1 ;i>=0; i--)
почему не просто OrdersTotal() ?
Счет ордеров в этой функции начинается с 0 или с 1? То есть если есть один ордер, OrdersTotal() равен 0 или 1?
Так как индекс цикла i ссылается на любые ордера, а не только на нужные вам, то нужно в функции объявить переменную (например n=0;), которая будет отвечать за размер массива. Внутри цикла после прохождения проверок увеличить значение этой переменной, увеличить размер массива на величину этой переменной, и уже по индексу n-1 заполнять поля структуры: orders[n-1].xxx=XXX;