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

 
Babu Bonappan:

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

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

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

Вам нужно три формулы для вычисления маржи.

В зависимости от валюты депозита Вы рассчитаете маржу для любой валютной пары

То что возможна погрешность при вычислении, это факт. Но она будет значительно меньше той, которая получится при округлении результата расчета до сотых долей единицы базовой валюты депозита, т.е. если доллар, то я имею ввиду центы.

PS

AccountMargin - это текущее, т.е последнее значение

 

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

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

 
Babu Bonappan:

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

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

Опять же магик не для этого. Лучше производить запись в лог-файл, а потом читать.

Всё зависит от того - с какой целью производится такой расчет, на какое количество ордеров рассчитана программа

Мне кажется, что такие точные расчеты нужны только брокеру или ДЦ

С этой точки зрения оптимальным решением будет всё-таки логирование.

 
Vitaly Muzichenko:

А зачем вы врёте от количестве знаков? Не вводите народ в заблуждение. 

 

Ха.

А про счета с повышенной точностью не слыхали ни разу?

 

 

Перенесено:

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

   }    }   } 


 
Vladimir Karputov:

Перенесено:

Vasiliy Danilov, 2016.12.02 07:18 

Для начала попробуйте вместо Lots/2 использовать NormalizeDouble(OrderLot()/2,2)

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

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

Если в блоке есть 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 закрывалось половина ордера, а вторая половина перешла в безубыток один раз?
 
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 закрывалось половина ордера, а вторая половина перешла в безубыток один раз?

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

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

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

 
Alexey Kozitsyn:
Нет. Старайтесь понять что Вы делаете. То, что написали Вы - лишь прототип функции (т.е. просто ее описание, то что она делает). Т.е. просто выдрали кусок из документации. Вам же нужно ее использовать. Т.е. подставить вместо аргументов свои значения. И функция вернет Вам результат. Далее этот результат нужно обработать.

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

 int  StringFind(

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

   ); 

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

 
Vitaly Muzichenko:

А зачем вы врёте от количестве знаков? Не вводите народ в заблуждение. 

 

у всех брокеров point разный
Причина обращения: