Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
Скажите, а можно написать так, что если ордер закрылся на определённой цене в минус(скажем на N пунктов больше, чем стоплосс или на N пунктов меньше чем цена открытия ордера?
То что цены совпадают я сразу увидел, т.к. ошибка 130. Потому и принтовал. Код писал ночью, и полусонный в глобальных переменную pt обозвал интом Вот и понеслось... А дальше все расчёты и получение его значения не верны и в ноль всё. В общем нужно писать код либо раньше, либо бодрым.... А не по ночам.
hoz, небольшое замечание.
Каждая пара скобок увеличивает время выполнения кода. Поэтому если можно обойтись без них то упускать такую возможность не нужно. Я бы написал так.
MathAbs(Bid - iOpen(NULL, PERIOD_D1, 0)) / Point;
Алексей, а вот тут давайте остановимся... Недавно я искал решение какого-то вопроса, так вот наткнулся на ветку _http://forum.mql4.com/ru/44881
Рекомендую обратить внимание на пост drknn. Это, на сколько я в курсе, очень серьёзный и опытный программист. И, навряд ли, он ошибается.
Я ничего не утверждаю, но вот вышло 2 различных мнения.. Потому хочется этот вопрос разобрать и больше к нему не возвращаться..
Алексей, а вот тут давайте остановимся... Недавно я искал решение какого-то вопроса, так вот наткнулся на ветку _http://forum.mql4.com/ru/44881
Рекомендую обратить внимание на пост drknn. Это, на сколько я в курсе, очень серьёзный и опытный программист. И, навряд ли, он ошибается.
Я ничего не утверждаю, но вот вышло 2 различных мнения.. Потому хочется этот вопрос разобрать и больше к нему не возвращаться..
Там речь идёт о других скобках. Может я не корректно выразился.
Я имел ввиду функции. Если сов работает только с той валютой на графике которой поставлен и не обращается к другим парам, то вместо Symbol() лучше написать NULL
В твоём варианте 3 лишних пары скобок (функции) которые можно заменить предопределёнными переменными в iOpen(Symbol(), 1440, 0) вместо Symbol() лучше написать NULL и вместо MarketInfo(Symbol(),MODE_POINT) написать Point
А что касается таких скобок о которых речь идёт в той теме, так я никогда не соглашусь с тем что такие лишние скобки гарантируют правильную работу кода. А вот заблудиться в этих лишних скобках как в лесу совсем не мудрено. Всё должно быть обосновано и логично.
Ведь Symbol() это и есть текущий символ инструмента, почему нет? Смысла не улавливаю. Ведь если черпать данные с другого инструмента то вписывается в кавычках имя инструмента, например, "GBRUSD"
Там речь идёт о других скобках. Может я не корректно выразился.
Я имел ввиду функции. В твоём варианте 3 лишних пары скобок (функции) которые можно заменить предопределёнными переменными в iOpen(Symbol(), 1440, 0) вместо Symbol() лучше написать NULL и вместо MarketInfo(Symbol(),MODE_POINT) написать Point
А что касается таких скобок о которых речь идёт в той теме, так я никогда не соглашусь с тем что такие лишние скобки гарантируют правильную работу кода. А вот заблудиться в этих лишних скобках как в лесу совсем не мудрено. Всё должно быть обосновано и логично.
Я понял вашу логику, только вот таким образом код разрастается, появляются дополнительные переменные, а с ними и дополнительные ячейки памяти.. Это мысли вслух.. но есть же в этом логика.. вроде как.
Я тут мудрил мудрил, и что-то сильно всё выходит длинно.
Как сделать чтоб ордера открывались по очерёдно? Т.е. buy и sell чередовались.
Можно, конечно, при открытии заглядывать в историю и находить последний в цикле ордер ближайший по времени и .. НО это слишком накладно по ресурсам и по количеству писанины.
Я так понимаю, это делается через флаги. Как это реализовать?
Вом моя торговая функция. Может в ней можно?
PHP:
//+-------------------------------------------------------------------------------------+
//| Торговая функция |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
if (signal == SIGNAL_BUY && FindOrders() == 0)
if (!OpenBuy())
return(false);
if (signal == SIGNAL_SELL && FindOrders() == 0)
if (!OpenSell())
return(false);
return(true);
}
Ведь Symbol() это и есть текущий символ инструмента, почему нет? Смысла не улавливаю. Ведь если черпать данные с другого инструмента то вписывается в кавычках имя инструмента, например, "GBRUSD"
Я понял вашу логику, только вот таким образом код разрастается, появляются дополнительные переменные, а с ними и дополнительные ячейки памяти.. Это мысли вслух.. но есть же в этом логика.. вроде как.
Symbol() это функция определения текущего символа... NULL это специальная константа (можно написать 0), а Point это предопределённая переменная которые не увеличивают количество переменных и не занимают дополнительных ресурсов, они по-любому присутствуют, даже если не загружено ни одного советника или пользовательского индикатора.
Я тут мудрил мудрил, и что-то сильно всё выходит длинно.
Как сделать чтоб ордера открывались по очерёдно? Т.е. buy и sell чередовались.
Можно, конечно, при открытии заглядывать в историю и находить последний в цикле ордер ближайший по времени и .. НО это слишком накладно по ресурсам и по количеству писанины.
Я так понимаю, это делается через флаги. Как это реализовать?
Вом моя торговая функция. Может в ней можно?
PHP:
//+-------------------------------------------------------------------------------------+
//| Торговая функция |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
if (signal == SIGNAL_BUY && FindOrders() == 0)
if (!OpenBuy())
return(false);
if (signal == SIGNAL_SELL && FindOrders() == 0)
if (!OpenSell())
return(false);
return(true);
}
Ты действительно намудрил.
Как я понял, ты освоил написание и вызов пользовательских функций и теперь пишешь их где надо и не надо. (Без обид)
Зачем тебе две разных функции, в одной из которых определяется наличие ордера (любого типа) а в другой определяется есть-ли ордер нужного типа.
Я пользуюсь такой функцией
Код:
int Buy, Sell; // на глобальном уровне
void CountTrades()
{
Buy = 0; Sell = 0;
int Total = OrdersTotal();
for(int i = 0; i < Total; i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY) Buy++;
if(OrderType() == OP_SELL) Sell++;
}
}//for
}//*******************************************************|
Вызов этой функции можно ограничить условием if(Buy+Sell != OrdersTotal()) CountTrades();
А можно и на каждом тике вызывать.
Если используются отложенные ордера, то соответственно надо добавить переменные и подсчёт их в функции.
void CountTrades(int &Buy, int &Sell)
{
Buy = 0; Sell = 0;
int Total = OrdersTotal();
for(int i = 0; i < Total; i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY) Buy++;
if(OrderType() == OP_SELL) Sell++;
}
}//for
}//*******************************************************|
После вызова функции, как я понимаю, в той функции будут значения данных переменных. Немного изврат, конечно, но.. Просто недавно этот вопрос подымался, вот и вспомнил..
void CountTrades(int &Buy, int &Sell)
{
Buy = 0; Sell = 0;
int Total = OrdersTotal();
for(int i = 0; i < Total; i++)
{
if(OrderSelect(i, SELECT_BY_POS) && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if(OrderType() == OP_BUY) Buy++;
if(OrderType() == OP_SELL) Sell++;
}
}//for
}//*******************************************************|
После вызова функции, как я понимаю, в той функции будут значения данных переменных. Немного изврат, конечно, но.. Просто недавно этот вопрос подымался, вот и вспомнил..
А это в int start() для того, чтобы не тратить время на обработку этой ф-ции на каждом тике, если предусмотрено открытие только по одному ордеру в каждую сторону. Но я там пропустил ещё условие Buy+Sell != 0
Если честно, то я отказался от этого. Выполнение достаточно быстрое.