Вставляйте код правильно, альт S или по иконке, подсказка код.
А зачем вам массив SaveTick?
Вы используете только 2 элемента массива. Замените их на глобальные или статик переменные, если объявляете в функции.
Не разумно для 2х переменных использовать массив.
И судя по всему, вы вызываете массивы до вызова функции FindTicket() в которой задается размер массива SaveTick. И происходит выход за пределы массива.
Спасибо. разобрался. Подскажите в чем ошибка, мне кажется не правильно считает функция
Спасибо. разобрался. Подскажите в чем ошибка, мне кажется не правильно считает функция
Код правильно вставляйте, это 13-й квадратик сверху окна ответа.
А вы можете словами написать, что делает функция построчно.
Судя по всему конечно не правильно.
И непонятно, где и как переменной Tick присваивается тикет ордера. И зачем проверки на магик и тип ордера по такому условия _magic < 0 || OrderMagicNumber() == _magic Если функция вызывается с магиком меньше нуля или магик равек магик номеру выбранного ордера мы запрашиваем размер пункта и если он равен нулю мы ищем пустое значение в символе инструмента ордера... ну и далее.
Да и помните, ордер селект заполняет структуру данных ордера и хранит ее. И только после следующего ордер селект с другим номером или тикетом ордера данные в этой структуре поменяются.
Т.е. ОрдерСенд не заполняет структуру данных ордера, но возвращает тикет ордера или минус 1. А структура ордера заполняется только ОрдерСелект. И потом из этой структуры можно получить данные этого ордера.
Код правильно вставляйте, это 13-й квадратик сверху окна ответа.
А вы можете словами написать, что делает функция построчно.
Судя по всему конечно не правильно.
И непонятно, где и как переменной Tick присваивается тикет ордера. И зачем проверки на магик и тип ордера по такому условия _magic < 0 || OrderMagicNumber() == _magic Если функция вызывается с магиком меньше нуля или магик равек магик номеру выбранного ордера мы запрашиваем размер пункта и если он равен нулю мы ищем пустое значение в символе инструмента ордера... ну и далее.
Да и помните, ордер селект заполняет структуру данных ордера и хранит ее. И только после следующего ордер селект с другим номером или тикетом ордера данные в этой структуре поменяются.
Т.е. ОрдерСенд не заполняет структуру данных ордера, но возвращает тикет ордера или минус 1. А структура ордера заполняется только ОрдерСелект. И потом из этой структуры можно получить данные этого ордера.
int FindTicket()
{
int oldticket;
int tick=0;
ticket=0;
for(int cnt = OrdersTotal ()-1; cnt>=0; cnt--)
{
if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
ticket = oldticket;
tick = OrderTicket();
}
}
}
}
return(tick);
}
int TickF = FindTicket();
int CalculateProfitHistory()
{
double _point;
int i, _ototal = OrdersHistoryTotal(), _profit=0;
for (i = 0; i < OrdersHistoryTotal(); i++)
{
if (OrderSelect(TickF, SELECT_BY_TICKET, MODE_HISTORY))
{
if (OrderSymbol() == Symbol())
{
if (OrderMagicNumber() == Magic)
{
_point = MarketInfo(OrderSymbol(), MODE_POINT);
if (_point == 0)
{
if (StringFind(OrderSymbol(), "") < 0)
_point = 0.0001;
else _point = 0.01;
}
if (OrderType() == OP_BUY)
{
_profit += int((MarketInfo(OrderSymbol(), MODE_BID) - OrderOpenPrice())/_point);
}
if (OrderType()==OP_SELL)
{
_profit += int((OrderOpenPrice() - MarketInfo(OrderSymbol(), MODE_ASK))/_point);
}
}
}
}
}
return(_profit);
}
В первой функции нахожу тикет нужного ордера. А вторая должна посчитать профит всех закрытых ордеров после этого тикета. Профит тех, что были до него, мне неинтересны. Вот вторая, считает криво. При открытие ордера вызывается эти 2 функции, и соответственно он должен быть равен 0, но он не равен. PS воспользовался Вашим советом, отказался от массивов) 12-й квадратик сверху)
В первой функции нахожу тикет нужного ордера. А вторая должна посчитать профит всех закрытых ордеров после этого тикета. Профит тех, что были до него, мне неинтересны. PS воспользовался Вашим советом, отказался от массивов) 12-й квадратик сверху)
В первой функции находится тикет с наибольшим номером, если тикеты возрастают с номерами))) На следующей итерации цикла тикет следующего по номеру ордера сравнивается с тикетом предыдущего ордера. Ордер селект заполняет структуры ордера, а ОрдерТикет получает из этой структуры значение тикета.
Построчно для себя напиши или проговори, что делает каждая строчка кода) Лучше напиши, так самому будет понятней.
Во второй функции ОрдерСелект по одному и тому же тикету будет заполнять структуру ордера одними и теми же данными ордера с тикетом ТикФ)
В первой функции находится тикет с наибольшим номером, если тикеты возрастают с номерами))) На следующей итерации цикла тикет следующего по номеру ордера сравнивается с тикетом предыдущего ордера. Ордер селект заполняет структуры ордера, а ОрдерТикет получает из этой структуры значение тикета.
Построчно для себя напиши или проговори, что делает каждая строчка кода) Лучше напиши, так самому будет понятней.
Во второй функции ОрдерСелект по одному и тому же тикету будет заполнять структуру ордера одними и теми же данными ордера с тикетом ТикФ)
Проговаривал, но видно плохо с логикой в отношении данного языка. Подскажи Как определить тикет последнего открытого ордера?
И как посчитать профит всех закрытых ордеров идущих после него?
Проговаривал, но видно плохо с логикой в отношении данного языка. Подскажи Как определить тикет последнего открытого ордера?
И как посчитать профит всех закрытых ордеров идущих после него?
По времени открытия ордера. Оно должно быть самым большим) И только не по номеру ордера, и часто тикеты тоже не помогут. Или запоминать в свою базу порядковые номера, тикеты, состояние ордеров и время открытия / закрытия.
if(OrderSelect(Ticket, SELECT_BY_TICKET)==true) // Если выбор рыночного ордера произошел успешно
{
if(OrderCloseTime()==0) // Если наш рыночный ордер не закрыт {
// Alert("Наш рыночный ордер жив, Модифицируем его если нужно ");
if(Tral_Stop!=0 || Tral_Profit!=0)
{ ModifyTral(); }
return;
}
if(OrderCloseTime()!=0) // Если наш рыночный ордер закрылся
{
Alert("Our market order has closed. The Adviser's work is completed ",
" Swap = ", OrderSwap(), " Commission = ", OrderCommission(),"Profit/loss = ",OrderProfit());
// ..... // получаем профит и считаем общий профит например
}
И лучше проговаривать логику до конца. Так потом легче. Начинать лучше с необходимых данных, и их должно быть достаточно для решения)
У нас есть время открытия ордеров (не отложенных). Есть их тикеты. Есть у каждого рыночного ордера цена открытия, СЛ и ТП. И есть время закрытия ордеров. И после закрытия ордера заполняются поля Профит.
Вот из этих данных нужно сверстать логику.
Фраза закрытые ордера идущие после последнего открытого не определена совсем. Идти могут по номеру, по тикету и по времени.
пишите правильно, но что то код получился несколько витиеватый )))
по моему как пишите так и делать:
ЗЫ: OrderSelect() по номеру тикета будет намного дольше выполняться чем просто перебор по открытым ордерам
Спасибо Игорь, просто когда не понимают сути, правильный код по чему-то сути не доносит, поэтому и прошу сформулировать не сложные алгоритмы словами)))
По времени открытия ордера. Оно должно быть самым большим) И только не по номеру ордера, и часто тикеты тоже не помогут. Или запоминать в свою базу порядковые номера, тикеты, состояние ордеров и время открытия / закрытия.
И лучше проговаривать логику до конца. Так потом легче. Начинать лучше с необходимых данных, и их должно быть достаточно для решения)
У нас есть время открытия ордеров (не отложенных). Есть их тикеты. Есть у каждого рыночного ордера цена открытия, СЛ и ТП. И есть время закрытия ордеров. И после закрытия ордера заполняются поля Профит.
Вот из этих данных нужно сверстать логику.
Фраза закрытые ордера идущие после последнего открытого не определена совсем. Идти могут по номеру, по тикету и по времени.
Спасибо большое за ответы. Часть из Ваших предложений я реализовал. Написал функция, находит нужный тик. Написал функцию, которая считает профит всех закрытых ордеров после нужного ордер тика выбранной функции. Осталось одно поправить ее по вашим рекомендациям, добавить проверку по времени и так далее.
Только одно теперь меня смущает, а считает как то не так. Если ТР выходит 0.02 в результате теста, то она считает и пишет в Comment 0.1300. Подскажите, что с ней не так?
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вставляйте код правильно, альт S или по иконке, подсказка код.
А зачем вам массив SaveTick?
Вы используете только 2 элемента массива. Замените их на глобальные или статик переменные, если объявляете в функции.
Не разумно для 2х переменных использовать массив.
И судя по всему, вы вызываете массивы до вызова функции FindTicket() в которой задается размер массива SaveTick. И происходит выход за пределы массива.
Спасибо. разобрался.
Подскажите в чем ошибка, мне кажется не правильно считает функция
***Спасибо. разобрался.
Подскажите в чем ошибка, мне кажется не правильно считает функция
Код правильно вставляйте, это 13-й квадратик сверху окна ответа.
А вы можете словами написать, что делает функция построчно.
Судя по всему конечно не правильно.
И непонятно, где и как переменной Tick присваивается тикет ордера. И зачем проверки на магик и тип ордера по такому условия
_magic < 0 || OrderMagicNumber() == _magic
Если функция вызывается с магиком меньше нуля или магик равек магик номеру выбранного ордера мы запрашиваем размер пункта и если он равен нулю мы ищем пустое значение в символе инструмента ордера... ну и далее.
Да и помните, ордер селект заполняет структуру данных ордера и хранит ее. И только после следующего ордер селект с другим номером или тикетом ордера данные в этой структуре поменяются.
Т.е. ОрдерСенд не заполняет структуру данных ордера, но возвращает тикет ордера или минус 1. А структура ордера заполняется только ОрдерСелект. И потом из этой структуры можно получить данные этого ордера.
Код правильно вставляйте, это 13-й квадратик сверху окна ответа.
А вы можете словами написать, что делает функция построчно.
Судя по всему конечно не правильно.
И непонятно, где и как переменной Tick присваивается тикет ордера. И зачем проверки на магик и тип ордера по такому условия
_magic < 0 || OrderMagicNumber() == _magic
Если функция вызывается с магиком меньше нуля или магик равек магик номеру выбранного ордера мы запрашиваем размер пункта и если он равен нулю мы ищем пустое значение в символе инструмента ордера... ну и далее.
Да и помните, ордер селект заполняет структуру данных ордера и хранит ее. И только после следующего ордер селект с другим номером или тикетом ордера данные в этой структуре поменяются.
Т.е. ОрдерСенд не заполняет структуру данных ордера, но возвращает тикет ордера или минус 1. А структура ордера заполняется только ОрдерСелект. И потом из этой структуры можно получить данные этого ордера.
В первой функции нахожу тикет нужного ордера. А вторая должна посчитать профит всех закрытых ордеров после этого тикета. Профит тех, что были до него, мне неинтересны. Вот вторая, считает криво. При открытие ордера вызывается эти 2 функции, и соответственно он должен быть равен 0, но он не равен.
PS воспользовался Вашим советом, отказался от массивов)
12-й квадратик сверху)
В первой функции нахожу тикет нужного ордера. А вторая должна посчитать профит всех закрытых ордеров после этого тикета. Профит тех, что были до него, мне неинтересны.
PS воспользовался Вашим советом, отказался от массивов)
12-й квадратик сверху)
В первой функции находится тикет с наибольшим номером, если тикеты возрастают с номерами))) На следующей итерации цикла тикет следующего по номеру ордера сравнивается с тикетом предыдущего ордера. Ордер селект заполняет структуры ордера, а ОрдерТикет получает из этой структуры значение тикета.
Построчно для себя напиши или проговори, что делает каждая строчка кода) Лучше напиши, так самому будет понятней.
Во второй функции ОрдерСелект по одному и тому же тикету будет заполнять структуру ордера одними и теми же данными ордера с тикетом ТикФ)
В первой функции находится тикет с наибольшим номером, если тикеты возрастают с номерами))) На следующей итерации цикла тикет следующего по номеру ордера сравнивается с тикетом предыдущего ордера. Ордер селект заполняет структуры ордера, а ОрдерТикет получает из этой структуры значение тикета.
Построчно для себя напиши или проговори, что делает каждая строчка кода) Лучше напиши, так самому будет понятней.
Во второй функции ОрдерСелект по одному и тому же тикету будет заполнять структуру ордера одними и теми же данными ордера с тикетом ТикФ)
Проговаривал, но видно плохо с логикой в отношении данного языка. Подскажи Как определить тикет последнего открытого ордера?
И как посчитать профит всех закрытых ордеров идущих после него?
Проговаривал, но видно плохо с логикой в отношении данного языка. Подскажи Как определить тикет последнего открытого ордера?
И как посчитать профит всех закрытых ордеров идущих после него?
По времени открытия ордера. Оно должно быть самым большим) И только не по номеру ордера, и часто тикеты тоже не помогут. Или запоминать в свою базу порядковые номера, тикеты, состояние ордеров и время открытия / закрытия.
И лучше проговаривать логику до конца. Так потом легче. Начинать лучше с необходимых данных, и их должно быть достаточно для решения)
У нас есть время открытия ордеров (не отложенных). Есть их тикеты. Есть у каждого рыночного ордера цена открытия, СЛ и ТП. И есть время закрытия ордеров. И после закрытия ордера заполняются поля Профит.
Вот из этих данных нужно сверстать логику.
Фраза закрытые ордера идущие после последнего открытого не определена совсем. Идти могут по номеру, по тикету и по времени.
По времени открытия ордера. Оно должно быть самым большим)
пишите правильно, но что то код получился несколько витиеватый )))
по моему как пишите так и делать:
ЗЫ: OrderSelect() по номеру тикета будет намного дольше выполняться чем просто перебор по открытым ордерам
пишите правильно, но что то код получился несколько витиеватый )))
по моему как пишите так и делать:
ЗЫ: OrderSelect() по номеру тикета будет намного дольше выполняться чем просто перебор по открытым ордерам
Спасибо Игорь, просто когда не понимают сути, правильный код по чему-то сути не доносит, поэтому и прошу сформулировать не сложные алгоритмы словами)))
По времени открытия ордера. Оно должно быть самым большим) И только не по номеру ордера, и часто тикеты тоже не помогут. Или запоминать в свою базу порядковые номера, тикеты, состояние ордеров и время открытия / закрытия.
И лучше проговаривать логику до конца. Так потом легче. Начинать лучше с необходимых данных, и их должно быть достаточно для решения)
У нас есть время открытия ордеров (не отложенных). Есть их тикеты. Есть у каждого рыночного ордера цена открытия, СЛ и ТП. И есть время закрытия ордеров. И после закрытия ордера заполняются поля Профит.
Вот из этих данных нужно сверстать логику.
Фраза закрытые ордера идущие после последнего открытого не определена совсем. Идти могут по номеру, по тикету и по времени.
Спасибо большое за ответы. Часть из Ваших предложений я реализовал.
Написал функция, находит нужный тик.
Написал функцию, которая считает профит всех закрытых ордеров после нужного ордер тика выбранной функции. Осталось одно поправить ее по вашим рекомендациям, добавить проверку по времени и так далее.
Только одно теперь меня смущает, а считает как то не так. Если ТР выходит 0.02 в результате теста, то она считает и пишет в Comment 0.1300. Подскажите, что с ней не так?