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

 
bablusut:

Спасибо за ответ ...  итак, для перебора ордеров в истории торгов используем функцию OrdersHistoryTotal, которая после отброса всего нам не нужного представляется как: 

for(int i=OrdersHistoryTotal()-1; i>=0; i--) // - здесь вопрос, что значит "accTotal" в шаблоне функции, который мы отбросили? и почему Вы взяли "i--" а не "i++", как в шаблоне?
 - вторая функция OrderComment возвращает комментарий выбранного ордера, если он выбран предыдущей функцией OrdersHistoryTotal, принимает вид: 

 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) //- где "i", это "i>=0" из предыдущей функции, а "SELECT_BY_TICKET" заменили на "SELECT_BY_POS" и добавили "MODE_HISTORY" - почему так? 

 - третья строчка определение, проверка нужного ордера в принципе не нужна, т. к. в данной истории только рыночные ордера закрытые по ТП. и СЛ., (может присутствовать закрытый отложенный ордер, но это будет редко),  все остальные параметры ордера нам не важны. Важно другое - количество закрытых ордеров в истории будет постоянно увеличиваться, нельзя ли так сделать что бы при пересчёте брались не все закрытые ордера, а определённое количество последних, например 5 - 10? 

- последние четыре строчки в общем понятны, вопрос лишь в функции PlaySound,  код которой необходимо вставить после каждой строчки "Print("..." в таком виде: 



OrderComment возвращает комментарий выбранного ордера, если он выбран предыдущей функцией OrdersHistoryTotal -  эта функция ничего не выбирает - она возвращает общее число закрытых и удалённых ордеров (Количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. Размер списка истории зависит от текущих настроек вкладки "История счета" терминала. Цитата из учебника.)


accTotal в примере из учебника:

int i,accTotal=OrdersHistoryTotal(); - Это переменная int - принимающая значение OrdersHistoryTotal
for(i=0;i<accTotal;i++)  // Как мотать цикл по списку истории не принципиально с первого до последнего ордера или наоборот, всё равно идёт последовательный перебор всего списка.

Но в предыдущем случае на 1 переменную меньше, но запрос OrdersHistoryTotal обрабатывается каждый цикл.

SELECT_BY_POS - в параметре index передается порядковый номер ордера в списке, сам список это второй оператор - MODE_HISTORY список закрытых, MODE_TRADES  - открытые или отложенные.
SELECT_BY_TICKET - в параметре index передается номер тикета. Который перед выбором ордера надо где то взять.


- последние четыре строчки в общем понятны, вопрос лишь в функции PlaySound,  код которой необходимо вставить после каждой строчки "Print("..." в таком виде: 

bool  PlaySound(

string  payment      // имя файла

);

 ... или тоже как то преобразуется? 

Объяви bool  PlaySound( в заголовке программы - получишь возможность в сет файле включать и отключать звук extern bool Play = TRUE;

далее, что будет Print печатать? И при каком условии?

Смысл этого действа в чём заключается? Играть звук при закрытии ордера и писать комент ( по ТП или СЛ) ?






 
bablusut:
Спасибо Vitalie Postolache за оказанную помощь, спасибо за совет, а информацию по указанным учебникам мне пожалуй поздновато штудировать на шестом десятке, я уж пожалуй не потяну столько, надо было раньше, да времени не было. Я Вам тут изрядно надоел, извиняйте если что, больше не буду - ухожу раз так.
Лучше отдельную тему создайте, что так и так, хочу что бы вот так работало. Мне например интересно будет разные варианты увидеть и тоже разобраться какие из них более правильные с точки зрения логики.
 

Кстати у меня тоже вопрос созрел.

Нужно написать проверку по Спреду.

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

Но получилось так - в момент снижения спреда - советник открывает ордер и спред увеличивается.

Теперь никак не могу понять как же его учесть правильно: если каждый тик в массив писать спред насколько массив большой получится? Опять же на какой интервал времени его хватит?

Можно конечно не писать похожие значения или брать только меньшее и большее, но тогда надо обнулять его как то.

А самое главное, я понять не могу, мне надо учитывать минимальный и максимальный спрэд или признак его скачков.
 
struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };
Подскажите, какое значение Spread будет сохранено? Состояние на начало открытия бара?
 
A1exPit:
struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };
Подскажите, какое значение Spread будет сохранено? Состояние на начало открытия бара?

int      spread;       // спред 

т.е никакого 

 
A1exPit:
struct MqlRates
  {
   datetime time;         // время начала периода
   double   open;         // цена открытия
   double   high;         // наивысшая цена за период
   double   low;          // наименьшая цена за период
   double   close;        // цена закрытия
   long     tick_volume;  // тиковый объем
   int      spread;       // спред
   long     real_volume;  // биржевой объем
  };
Подскажите, какое значение Spread будет сохранено? Состояние на начало открытия бара?
Если запросить текущий бар - то текущий спред, если из истории - то на момент закрытия.
 
Vitalie Postolache:
Если запросить текущий бар - то текущий спред, если из истории - то на момент закрытия.
Спасибо.
 

Я правильно понимаю, что для записи данных в массив надо присваивать каждой ячейке своё значение  array1[i] = x; с указанием на конкретный номер ячейки

или можно последовательно массив заполнять от от i=0 и далее?

 
A1exPit:

Я правильно понимаю, что для записи данных в массив надо присваивать каждой ячейке своё значение  array1[i] = x; с указанием на конкретный номер ячейки

или можно последовательно массив заполнять от от i=0 и далее?

в чем разница? по моему это просто два разных пути
 
Renat Akhtyamov:
в чем разница? по моему это просто два разных пути
Я имел в виду что при передаче данных в массив он будет сам последовательно заполняться т.е. array1[] = x; в какую ячейку запишется значение x если номер ячейки прямо не указан?