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

barudkinarseniy:
А можно из всех приудов только несколько оставить в перечислении? Чтобы при выборе в настройках параметров я видел только два например.

Можно, но надо написать своё перечисление

enum ENUM_ORDER_TYPE
{
   Buy  = ORDER_TYPE_BUY,
   Sell = ORDER_TYPE_SELL
};

input ENUM_ORDER_TYPE typeOrder; // Выбери тип ордера

Для mql4 вместо ORDER_TYPE_BUY  надо написать OP_BUY, соответственно и для Sell

Alexey Viktorov:

Можно, но надо написать своё перечисление

Для mql4 вместо ORDER_TYPE_BUY  надо написать OP_BUY, соответственно и для Sell

Все понял спасибо))
OlegKirill:

Подскажите пожалуйста как побороть ошибку

 modification of order #1506271459 buy 0.11 EURJPY at 122.824 sl: 0.000 tp: 0.000 -> sl: 0.000 tp: 122.843 failed [Invalid S/L or T/P]


Karputov Vladimir:
OlegKirill:

Подскажите пожалуйста как побороть ошибку

 modification of order #1506271459 buy 0.11 EURJPY at 122.824 sl: 0.000 tp: 0.000 -> sl: 0.000 tp: 122.843 failed [Invalid S/L or T/P]


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

double normalize(string symbol,double value)
  {
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   if(ts==0)return(value);
   return(NormalizeDouble(value/ts,0)*ts);
  }

пример использования при открытии позиции

   if(type==ORDER_TYPE_BUY)
     {
      double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      if(NormalizeDouble(normalize(_Symbol,ask),digits)!=NormalizeDouble(ask,digits))return;
      trade.Buy(volume,_Symbol,0,0,0,CommentOrder);
     }

 

пример использования при модификации 

         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            sl=NormalizeDouble(normalize(symbol,bid-sl*point),digits);
            tp=PositionGetDouble(POSITION_TP);
            //Print(__FUNCTION__,": sl = ",sl," tp = ",tp);
            if(sl>0)trade.PositionModify(tiket,sl,tp);
           }

.. 

спасибо, попробую
Насчет mql5. Почему, в отличие от mql4, TimeLocal() меняется только при новом тике / новом сдвиге графика / изменении масштаба графика, а не непрерывно? Аналогично с GetTickCount и GetMicrosecondCount. Может можно как-то сделать, чтоб "часики" TimeLocal ходили равномерно и непрерывно без "пинков" и тиков?
Dream11:

Доброго времени суток така проблема.. есть функция трелинг стопа...

   double tr=0,MATrall=0,op=0,sl=0,
   ask   = NormalizeDouble(Ask,Digits()),
   bid   = NormalizeDouble(Bid,Digits());
   tr = NormalizeDouble(TrailingStop*Point(),Digits());
   MATrall = iMA(NULL,0,13,0,MODE_SMMA,PRICE_MEDIAN,1);
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==Symbol())
           {
             if(OrderMagicNumber()==Magic)
              {
              op    = NormalizeDouble(OrderOpenPrice(),Digits());
              sl    = NormalizeDouble(OrderStopLoss(),Digits());
                 if(OrderType()==OP_BUY)
                 {
                 if((bid-op)>tr)
                 if((bid-sl)>tr)
                 if ((bid-tr)>MATrall)
                 if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(MATrall,Digits()),OrderTakeProfit(),0,clrRed)==false)
                 printf("ERROR BUY Modifi");
                 }
                  if(OrderType()==OP_SELL)
                 {
                 if((op-ask)>tr)
                 if((sl-ask)>tr || sl==0)
                 if((ask+tr)<MATrall)
                 if(OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(MATrall,Digits()),OrderTakeProfit(),0,clrRed)==false)
                 printf("ERROR SELL Modifi");
                 }
              }
           }
        }
     }

 как ее переделать чтобы тралились неограниченное кол-во ордеров а не один... 


loleg1991:
Насчет mql5. Почему, в отличие от mql4, TimeLocal() меняется только при новом тике / новом сдвиге графика / изменении масштаба графика, а не непрерывно? Аналогично с GetTickCount и GetMicrosecondCount. Может можно как-то сделать, чтоб "часики" TimeLocal ходили равномерно и непрерывно без "пинков" и тиков?
А через OnTimer() разве не получается?
Karputov Vladimir:
Dream11:

Доброго времени суток така проблема.. есть функция трелинг стопа...

 как ее переделать чтобы тралились неограниченное кол-во ордеров а не один... 


У меня вот такая, тралит все.
extern int             TrailingStep = 10;     //Шаг трейлинга
extern int             TrailingStop = 30;     //Трейлинг стоп
//+------------------------------------------------------------------+
//Трейлинг стоп
void Trailing()
{
 int err = GetLastError();
 err = 0;
 
 for(int i = OrdersTotal()-1; i>=0; i--)
 {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
  {
   if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
   {
    if(OrderType() == OP_BUY)
    {     
     if(Ask - OrderOpenPrice() > TrailingStop*Point)
     {
      if(OrderStopLoss() < Ask - (TrailingStep + TrailingStop)*Point)
      {
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask - TrailingStop*Point,Digits),OrderTakeProfit(),0,clrGreen))
       {
        err = GetLastError();
        if(err != 0) Print("Ошибка модификации ордера № ",OrderTicket()," на покупку! Код ошибки: ",err,".");
       }
      }
     }
    }
    if(OrderType() == OP_SELL)
    {
     if(OrderOpenPrice() - Bid > TrailingStop*Point)
     {
      if(OrderStopLoss() > Bid + (TrailingStep + TrailingStop)*Point)
      {
       if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid + TrailingStop*Point,Digits),OrderTakeProfit(),0,clrRed))
       {
        err = GetLastError();
        if(err != 0) Print("Ошибка модификации ордера № ",OrderTicket()," на продажу! Код ошибки: ",err,".");
       }
      }
     }
    }
   }
  }
 }
}
//+------------------------------------------------------------------+
barudkinarseniy:
У меня вот такая, тралит все.
Впринципи такая же, может вызываешь ее не в том месте !?