Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 18

 
Babu Bonappan:

А что если я буду получать точное значение маржи в момент открытия ордера при помощи конструкции MarketInfo(OrderSymbol(),MODE_MARGINREQUIRED)*Lot - в нём всегда будет два знака после запятой, так? Затем я умножу его на 100 и сохраню как MagicNumber этого ордера. А при необходимости достану оттуда и разделю на 100.0.

Будет ли это правильно? 

Вы хотите каждому ордеру свой magic присвоить?
 
Babu Bonappan:

OrderOpenPrice, как я понимаю, выдаёт именно то, что мне нужно. Но только при условии, что валюта депозита - доллар, а торгуемая пара - EUR/USD. В этом случае в OrderOpenPrice как бы сохраняется курс базовой валюты по отношению к валюте депозита на момент открытия ордера, зная который, можно без труда вычислить залог.

А вот если хотя бы одно из этих условий не выполняется, то как получить величину залога для отдельно взятого ордера? Где взять курс базовой валюты котировки по отношению к валюте депозита на момент его открытия?

Да, у нас есть время открытия ордера с точностью до секунды. Но что мы можем получить? Как максимум - параметры минутной свечи нужного инструмента. Но никак не точное значение курса, по которому вычислялся залог. Но ведь функция AccountMargin как-то получает его! Очень бы хотелось понять, как именно.

OrderOpenPrice - цена открытия ордера, она же (цена) является соотношением одной валюты к другой

AccountMargin - даёт общую маржу по счёту, по всем открытым ордерам.

 
Vladimir Karputov:

Перенесено:

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() );

т.е. если есть ошибка - спрашиваем код ошибки, если нет ошибки не спрашиваем код ошибки.


 
bablusut:

Спасибо за ответ ... перелопатил пол интернета, очень мало примеров использования функции StringFind, из найденного сделал вывод, что параметры должны быть: 

 int  StringFind(

   string  comment = OrderComment()  // строка, в которой ищем
   string  OrderStopLoss, OrderTakeProfit // что ищем
   int      start_pos=0    // с какой позиции начинать поиск

   ); 

... если я не прав, прошу меня поправить ... 

Это немного не так работает. Задаются в качестве аргументов этой функции 1) строка, в которой нужно искать; 2) сочетание символов, что нужно найти; 3) Начало поиска (по умолчанию - с нулевого символа строки по п.1).

Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.

То есть  писать надо так:

if(StringFind(OrderComment(),"[tp]",0)>-1) {действие при нахождении признака закрытия по TP}
 
Renat Akhtyamov:

У Вас вылетает по ошибке закрытия половинки лота, поэтому не модифицируется. Внесите исправление согласно моего поста выше

А чтобы делать такое один раз, нужно задать безубыток фиксированным числом пунктов ну и добавить условие проверки тейк-профита ордера на факт соответствия этому числу

И при проходе через такое условие в блок модификации ордера, закрывать половинку

Vasiliy Danilov:
Подскажите пожалуйста не могу разобраться. Почти написал простенький советник по внешнему индикатору, возникла одна загвоздка.

Если в блоке есть OrederClose - происходит сразу закрытие половины лота и в дальнейшем OrderModify уже не работает.

Если убрать OrederClose, то OrderModify модифицирует ордер на каждый тик

Вот блок модификации на покупку

   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("Ошибка модификации в безубыток на покупку");

   }    }   }
Как сделать так, чтобы при проходе цены до MinMove закрывалось половина ордера, а вторая половина перешла в безубыток один раз?

Кстати сейчас только обратил внимание OrderSelect по позиции SELECT_BY_POS , а выбор ticket где?

OrderClose(OrderTicket()

 
Babu Bonappan:

Пожалуйста, подскажите, как средствами MQL4 получить величину маржи по каждой открытой позиции в терминале?

Я обычно делал так:

margin = MarketInfo(Symbol(),MODE_LOTSIZE) * OrderOpenPrice() / AccountLeverage() * OrderLots();

При торговле по EUR/USD эта конструкция прекрасно работала и я был уверен, что её логика правильная.

Но теперь я хочу получить тот же результат для EUR/JPY (или EUR/CHF). Очевидно, что вместо OrderOpenPrice() мне нужно умножать величину стандартного лота на курс базовой валюты к валюте депозита (в моём случае на EUR/USD). Но вот что это за курс? Тот, что был в момент открытия позиции или тот, что есть сейчас (в тот момент, когда мы хотим узнать сумму залога по этой позиции)?

MODE_MARGINMAINTENANCE  нет?

 
A1exPit:

Кстати сейчас только обратил внимание OrderSelect по позиции SELECT_BY_POS , а выбор ticket где?

OrderClose(OrderTicket()

Вы тут в этой ветке совсем что ли ничего не знаете?

Если ордер выбран, то и OrderTicket() возвращает тикет выбранного ордера. И не важно как выбран ордер - по индексу или по тикету.

Есть нюанс при выборе по тикету - pool не учитывается, и нужно проверять из какого списка выбран ордер, проверяя время его закрытия.

 
Vasiliy Danilov:
Подскажите пожалуйста не могу разобраться. Почти написал простенький советник по внешнему индикатору, возникла одна загвоздка.

Если в блоке есть OrederClose - происходит сразу закрытие половины лота и в дальнейшем OrderModify уже не работает.

Если убрать OrederClose, то OrderModify модифицирует ордер на каждый тик

Вот блок модификации на покупку

   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("Ошибка модификации в безубыток на покупку");

   }    }   }
Как сделать так, чтобы при проходе цены до MinMove закрывалось половина ордера, а вторая половина перешла в безубыток один раз?

При частичном закрытии тикет меняется. Сначала в безубыток, потом закрыть.

Либо логику меняйте.

 
Artyom Trishkin:

A1exPit:

Кстати сейчас только обратил внимание OrderSelect по позиции SELECT_BY_POS , а выбор ticket где?

OrderClose(OrderTicket() 

Вы тут в этой ветке совсем что ли ничего не знаете?

Если ордер выбран, то и OrderTicket() возвращает тикет выбранного ордера. И не важно как выбран ордер - по индексу или по тикету.

Есть нюанс при выборе по тикету - pool не учитывается, и нужно проверять из какого списка выбран ордер, проверяя время его закрытия.

А если просмотреть код, к которому этот комментарий был написан? Там всё не так однозначно...

 

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
 
Vitalie Postolache:

А если просмотреть код, к которому этот комментарий был написан? Там всё не так однозначно...

 

{ 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)) //Пытаюсь закрыть половину лота Какой тикет?
Ну... да... не глядел внимательно. Так - мельком. Мне эта ветка не интересна по некоторым причинам