![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
...
Да, можно.
Единственное ограничение заключается в том, чтобы вы не столкнулись с "круговым вызовом", когда это закончится мертвым циклом. В остальном, никаких ограничений для вызовов функций нет.
Хорошая мысль. Я посмотрю на это.
Вопрос о функциях, можно ли вызывать функцию внутри функции? Например, у меня есть такая функция:
string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
{
if (... etc
Чем позже я вызову ее:
double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)Я ввел этот код для получения последнего открытого заказа:
//--- Функция для вычисления номера билета последнего открытого ордера
int LastOpenTicket()
{
datetime lastTime = 0;
int lastTicket = -1; //Ни один открытый.
int pos;
for (pos = OrdersTotal() - 1; pos >= 0; pos--)
if (OrderSelect(pos, SELECT_BY_POS) // Только мои заказы w.
&& OrderMagicNumber() == MagicNumber // мое магическое число
&& OrderSymbol() == Symbol() // и моя пара.
&& OrderOpenTime() > lastTime)
{
lastTime = OrderOpenTime();
lastTicket = OrderTicket();
}
return (lastTicket);
}
Эта функция вызывается из моей функции GetLots - компилятор не выдает ошибок, но когда я провожу бэктест, раздел результатов полностью чист. Нет сделок. Это потому, что первая сделка не имеет предыдущей сделки для вызова в приведенном выше коде?
В журнале он доходит до загрузки внешних переменных (из которых он загружает магический номер 42, но в моем коде он 42552...?), но затем ничего не происходит.
...
Каково объявление вашего магического числа (оно должно быть int MagicNumber; )
Я ввел этот код, чтобы получить последний открытый ордер:
//--- Функция для вычисления номера билета последнего открытого заказа
int LastOpenTicket()
{
datetime lastTime = 0;
int lastTicket = -1; //Ни один не открыт.
int pos;
for (pos = OrdersTotal() - 1; pos >= 0; pos--)
if (OrderSelect(pos, SELECT_BY_POS) // Только мои заказы w.
&& OrderMagicNumber() == MagicNumber // мое магическое число
&& OrderSymbol() == Symbol() // и моя пара.
&& OrderOpenTime() > lastTime)
{
lastTime = OrderOpenTime();
lastTicket = OrderTicket();
}
return (lastTicket);
}
Эта функция вызывается из моей функции GetLots - компилятор не выдает ошибок, но когда я провожу бэктест, раздел результатов полностью чист. Нет сделок. Это потому, что у первой сделки нет предыдущей сделки, к которой можно было бы обратиться в приведенном выше коде?
В журнале он доходит до загрузки внешних переменных (из которых он загружает магическое число 42, но в моем коде его 42552...?), но затем ничего не происходит.Да, это так int MagicNumber = 42557
...
Тогда я не могу сказать из кода, который вы выложили, почему он делает неправильно (почему он получает неправильный MagicNumber, например). Код должен работать, если есть какой-либо открытый ордер с указанным MagicNumber (он будет перебирать открытые ордера) Если нет открытых ордеров или MagicNumber и символы не совпадают, он вернет -1 (как вы и ожидаете), так что код правильный (протестировал его сейчас, и он работает так, как должен).
Извините, но это все, что я могу сделать из опубликованного вами кода.
Да, это так int MagicNumber = 42557
Что произойдет в случае, если предыдущий ордер не был открыт, а этот является первым? Я знаю, что он возвращает -1, но не запустится ли код EA, потому что моя функция GetLots полагается на вызов номера билета последнего открытого ордера.
Если он полагается на существование хотя бы одного ранее открытого ордера, то он не сработает.
Добавьте что-то вроде этого в ваше условие:
if (LastOpenOrder()==-1)
... тогда вы можете открыть ордер, если все остальные условия выполнены
else
... проверьте последний открытый ордер, как и раньше, плюс остальные условия
(просто делаю предположение, как вы написали условия вашего советника сейчас)
Что произойдет в случае, если предыдущий ордер не был открыт, а этот - первый? Я знаю, что он возвращает -1, но не запустится ли код советника, потому что моя функция GetLots полагается на вызов номера билета последнего открытого ордера.
Привет, Младен,
Знаете ли вы, как установить открытую сделку, когда линия стохастика пересекается на уровне 20 или 80?
Например.
Когда Stochastic пересекает друг друга на уровне 20 (перепроданность), Long
Когда Стохастик пересекает друг друга на уровне 80 (перекупленность), короткая сделка.
С уважением,
Райан
Я добавил несколько строк в этот код - это то, что использует функцию LastOpenTicket(), но она все еще не нравится. Я добавил опцию -1. Вам не кажется, что здесь что-то не так?
//--- Определяем, является ли предыдущий ордер на продажу прибыльным
string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
{
if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)
{
if (OrderProfit() > 0 && OrderType() == OP_SELL)
{
WinLossPreviousShort = "W";
return (WinLossPreviousShort);
}
if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)
{
WinLossPreviousShort = "L";
return (WinLossPreviousShort);
}
}
}
...
Почему бы вам не добавить еще один возможный результат этой функции: что-то вроде when LastOpenTicket() == -1 then WinLossPreviousShort="Na"
Я добавил несколько строк к этому коду - это то, что использует функцию LastOpenTicket(), но она все еще не нравится. Я добавил опцию -1. Вам не кажется, что здесь что-то не так?
//--- Определите, является ли предыдущий ордер на продажу прибыльным
string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
{
if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)
{
if (OrderProfit() > 0 && OrderType() == OP_SELL)
{
WinLossPreviousShort = "W";
return (WinLossPreviousShort);
}
if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)
{
WinLossPreviousShort = "L";
return (WinLossPreviousShort);
}
}
}