А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:
// переменная, которая будет хранить количество ордеров, // принадлежащих эксперту:int _ExpertOrdersTotal=0;
Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.
По массивам: вот я объявил на глобальном уровне 4 массива:
Затем в функции открытия позиций я их обнулил:
А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:
Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.
Попробуйте писать с нуля, выводя все промежуточные данные с помощью функции Alert(. Например
int ord=OrdersTotal();
if ! ord )
{
Alert("Ордера отсутствуют. Выход");
return;
} elseAlert("Всего ордеров = ", ord);
// Посмотрев, что получилось, добавляете:int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
OrderSelect(...
}
А уж если берете чей-то пример, берите его полностью и изучайте. Кто же знает для чего автор примера массивы приплел
По массивам: вот я объявил на глобальном уровне 4 массива:
Используйте массив структур. К нему будет намного проще обращаться. Привожу вариант со статическим массивом. Он проще в понимании. Хотя сам использую динамические массивы. Но с ними код получится немного больше.
Нет, не обнулили. Ведь объявлены динамические массивы, которые по умолчанию имеют нулевой размер. Поэтому в данном случае эти четыре строки кода ничего не делают.
А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:
Далее - организуется цикл перебора ордеров, в котором каждый "свой" ордер сохраняется в массив:
g_nOrderCnt = 0;
for (int i = OrdersTotal() - 1; i >= 0; --i)
{
if (!OrderSelect(i, SELECT_BY_POS))
continue;
if (OrderSymbol() != Symbol()) // Если нужны ордера только по текущему символу, к графику которого прикреплен советникcontinue;
if (OrderMagicNumber != i_nMagicNumber) // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советникаcontinue;
if (g_nOrderCnt < MAX_ORDERS_CNT)
continue;
g_arrstOrderInfo[g_nOrdersCnt].nTicket = OrderTicket();
g_arrstOrderInfo[g_nOrdersCnt].nType = OrderType();
g_arrstOrderInfo[g_nOrdersCnt].fOpenPrice = OrderOpenPrice();
g_arrstOrderInfo[g_nOrdersCnt].fSL = OrderStopLoss();
g_arrstOrderInfo[g_nOrdersCnt].fTP = OrderTakeProfit();
++g_nOrdersCnt;
}
Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.
С массивами работать удобнее и быстрее, т. к. в общем случае не все ордера, присутствующие на счете, нужно обрабатывать именно этим советником. В итоге получаем экономию сил и средств.
К тому же я привел, опять же, общий случай. А универсализм, конечно, далеко не всегда нужен. Обычно такие массивы составляются, исходя из требований стратегии. Например, можно сразу разделить ордера по типам: Buy, Sell, BuyStop, SellStop, BuyLimit, SellLimit. Тогда нам потребуется четыре таких массива. Но потом, при принятии торговых решений, не нужно будет снова проходить весь список открытых ордеров. Достаточно узнать количество ордеров определенного типа и обратиться к нужному массиву.
Еще один немаловажный момент, который стоит учитывать: изменение состава ордеров в процессе обработки одного тика. Вполне может случиться так, что на входе в OnTick был получен один список ордеров, а где-то в середине - другой. Получим трудно вылавливаемую ошибку работы программы. А массив ордеров, коорый был составлен при входе в OnTick уже не изменится (если, конечно, в ходе выполнения программы Вы его сами не измените).
string s=FileReadString(F1); // Чтение очередной строки текстового файла StringSplit(s, "," , a); // Выделение разделенных запятой элементов строки в массив datetime T1=StrToTime(a[4]); // Дальше у меня идут преобразования ... int ord=StrToInteger(a[8]); double Цена=StrToDouble(a[12]);
Спасиб, то что хотел
Далее, получается сделано штук 5 продуктов
кидаем в алерт показания (любые)
например уровень "200"
и при срабатывании алерта что - то открывает позу, что - то самоудаляется что - то делает другие действия. Я хочу реализовать механизм подачи сигнала таким способом
З.Ы
дописал то что хотел могу скинуть на рассмотрение. Сливает отлично. Но тут такое выкладывать запрещено.
Например, можно сразу разделить ордера по типам: Buy, Sell, BuyStop, SellStop, BuyLimit, SellLimit. Тогда нам потребуется четыре таких массива. Но потом, при принятии торговых решений, не нужно будет снова проходить весь список открытых ордеров. Достаточно узнать количество ордеров определенного типа и обратиться к нужному массиву.
Вот именно это мне и нужно, вернее только для Buy и Sell . Для моей простой стратегии главное, чтобы открытые позиции не мешали друг другу видеть условия для закрытия. Может, можно все-таки обойтись без массивов? Ну не врубаюсь я в них: как создать, как обратиться - тёмный лес. Может Вам станет понятней моя ситуация по скрину:
Вроде бы в коде всё просто и работает чётко, только вот это единственный случай непонятки.
Вот именно это мне и нужно, вернее только для Buy и Sell . Для моей простой стратегии главное, чтобы открытые позиции не мешали друг другу видеть условия для закрытия. Может, можно все-таки обойтись без массивов? Ну не врубаюсь я в них: как создать, как обратиться - тёмный лес. Может Вам станет понятней моя ситуация по скрину:
Вроде бы в коде всё просто и работает чётко, только вот это единственный случай непонятки.
Разумеется, в простейшей (да и средней сложности) без массивов удобнее. Вот когда дойдете до использования сотен ордеров - тогда ... А различать ордера просто. Например по OrderType() - один на покупку 0, другой на продажу 1. А стратегия у Вас хорошая - можно удесятить за 1 день или слить за пол-дня. Единственное, что надо - это как эти стрелочки ловить. Да и больно часто они. Есть смысл сначала научиться выдавать сигналы: Купи и Продай
LRA: Разумеется, в простейшей (да и средней сложности) без массивов удобнее. Вот когда дойдете до использования сотен ордеров - тогда ...
А не может быть причиной возникновения моей ситуации то, что журнал пишет: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 и повторяет сплошь до
2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Всего ордеров = 3 ? На скрине видно, что этот период захватывает два условия закрытия СЕЛЛ.
А сигналы на открытие позиции выдаются по комбинации нескольких индикаторов, а закрываются по одному. И срабатывают не так уж часто: на пятиминутке бывает, что несколько дней молчит. Например с 1 февраля с.г. всего 14 позиций сработало.
А не может быть причиной возникновения моей ситуации то, что журнал пишет: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 и повторяет сплошь до
2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Всего ордеров = 3 ? На скрине видно, что этот период захватывает два условия закрытия СЕЛЛ
что у Вас за ситуация возникла? Вы хотите сказать, что терминал производит запись в журнал, что и вызывает ошибку? ... а что значит 138 ? знаете где посмотреть? Как Вы этого добились - это очень редкая ошибка. то что на скрине видно - это пол-дела. Вот как это советнику втолковать? надо написать какое-то математическое условие - советник же вместо рассматривания скрина оперирует числами
Вы хотите сказать, что терминал производит запись в журнал, что и вызывает ошибку? ... а что значит 138 ? знаете где посмотреть?
Нет, я хочу сказать, что в тестере на данном промежутке истории происходит сбой, который и не дает правильно сработать сигналам. Потому что не могут реквоты продолжаться сутками.
Нет, я хочу сказать, что в тестере на данном промежутке истории происходит сбой, который и не дает правильно сработать сигналам. Потому что не могут реквоты продолжаться сутками.
Реквоты в тестере? первый раз слышу... Тестер - это же идеал - в нем даже проскальзывание отсутствует
...что-то индикатор надрывается - тренд вверх. Прикуплю ... получилось... правда маловато будет хотел ТП вверх подвинуть - уже сработало...
Так поставьте в советнике что если так то выход и на следующем тике продолжим. И попробуйте на демо
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Напишите хотя бы один блок и покажите. Дальше тут подскажут в таком случае.
По массивам: вот я объявил на глобальном уровне 4 массива:
Затем в функции открытия позиций я их обнулил:
А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:
Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.
По массивам: вот я объявил на глобальном уровне 4 массива:
Затем в функции открытия позиций я их обнулил:
А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:
Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.
Попробуйте писать с нуля, выводя все промежуточные данные с помощью функции Alert(. Например
А уж если берете чей-то пример, берите его полностью и изучайте. Кто же знает для чего автор примера массивы приплел
По массивам: вот я объявил на глобальном уровне 4 массива:
Используйте массив структур. К нему будет намного проще обращаться. Привожу вариант со статическим массивом. Он проще в понимании. Хотя сам использую динамические массивы. Но с ними код получится немного больше.
Затем в функции открытия позиций я их обнулил:
Нет, не обнулили. Ведь объявлены динамические массивы, которые по умолчанию имеют нулевой размер. Поэтому в данном случае эти четыре строки кода ничего не делают.
А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:
Далее - организуется цикл перебора ордеров, в котором каждый "свой" ордер сохраняется в массив:
Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.
С массивами работать удобнее и быстрее, т. к. в общем случае не все ордера, присутствующие на счете, нужно обрабатывать именно этим советником. В итоге получаем экономию сил и средств.
К тому же я привел, опять же, общий случай. А универсализм, конечно, далеко не всегда нужен. Обычно такие массивы составляются, исходя из требований стратегии. Например, можно сразу разделить ордера по типам: Buy, Sell, BuyStop, SellStop, BuyLimit, SellLimit. Тогда нам потребуется четыре таких массива. Но потом, при принятии торговых решений, не нужно будет снова проходить весь список открытых ордеров. Достаточно узнать количество ордеров определенного типа и обратиться к нужному массиву.
Еще один немаловажный момент, который стоит учитывать: изменение состава ордеров в процессе обработки одного тика. Вполне может случиться так, что на входе в OnTick был получен один список ордеров, а где-то в середине - другой. Получим трудно вылавливаемую ошибку работы программы. А массив ордеров, коорый был составлен при входе в OnTick уже не изменится (если, конечно, в ходе выполнения программы Вы его сами не измените).
string s=FileReadString(F1); // Чтение очередной строки текстового файла
StringSplit(s, "," , a); // Выделение разделенных запятой элементов строки в массив
datetime T1=StrToTime(a[4]); // Дальше у меня идут преобразования ...
int ord=StrToInteger(a[8]);
double Цена=StrToDouble(a[12]);
Спасиб, то что хотел
Далее, получается сделано штук 5 продуктов
кидаем в алерт показания (любые)
например уровень "200"
и при срабатывании алерта что - то открывает позу, что - то самоудаляется что - то делает другие действия. Я хочу реализовать механизм подачи сигнала таким способом
З.Ы
дописал то что хотел могу скинуть на рассмотрение. Сливает отлично. Но тут такое выкладывать запрещено.
Например, можно сразу разделить ордера по типам: Buy, Sell, BuyStop, SellStop, BuyLimit, SellLimit. Тогда нам потребуется четыре таких массива. Но потом, при принятии торговых решений, не нужно будет снова проходить весь список открытых ордеров. Достаточно узнать количество ордеров определенного типа и обратиться к нужному массиву.
Вот именно это мне и нужно, вернее только для Buy и Sell . Для моей простой стратегии главное, чтобы открытые позиции не мешали друг другу видеть условия для закрытия. Может, можно все-таки обойтись без массивов? Ну не врубаюсь я в них: как создать, как обратиться - тёмный лес. Может Вам станет понятней моя ситуация по скрину:
Вроде бы в коде всё просто и работает чётко, только вот это единственный случай непонятки.
Вот именно это мне и нужно, вернее только для Buy и Sell . Для моей простой стратегии главное, чтобы открытые позиции не мешали друг другу видеть условия для закрытия. Может, можно все-таки обойтись без массивов? Ну не врубаюсь я в них: как создать, как обратиться - тёмный лес. Может Вам станет понятней моя ситуация по скрину:
Вроде бы в коде всё просто и работает чётко, только вот это единственный случай непонятки.
Разумеется, в простейшей (да и средней сложности) без массивов удобнее. Вот когда дойдете до использования сотен ордеров - тогда ...
А не может быть причиной возникновения моей ситуации то, что журнал пишет: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 и повторяет сплошь до
2018.01.26 16:38:12 2018_WPR14_AMarkets EURUSD,M5: Alert: Всего ордеров = 3 ? На скрине видно, что этот период захватывает два условия закрытия СЕЛЛ.
А сигналы на открытие позиции выдаются по комбинации нескольких индикаторов, а закрываются по одному. И срабатывают не так уж часто: на пятиминутке бывает, что несколько дней молчит. Например с 1 февраля с.г. всего 14 позиций сработало.
А не может быть причиной возникновения моей ситуации то, что журнал пишет: 2018.01.25 20:22:12 2018_WPR14_AMarkets EURUSD,M5: OrderClose error 138 и повторяет сплошь до
что у Вас за ситуация возникла? Вы хотите сказать, что терминал производит запись в журнал, что и вызывает ошибку? ... а что значит 138 ? знаете где посмотреть? Как Вы этого добились - это очень редкая ошибка. то что на скрине видно - это пол-дела. Вот как это советнику втолковать? надо написать какое-то математическое условие - советник же вместо рассматривания скрина оперирует числами
Вы хотите сказать, что терминал производит запись в журнал, что и вызывает ошибку? ... а что значит 138 ? знаете где посмотреть?
Нет, я хочу сказать, что в тестере на данном промежутке истории происходит сбой, который и не дает правильно сработать сигналам. Потому что не могут реквоты продолжаться сутками.
Нет, я хочу сказать, что в тестере на данном промежутке истории происходит сбой, который и не дает правильно сработать сигналам. Потому что не могут реквоты продолжаться сутками.
Реквоты в тестере? первый раз слышу... Тестер - это же идеал - в нем даже проскальзывание отсутствует
...что-то индикатор надрывается - тренд вверх. Прикуплю ... получилось... правда маловато будет хотел ТП вверх подвинуть - уже сработало...
Так поставьте в советнике что если так то выход и на следующем тике продолжим. И попробуйте на демо