Пытаюсь перейти с MQL4 на MQL5 и не могу найти последнию закрытую позицию. В MQL5, когда мы посылаем ордер - это ордер, когда он открылся - он стал позицией и, по логике, после того как он закрылся, он должен попасть в историю позиций, а удаленные отложенные ордера должны быть в истории ордеров, но вижу только историю ордероа с сделок - поэтому непонятно где искать закрытую позицию.
Пробовал вот так:
ulong GetLastCloseTicket()
{
datetime to=TimeCurrent();
datetime from=to-3*PeriodSeconds(PERIOD_D1);
HistorySelect(from,to);
int Htotal=HistoryOrdersTotal();
ulong lastOrders[2];
ulong ticket;
ArrayInitialize(lastOrders, 0);
for (uint j = 0; j < Htotal; j++)
{
if(ticket= HistoryOrderGetTicket(j)) {
if (HistoryOrderGetInteger(ticket,ORDER_TYPE)== ORDER_TYPE_BUY || HistoryOrderGetInteger(ticket,ORDER_TYPE)== ORDER_TYPE_SELL) {
Print("ticket = " +ticket+";");
Print("ORDER_TYPE = " +ORDER_TYPE+";");
// хранить самый последний (недавно закрытый) ордер в lastOrders[1]// а предпоследний в lastOrders[0]if (ticket > lastOrders[0]) {
if (ticket > lastOrders[1]) {
lastOrders[0] = lastOrders[1];
lastOrders[1] = ticket;
} else {
lastOrders[0] = ticket;
}
}
}
}
}
Print("lastOrders[1] = " +lastOrders[1]+";");
return (lastOrders[1]);
}
Но выводит номера и открытых и закрытых позиций. ORDER_TYPE всегда выводит 4, что тоже непонятно.
Пробовал менять ORDER на DEAL, но тоже не работает. Подскажите, пожалуйста, что не так?
Vladimir, спасибо. С функцией обновления котировок RefreshRatesиз классаCSymbolInfo я уже немного познакомился. Видел её в Ваших работах, ну и в букваре почитал.
Вызов этой функции в OnTick и вывод значений цен в Comment мне тоже понятны из примера.Процедура в OnInit по проверке текущего символа мне тоже понятна.
Пока буду ждать примера с новым баром, поупражняюсь с Вашим примером, не применял его ещё на практике. Попробую.
Итак пример, который работает только в момент рождения нового бара.
В данном примере используются статические переменныеPrevBars, prev_ask и prev_bid. Суть статических переменных -
Локальные переменные, объявленные с ключевым словом static сохраняют свои значения в течение всего времени существования функции. При каждом следующем вызове функции такие локальные переменные содержат те значения, которые они имели при предыдущем вызове.
Таким образом наши три статических переменных (PrevBars, prev_ask и prev_bid) - это локальные переменные объявленные внутри функции OnTick и они сохраняют свои значения, которые имели при предыдущем входе в функцию OnTick.
PrevBars хранит время предыдущего бара. Это время сравнивается с time_0 - временем текущего бара. Пока PrevBars равно time_0 - мы находимся на текущем баре и выходим из функции OnTick. Аналогично с переменными, которые хранят цены предыдущего бара: сначала отображаем предыдущие и текущие цены, затем записываем текущие цены в переменные prev_askиprev_bid .
Да я понимаю, что слэш это команда, но мне же нужно прописать путь, а для этого и использую двойной слэш.
Вот путь допустим
я получил в массив Folders[0] строку:
хочу получить меняя индекс массива доступ к файлу с одним и тем же названием, но лежащим в разных директориях, я полагаю, что надо делать так
но по такой команде будет получена ошибка, разве нет?
Алексей, возьми из документации пример
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//--- неправильный способ открытия файлаstringterminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
stringfilename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
if(filehandle<0)
{
Print("Неудачная попытка открыть файл по абсолютному пути");
Print("Код ошибки ",GetLastError());
}
//--- правильный способ работы в "файловой песочнице"ResetLastError();
filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
if(filehandle!=INVALID_HANDLE)
{
FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
FileClose(filehandle);
Print("FileOpen OK");
}
elsePrint("Операция FileOpen неудачна, ошибка ",GetLastError());
//--- еще один пример с созданием вложенной директории в MQL5\Files\string subfolder="Research";
filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
if(filehandle!=INVALID_HANDLE)
{
FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
FileClose(filehandle);
Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
}
elsePrint("Операция FileOpen неудачна, ошибка ",GetLastError());
}
и распечатай две string переменные, выделенные в коде примера. Найди отличия и пойми, что двойной слеш пишется только в коде программы, но при компиляции остаётся только один и один используется в пути к файлу.
[in] Имя открываемого файла, может содержать подпапки. Если файл открывается для записи, то указанные подпапки будут созданы в случае их отсутствия. [in] значение, используемое в качестве разделителя в txt или csv-файле. Если для csv-файла разделитель не указан, то по умолчанию используется символ табуляции. Если для txt-файла разделитель не...
Итак пример, который работает только в момент рождения нового бара.
В данном примере используются статические переменныеPrevBars, prev_ask и prev_bid. Суть статических переменных -
Таким образом наши три статических переменных (PrevBars, prev_ask и prev_bid) - это локальные переменные объявленные внутри функции OnTick и они сохраняют свои значения, которые имели при предыдущем входе в функцию OnTick.
PrevBars хранит время предыдущего бара. Это время сравнивается с time_0 - временем текущего бара. Пока PrevBars равно time_0 - мы находимся на текущем баре и выходим из функции OnTick. Аналогично с переменными, которые хранят цены предыдущего бара: сначала отображаем предыдущие и текущие цены, затем записываем текущие цены в переменные prev_askиprev_bid .
Vladimir, спасибо большое, всё доходчиво и понятно.
Вы просто не понимаете, что такое двойной слэш - это один символ, который в синтаксисе обозначается двумя: первый слэш-команда, второй - какая.
\n, \r, \t, \" и \\ - это символы, задающиеся по таком правилу. Т.е. в пути всегда один слэш.
Не исключаю, что я что-то не понимаю, но мне то нужна два слеша для генерации пути к файлу, а не один.
Не исключаю, что я что-то не понимаю, но мне то нужна два слеша для генерации пути к файлу, а не один.
Вам не нужно два слэша.
Попробуйте вывести в лог один, два, три слэша через Print. Возможно, тогда поймете.Вам не нужно два слэша.
Попробуйте вывести в лог один, два, три слэша через Print. Возможно, тогда поймете.Да я понимаю, что слэш это команда, но мне же нужно прописать путь, а для этого и использую двойной слэш.
Вот путь допустим
я получил в массив Folders[0] строку:
00\dir_01\A\хочу получить меняя индекс массива доступ к файлу с одним и тем же названием, но лежащим в разных директориях, я полагаю, что надо делать так
но по такой команде будет получена ошибка, разве нет?
Эт зря.
Добрый день!
Пытаюсь перейти с MQL4 на MQL5 и не могу найти последнию закрытую позицию.
В MQL5, когда мы посылаем ордер - это ордер, когда он открылся - он стал позицией и, по логике, после того как он закрылся, он должен попасть в историю позиций, а удаленные отложенные ордера должны быть в истории ордеров, но вижу только историю ордероа с сделок - поэтому непонятно где искать закрытую позицию.
Пробовал вот так:
Но выводит номера и открытых и закрытых позиций. ORDER_TYPE всегда выводит 4, что тоже непонятно.
Пробовал менять ORDER на DEAL, но тоже не работает.
Подскажите, пожалуйста, что не так?
Vladimir, спасибо. С функцией обновления котировок RefreshRates из класса CSymbolInfo я уже немного познакомился. Видел её в Ваших работах, ну и в букваре почитал.
Вызов этой функции в OnTick и вывод значений цен в Comment мне тоже понятны из примера. Процедура в OnInit по проверке текущего символа мне тоже понятна.
Пока буду ждать примера с новым баром, поупражняюсь с Вашим примером, не применял его ещё на практике. Попробую.
Итак пример, который работает только в момент рождения нового бара.
В данном примере используются статические переменные PrevBars, prev_ask и prev_bid. Суть статических переменных -
Локальные переменные, объявленные с ключевым словом static сохраняют свои значения в течение всего времени существования функции. При каждом следующем вызове функции такие локальные переменные содержат те значения, которые они имели при предыдущем вызове.
Таким образом наши три статических переменных (PrevBars, prev_ask и prev_bid) - это локальные переменные объявленные внутри функции OnTick и они сохраняют свои значения, которые имели при предыдущем входе в функцию OnTick.
PrevBars хранит время предыдущего бара. Это время сравнивается с time_0 - временем текущего бара. Пока PrevBars равно time_0 - мы находимся на текущем баре и выходим из функции OnTick. Аналогично с переменными, которые хранят цены предыдущего бара: сначала отображаем предыдущие и текущие цены, затем записываем текущие цены в переменные prev_ask и prev_bid .
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы от начинающих MQL5 MT5 MetaTrader 5
Aleksey Vyazmikin, 2018.12.05 00:39
Да я понимаю, что слэш это команда, но мне же нужно прописать путь, а для этого и использую двойной слэш.
Вот путь допустим
я получил в массив Folders[0] строку:
00\dir_01\A\хочу получить меняя индекс массива доступ к файлу с одним и тем же названием, но лежащим в разных директориях, я полагаю, что надо делать так
но по такой команде будет получена ошибка, разве нет?
Ошибки не будет. Вы так и не осознали, что такое двойной слэш.
Да я понимаю, что слэш это команда, но мне же нужно прописать путь, а для этого и использую двойной слэш.
Вот путь допустим
я получил в массив Folders[0] строку:
хочу получить меняя индекс массива доступ к файлу с одним и тем же названием, но лежащим в разных директориях, я полагаю, что надо делать так
но по такой команде будет получена ошибка, разве нет?
Алексей, возьми из документации пример
и распечатай две string переменные, выделенные в коде примера. Найди отличия и пойми, что двойной слеш пишется только в коде программы, но при компиляции остаётся только один и один используется в пути к файлу.
Ошибки не будет. Вы так и не осознали, что такое двойной слэш.
Спасибо за терпение!
Действительно, сразу до меня не дошло и не сложилась вся картина, что только для компилятора нужен двойной слэш для написания этого символа в строку.
Alexey Viktorov, спасибо за акцентуацию работы компилятора.
Итак пример, который работает только в момент рождения нового бара.
В данном примере используются статические переменные PrevBars, prev_ask и prev_bid. Суть статических переменных -
Таким образом наши три статических переменных (PrevBars, prev_ask и prev_bid) - это локальные переменные объявленные внутри функции OnTick и они сохраняют свои значения, которые имели при предыдущем входе в функцию OnTick.
PrevBars хранит время предыдущего бара. Это время сравнивается с time_0 - временем текущего бара. Пока PrevBars равно time_0 - мы находимся на текущем баре и выходим из функции OnTick. Аналогично с переменными, которые хранят цены предыдущего бара: сначала отображаем предыдущие и текущие цены, затем записываем текущие цены в переменные prev_ask и prev_bid .