Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
А что если я буду получать точное значение маржи в момент открытия ордера при помощи конструкции MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot - в нём всегда будет два знака после запятой, так? Затем я умножу его на 100 и сохраню как MagicNumber этого ордера. А при необходимости достану оттуда и разделю на 100.0.
Будет ли это правильно?
OrderOpenPrice, как я понимаю, выдаёт именно то, что мне нужно. Но только при условии, что валюта депозита - доллар, а торгуемая пара - EUR/USD. В этом случае в OrderOpenPrice как бы сохраняется курс базовой валюты по отношению к валюте депозита на момент открытия ордера, зная который, можно без труда вычислить залог.
А вот если хотя бы одно из этих условий не выполняется, то как получить величину залога для отдельно взятого ордера? Где взять курс базовой валюты котировки по отношению к валюте депозита на момент его открытия?
Да, у нас есть время открытия ордера с точностью до секунды. Но что мы можем получить? Как максимум - параметры минутной свечи нужного инструмента. Но никак не точное значение курса, по которому вычислялся залог. Но ведь функция AccountMargin как-то получает его! Очень бы хотелось понять, как именно.
OrderOpenPrice - цена открытия ордера, она же (цена) является соотношением одной валюты к другой
AccountMargin - даёт общую маржу по счёту, по всем открытым ордерам.
Перенесено:
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("Ошибка модификации в безубыток на покупку");
} } }
Что бы ордер каждый тик не модифицировался можно проверку поставить что то типо if (SL != OrderStopLoss()) modify .... Тогда модифицироваться будет только при отличии значения SL от текущего OrderStopLoss.
а что бы понять, что не так при закрытии происходит поставь запрос GetLastError(); а вообще хорошо бы проверить OrderClose ... bool testOrCls
testOrCls=OrderClose ......
if(!testOrCls) Print (GetLastError() );
т.е. если есть ошибка - спрашиваем код ошибки, если нет ошибки не спрашиваем код ошибки.
Спасибо за ответ ... перелопатил пол интернета, очень мало примеров использования функции StringFind, из найденного сделал вывод, что параметры должны быть:
int StringFind(
string comment = OrderComment() // строка, в которой ищемstring OrderStopLoss, OrderTakeProfit // что ищем
int start_pos=0 // с какой позиции начинать поиск
);
... если я не прав, прошу меня поправить ...
Это немного не так работает. Задаются в качестве аргументов этой функции 1) строка, в которой нужно искать; 2) сочетание символов, что нужно найти; 3) Начало поиска (по умолчанию - с нулевого символа строки по п.1).
Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.
То есть писать надо так:
У Вас вылетает по ошибке закрытия половинки лота, поэтому не модифицируется. Внесите исправление согласно моего поста выше
А чтобы делать такое один раз, нужно задать безубыток фиксированным числом пунктов ну и добавить условие проверки тейк-профита ордера на факт соответствия этому числу
И при проходе через такое условие в блок модификации ордера, закрывать половинку
Подскажите пожалуйста не могу разобраться. Почти написал простенький советник по внешнему индикатору, возникла одна загвоздка.
Если в блоке есть 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("Ошибка модификации в безубыток на покупку");
} } }
Кстати сейчас только обратил внимание OrderSelect по позиции SELECT_BY_POS , а выбор ticket где?
OrderClose(OrderTicket()
Пожалуйста, подскажите, как средствами MQL4 получить величину маржи по каждой открытой позиции в терминале?
Я обычно делал так:
При торговле по EUR/USD эта конструкция прекрасно работала и я был уверен, что её логика правильная.
Но теперь я хочу получить тот же результат для EUR/JPY (или EUR/CHF). Очевидно, что вместо OrderOpenPrice() мне нужно умножать величину стандартного лота на курс базовой валюты к валюте депозита (в моём случае на EUR/USD). Но вот что это за курс? Тот, что был в момент открытия позиции или тот, что есть сейчас (в тот момент, когда мы хотим узнать сумму залога по этой позиции)?
MODE_MARGINMAINTENANCE нет?
Кстати сейчас только обратил внимание OrderSelect по позиции SELECT_BY_POS , а выбор ticket где?
OrderClose(OrderTicket()
Вы тут в этой ветке совсем что ли ничего не знаете?
Если ордер выбран, то и OrderTicket() возвращает тикет выбранного ордера. И не важно как выбран ордер - по индексу или по тикету.
Есть нюанс при выборе по тикету - pool не учитывается, и нужно проверять из какого списка выбран ордер, проверяя время его закрытия.
Подскажите пожалуйста не могу разобраться. Почти написал простенький советник по внешнему индикатору, возникла одна загвоздка.
Если в блоке есть 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("Ошибка модификации в безубыток на покупку");
} } }
При частичном закрытии тикет меняется. Сначала в безубыток, потом закрыть.
Либо логику меняйте.
A1exPit:
Кстати сейчас только обратил внимание OrderSelect по позиции SELECT_BY_POS , а выбор ticket где?
OrderClose(OrderTicket()
Вы тут в этой ветке совсем что ли ничего не знаете?
Если ордер выбран, то и OrderTicket() возвращает тикет выбранного ордера. И не важно как выбран ордер - по индексу или по тикету.
Есть нюанс при выборе по тикету - pool не учитывается, и нужно проверять из какого списка выбран ордер, проверяя время его закрытия.
А если просмотреть код, к которому этот комментарий был написан? Там всё не так однозначно...
{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
А если просмотреть код, к которому этот комментарий был написан? Там всё не так однозначно...
{ 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)) //Пытаюсь закрыть половину лота Какой тикет?