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

 
teetrinker:

Должен ли Myexpert.Time(10)  вернуть время десятого бара на графике? И как написать корректно?

Спасибо

По идее да, должен...

Метод Time , согласно Документации, получает значение элемента таймсерии Time по указанному индексу. Причём это метод класса CExpertBase, который, в свою очередь, является базовым классом для класса CExpert и всех вспомогательных классов торговых стратегий.

Уважаемый sergeev Вам правильно подсказывает... лучше всего воспользоваться Отладчиком, чтобы определить роль метода Time() в жизни Вашего советника...

 

Спасибо,Yedelkin !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  

 

А  EnumToString(timeframe), классная функция!!    А Я БАРАН!!!!!!

 
Скажите пожалуста, вот имеется функция 
 bool  PositionModify( ulong  PositionTicket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
      {  MqlTradeRequest request  = {0};
         MqlTradeResult result = {0};
        request.action= TRADE_ACTION_SLTP; 
        request.order= PositionTicket; 
        request.price= price;
        request.symbol= Symbol();
        request.sl= stoploss;
        request.tp= takeprofit;
        return (OrderSend( request,   result    ));   
      }

В функции па всей видимости имеется ,,бок,,- request.symbol= Symbol();      Почему здесь Symbol()?? Сюда должен перелаватся символ тот для котрого выставляем ТП и СЛ. Так вот,  можно ли просто    убрать строку   request.symbol= Symbol();   ,   типо она тупо ни нада? 

 

 

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

  В коде сразу устанавливаю оба ордера:

        
 // основной ордер +++++++++++++++++++++++++++++++++++++++      
        {
         request.action = TRADE_ACTION_PENDING;
         request.magic=magic_number;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = NormalizeDouble(volume()/1,2);
         request.price=NormalizeDouble(Ask+StopLevel*_Point,_Digits);
         request.sl = NormalizeDouble(request.price - SL*_Point,_Digits);
         request.tp = NormalizeDouble(request.price + TP*_Point,_Digits);
         request.deviation=0;
         request.type=ORDER_TYPE_BUY_STOP;
         request.type_filling=ORDER_FILLING_FOK;
         
           {
            OrderSend(request,result);
            if(result.retcode==10009 || result.retcode==10008)
               Print("Установлен ордер BuyStop");
            else
              {
               Print(ResultRetcodeDescription(result.retcode));
                           
              }
           }      
 // переворотный ордер +++++++++++++++++++++++++++++++++++++++
        
         request.action = TRADE_ACTION_PENDING;
         request.magic=magic_number1;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = NormalizeDouble(volume()/2,2);
         request.price=NormalizeDouble(Bid-(SL-45) *_Point,_Digits);
         request.sl = NormalizeDouble(request.price + SL*_Point,_Digits);
         request.tp = NormalizeDouble(request.price - (TP-900)*_Point,_Digits);
         request.deviation=0;
         request.type=ORDER_TYPE_SELL_STOP;
         request.type_filling=ORDER_FILLING_FOK;
         
           {
            OrderSend(request,result);
            if(result.retcode==10009 || result.retcode==10008)
               Print("Установлен ордер SellStop");
            else
              {
               Print(ResultRetcodeDescription(result.retcode));
               return;
              }
           }        
       } } 
}

 Основной ордер открывается и закрывается по ТП а переворотный висит. Если бы основной закрылся по стопу проблем бы не возникало )). Какую функцию лучше использовать для закрытия? 

Перебрать отложники и удалить таким образом?:

      {
         request.action = TRADE_ACTION_REMOVE;
         request.magic=magic_number1;                  // ORDER_MAGIC
         request.symbol = "EURUSD";
         request.volume = 0;
         request.price=0;
         request.sl = 0;
         request.tp =0;
         request.deviation=0;
         request.type=0;
         request.type_filling=0;
         
           {
            OrderSend(request,result);
Или можно как-то попроще?

 


	          
 
Crucian: Основной ордер открывается и закрывается по ТП а переворотный висит. Если бы основной закрылся по стопу проблем бы не возникало )). Какую функцию лучше использовать для закрытия? Перебрать отложники и удалить таким образом? Или можно как-то попроще?

Получается, что вопрос сводится к тому, каким именно образом удалить отложенный ордер, не являющийся SL- или ТР-ордером, при наступлении определённых событий (в частности, при срабатывании ТР-ордера у открытой позиции).

На данный момент удалить такой отложенный ордер можно только  принудительно с помощью отправки соответствующего запроса "Delete Pending Order". Т.е. приходится отслеживать на стороне терминала наступление соответствующих событий и отправлять запрос. Но, в отличие от Вашего варианта, в запросе требуется указание всего двух полей, одно из которых - request.order.

В указанной Вами ситуации могли бы помочь OCO-ордера ("One Cansels Other(s)" - "один отменяет другой"): на уровне ТР был бы выставлен отложенный ордер, объём которого равен объёму открытой позиции, на уровне SL был бы выставлен отложенный ордер с объёмом, необходимым по замыслу автора для "переворота" позиции. При срабатывании одного из этих OCO-ордеров второй удалялся бы автоматически на стороне сервера. Однако, на протяжении всего времени существования этого форума, разработчики платформы категорически не соглашаются вводить какие-либо дополнительные виды ордеров, в том числе и OCO-ордера.

 
Yedelkin:

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

А зачем их вводить, если это можно реализовать программно?
 
A100: А зачем их вводить, если это можно реализовать программно?
Попробуйте набрать в поиске форума слово 'OCO' на латинице и кириллице и почитайте.
 
Yedelkin:
Попробуйте набрать в поиске форума слово 'OCO' на латинице и кириллице и почитайте.
ОСО это не самостоятельный ордер и вводить его - нет необходимости
 
A100: ОСО это не самостоятельный ордер и вводить его - нет необходимости
Понятно. Т.е. Вы ничего не прочитали. Но готовы поделиться своим мнением. ОК, Ваше мнение принято: Вам этот тип ордеров не нужен.
 
Yedelkin:
Вам этот тип ордеров не нужен.
В некоторых платформах есть возможность привязки 1 (иногда 2-х) ОСО ордеров. В МТ4/5 я программно реализую цепочку связанных ордеров (иногда достаточно сложную) и считаю это более удобным вариантом
Причина обращения: