Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 121

 
Ihor Herasko:

Напишите хотя бы один блок и покажите. Дальше тут подскажут в таком случае.

По массивам: вот я объявил на глобальном уровне 4 массива:

// массивы, в которых будут храниться характеристики ордеров:
int _OrderTicket[],_OrderType[];
double _OrderOpenPrice[];
datetime _OrderOpenTime[];

Затем в функции открытия позиций я их обнулил:

   // обнуляем массивы
   ArrayInitialize(_OrderTicket,0);
   ArrayInitialize(_OrderType,0);
   ArrayInitialize(_OrderOpenPrice,0);
   ArrayInitialize(_OrderOpenTime,0);

А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:

// переменная, которая будет хранить количество ордеров, 
// принадлежащих эксперту:
int _ExpertOrdersTotal=0;

Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.
  

 
novichok2018:

По массивам: вот я объявил на глобальном уровне 4 массива:

Затем в функции открытия позиций я их обнулил:

А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:

Хотя не совсем понятно, зачем все эти массивы, когда значения тикета, типа позиции, цены открытия и времени открытия я могу получить соответствующей функцией.

Попробуйте писать с нуля, выводя все промежуточные данные с помощью функции Alert(. Например

int ord=OrdersTotal();
if ! ord )
{
   Alert("Ордера отсутствуют. Выход");
   return;
} else   Alert("Всего ордеров = ", ord);

// Посмотрев, что получилось, добавляете:
int n;
int Ords[10];
for(n=0; n<ord && n<10; n++)
{
   OrderSelect(...
}

А уж если берете чей-то пример, берите его полностью и изучайте. Кто же знает для чего автор примера массивы приплел

 
novichok2018:

По массивам: вот я объявил на глобальном уровне 4 массива:

Используйте массив структур. К нему будет намного проще обращаться. Привожу вариант со статическим массивом. Он проще в понимании. Хотя сам использую динамические массивы. Но с ними код получится немного больше.

#define MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

OrderInfo  arrstOrderInfo[MAX_ORDERS_CNT];

Затем в функции открытия позиций я их обнулил:

Нет, не обнулили. Ведь объявлены динамические массивы, которые по умолчанию имеют нулевой размер. Поэтому в данном случае эти четыре строки кода ничего не делают.

А как их теперь заполнить? В примере, по которому я пытаюсь это делать, применена дополнительная переменная, но как ею пользоваться я не понимаю:

Далее - организуется цикл перебора ордеров, в котором каждый "свой" ордер сохраняется в массив:

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 уже не изменится (если, конечно, в ходе выполнения программы Вы его сами не измените).

 
STARIJ:

   string s=FileReadString(F1);       // Чтение очередной строки текстового файла
   StringSplit(s,     ","    ,    a);       // Выделение разделенных запятой элементов строки в массив
   datetime T1=StrToTime(a[4]);   // Дальше у меня идут преобразования ...
   int ord=StrToInteger(a[8]);
   double Цена=StrToDouble(a[12]);
 

Спасиб, то что хотел



Далее, получается сделано штук 5 продуктов

кидаем в алерт показания (любые)

например уровень "200"

и при срабатывании алерта что - то открывает позу, что - то самоудаляется что - то делает другие действия. Я хочу реализовать механизм подачи сигнала таким способом


З.Ы

дописал то что хотел могу скинуть на рассмотрение. Сливает отлично. Но тут такое выкладывать запрещено.

 
Ihor Herasko:

Например, можно сразу разделить ордера по типам: Buy, Sell, BuyStop, SellStop, BuyLimit, SellLimit. Тогда нам потребуется четыре таких массива. Но потом, при принятии торговых решений, не нужно будет снова проходить весь список открытых ордеров. Достаточно узнать количество ордеров определенного типа и обратиться к нужному массиву.

Вот именно это мне и нужно, вернее только для Buy и Sell . Для моей простой стратегии главное, чтобы открытые позиции не мешали друг другу видеть условия для закрытия. Может, можно все-таки обойтись без массивов? Ну не врубаюсь я в них: как создать, как обратиться - тёмный лес. Может Вам станет понятней моя ситуация по скрину:

Вроде бы в коде всё просто и работает чётко, только вот это единственный случай непонятки.

 
novichok2018:

Вот именно это мне и нужно, вернее только для 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 позиций сработало.


 
novichok2018:

А не может быть причиной возникновения моей ситуации то, что журнал пишет: 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 ? знаете где посмотреть? Как Вы этого добились - это очень редкая ошибка. то что на скрине видно - это пол-дела. Вот как это советнику втолковать? надо написать какое-то математическое условие - советник же вместо рассматривания скрина оперирует числами

 
LRA:

Вы хотите сказать, что терминал производит запись в журнал, что и вызывает ошибку? ... а что значит 138 ? знаете где посмотреть?

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

 
novichok2018:

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

Реквоты в тестере? первый раз слышу... Тестер - это же идеал - в нем даже проскальзывание отсутствует

...что-то индикатор надрывается - тренд вверх. Прикуплю ... получилось... правда маловато будет  хотел ТП вверх подвинуть - уже сработало...

Так поставьте в советнике что если так то выход и на следующем тике продолжим. И попробуйте на демо

Причина обращения: