Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
OrderOpenPrice, как я понимаю, выдаёт именно то, что мне нужно. Но только при условии, что валюта депозита - доллар, а торгуемая пара - EUR/USD. В этом случае в OrderOpenPrice как бы сохраняется курс базовой валюты по отношению к валюте депозита на момент открытия ордера, зная который, можно без труда вычислить залог.
А вот если хотя бы одно из этих условий не выполняется, то как получить величину залога для отдельно взятого ордера? Где взять курс базовой валюты котировки по отношению к валюте депозита на момент его открытия?
Да, у нас есть время открытия ордера с точностью до секунды. Но что мы можем получить? Как максимум - параметры минутной свечи нужного инструмента. Но никак не точное значение курса, по которому вычислялся залог. Но ведь функция AccountMargin как-то получает его! Очень бы хотелось понять, как именно.
Вам нужно три формулы для вычисления маржи.
В зависимости от валюты депозита Вы рассчитаете маржу для любой валютной пары
То что возможна погрешность при вычислении, это факт. Но она будет значительно меньше той, которая получится при округлении результата расчета до сотых долей единицы базовой валюты депозита, т.е. если доллар, то я имею ввиду центы.
PS
AccountMargin - это текущее, т.е последнее значение
А что если я буду получать точное значение маржи в момент открытия ордера при помощи конструкции MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot - в нём всегда будет два знака после запятой, так? Затем я умножу его на 100 и сохраню как MagicNumber этого ордера. А при необходимости достану оттуда и разделю на 100.0.
Будет ли это правильно?
А что если я буду получать точное значение маржи в момент открытия ордера при помощи конструкции MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot - в нём всегда будет два знака после запятой, так? Затем я умножу его на 100 и сохраню как MagicNumber этого ордера. А при необходимости достану оттуда и разделю на 100.0.
Будет ли это правильно?
Опять же магик не для этого. Лучше производить запись в лог-файл, а потом читать.
Всё зависит от того - с какой целью производится такой расчет, на какое количество ордеров рассчитана программа
Мне кажется, что такие точные расчеты нужны только брокеру или ДЦ
С этой точки зрения оптимальным решением будет всё-таки логирование.
А зачем вы врёте от количестве знаков? Не вводите народ в заблуждение.
Ха.
А про счета с повышенной точностью не слыхали ни разу?
Перенесено:
Vasiliy Danilov, 2016.12.02 07:18
Подскажите пожалуйста не могу разобраться. Почти написал простенький советник по внешнему индикатору, возникла одна загвоздка.
Не корректно работает закрытие половины лота и ордер модифицируется на каждый тик.
Вот блок модификации на покупку
if (CountBuy()>0) //В этой функции считается кол-во ордеров на покупку
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
Print("Ошибка закрытия половины лота на покупку");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
Print("Ошибка модификации в безубыток на покупку");
} } }
Перенесено:
Vasiliy Danilov, 2016.12.02 07:18
Для начала попробуйте вместо Lots/2 использовать NormalizeDouble(OrderLot()/2,2)
И вставьте код в пост через кнопку "SRC", чтобы он стал читаемым
Если в блоке есть OrederClose - происходит сразу закрытие половины лота и в дальнейшем OrderModify уже не работает.
Если убрать OrederClose, то OrderModify модифицирует ордер на каждый тик
Вот блок модификации на покупку
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
Print("Ошибка закрытия половины лота на покупку");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
Print("Ошибка модификации в безубыток на покупку");
} } }
Подскажите пожалуйста не могу разобраться. Почти написал простенький советник по внешнему индикатору, возникла одна загвоздка.
Если в блоке есть OrederClose - происходит сразу закрытие половины лота и в дальнейшем OrderModify уже не работает.
Если убрать OrederClose, то OrderModify модифицирует ордер на каждый тик
Вот блок модификации на покупку
{ for (int i = OrdersTotal() -1; i>=0; i--)
{ if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{ if (OrderMagicNumber()==Magic && OrderType()==OP_BUY && (Ask-OrderOpenPrice())*10000>MinMove) //Если цена прошла необходимое движение из индикатора
SL=NormalizeDouble(Ask-(MinMove*10)*Point,Digits); //Тут меняю стоп на безубыток
if(!OrderClose(Ticket,Lots/2,Ask,Slippage,Black)) //Пытаюсь закрыть половину лота
Print("Ошибка закрытия половины лота на покупку");
if(!OrderModify(Ticket,OrderOpenPrice(),SL,TP,0)) //Тут переставляю оставшуюся часть в безубыток
Print("Ошибка модификации в безубыток на покупку");
} } }
У Вас вылетает по ошибке закрытия половинки лота, поэтому не модифицируется. Внесите исправление согласно моего поста выше
А чтобы делать такое один раз, нужно задать безубыток фиксированным числом пунктов ну и добавить условие проверки тейк-профита ордера на факт соответствия этому числу
И при проходе через такое условие в блок модификации ордера, закрывать половинку
Нет. Старайтесь понять что Вы делаете. То, что написали Вы - лишь прототип функции (т.е. просто ее описание, то что она делает). Т.е. просто выдрали кусок из документации. Вам же нужно ее использовать. Т.е. подставить вместо аргументов свои значения. И функция вернет Вам результат. Далее этот результат нужно обработать.
Спасибо за ответ ... перелопатил пол интернета, очень мало примеров использования функции StringFind, из найденного сделал вывод, что параметры должны быть:
int StringFind(
string comment = OrderComment() // строка, в которой ищемstring OrderStopLoss, OrderTakeProfit // что ищем
int start_pos=0 // с какой позиции начинать поиск
);
... если я не прав, прошу меня поправить ...
А зачем вы врёте от количестве знаков? Не вводите народ в заблуждение.