Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 722

 
Alexey Viktorov:
Да, уж... Где-бы такого брокера найти... Ссылкой не поделишься?
Тут всё верно же. Buy закрывается по Bid
 
Приношу извинения за невнимательность. Я прочёл "открывается"...
 

Доброе время суток,

Вопрос:

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

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

при offset=1 выпадает ошибка:

 failed buy stop 0.10 AUDNZD.m at 1.03748 [Invalid price], т.е.маленький уровень цены (в моем случае)

 

Когда же при постановки сразу за ним же «ордера по исполнению»

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

все нормально отрабатывает (т.е. ордер ставится):

order performed buy 0.10 at 1.03747 [#2 buy 0.10 AUDNZD.m at 1.03747]

 Почему не принимается запрос по отложенному ордеру (1.03748),  т.е. при 1.03747 – ставится, а при 1.03748 – маленькое значение? (ведь SYMBOL_ASK учитавает спред, а offset - отступ от текущей цены для установки ордера, в пунктах, увеличен на 1)

Но при offset=100: ордер отложенный BUY_STOP price = 1.03847 – уже работает


Спасибо.
 
Konstantin_78:

Доброе время суток,

Вопрос:

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

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

при offset=1 выпадает ошибка:

 failed buy stop 0.10 AUDNZD.m at 1.03748 [Invalid price], т.е.маленький уровень цены (в моем случае)

 

Когда же при постановки сразу за ним же «ордера по исполнению»

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

все нормально отрабатывает (т.е. ордер ставится):

order performed buy 0.10 at 1.03747 [#2 buy 0.10 AUDNZD.m at 1.03747]

 Почему не принимается запрос по отложенному ордеру (1.03748),  т.е. при 1.03747 – ставится, а при 1.03748 – маленькое значение?

Но при offset=100: ордер отложенный BUY_STOP price = 1.03847 – уже работает


Спасибо.

Вы же сами и ответили на свой вопрос.

Есть такой параметр stoplevel -- минимально необходимое расстояние от текущей цены до цены установки отложенного ордера -- для каждого инструмента своё значение и задаётся в торговых условиях 

 
Andrey F. Zelinsky:

Вы же сами и ответили на свой вопрос.

Есть такой параметр stoplevel -- минимально необходимое расстояние от текущей цены до цены установки отложенного ордера -- для каждого инструмента своё значение и задаётся в торговых условиях 

Тогда наверняка справедлива будет запись:

price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)*point 

хотя, если вы написали "...от текущей цены", то причем тут спред? Который входит в SYMBOL_ASK (ведь SYMBOL_ASK = цена открытия+спред).

 
Vladimir Karputov:

Я прикрепил пример, который поможет Вам...

 Понятно, пример помог. Спасибо.


 Теперь такой вопрос.

При увеличении лота в какой-то момент чуть не хватает свободных средств, а открыть нужно увеличенным лотом.

То есть, войти максимальным лотом, сколько позволяет FreeMargin.

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

 

double LotA()
{
   double Lot=FirstLot;

   if(DoublingCount<=0) return Lot;
   double MaxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double MainLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(Lot<MainLot)Lot=MainLot;
     if(Lot>MaxLot)Lot=MaxLot;
   double lt1=Lot;
   HistorySelect(0,TimeCurrent());
   if(HistoryOrdersTotal()==0)return(Lot);
   double cl=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-1),ORDER_PRICE_OPEN);
   double op=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_PRICE_OPEN);

   long typeor=HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_TYPE);
   if(typeor==ORDER_TYPE_BUY)
     {
      if(op>cl)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(typeor==ORDER_TYPE_SELL)
     {
      if(cl>op)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(lt1>MaxLot)lt1=MaxLot;
   lt1=LotCheck(lt1);
   return(lt1);
  }
//+------------------------------------------------------------------+}
 
Marina Korotkih:

 Понятно, пример помог. Спасибо.


 Теперь такой вопрос.

При увеличении лота в какой-то момент чуть не хватает свободных средств, а открыть нужно увеличенным лотом.

То есть, войти максимальным лотом, сколько позволяет FreeMargin.

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

 

               

double Mgn,Lot=0,BID,ASK;

    BID=SymbolInfoDouble(_Symbol,SYMBOL_BID);
    ASK=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

   if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Марина, может быть так?

Два варианта расчета применяете - один для открытия SELL, а другой - для открытия BUY

 
Renat Akhtyamov:

                  if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

                  if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Марина, может быть так?

Не, не так.

Нужно не просто вычислить максимально возможный лот, но и проверить всё это дело на минимально допустимый, потому как может произойти ситуация, что минимальный лот 0.01, а маржа позволяет открыть только 0.009, тогда замучаете сервер запросами, которые никогда не примут, а вот меры на вас могут и принять)

 
Vitaly Muzichenko:

Не, не так.

Нужно не просто вычислить максимально возможный лот, но и проверить всё это дело на минимально допустимый, потому как может произойти ситуация, что минимальный лот 0.01, а маржа позволяет открыть только 0.009, тогда замучаете сервер запросами, которые никогда не примут, а вот меры на вас могут и принять)

Напишите полный код, как должно быть, ну и я посмотрю заодним....?

Я теперь всегда буду учиться у Вас и посматривать за Вами, чтобы ответы были в полном объеме.

Я когда то работал технадзором, не переживайте, всё будет ОК!

Вместе мы - команда!

 
Marina Korotkih:

 Понятно, пример помог. Спасибо.


 Теперь такой вопрос.

При увеличении лота в какой-то момент чуть не хватает свободных средств, а открыть нужно увеличенным лотом.

То есть, войти максимальным лотом, сколько позволяет FreeMargin.

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


Скользкой дорожкой вы идёте)).
Причина обращения: