Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 574

 
Galim_V:

     Задача - найти бар с минимальным закрытием

 for(int x=0; x<=xBars -1; x++) 

    { 

     counter++;

//     Print(Close[x],",,,",counter); 

     int h = ArrayMinimum(Close[x]);

       if(counter > 20) break;

    }

   Компилятор ругается на Close

Запишите цены закрытия в отдельный массив, а потом вне цыкла   АррауМинимум
 
Alekseu Fedotov:
Запишите цены закрытия в отдельный массив, а потом вне цыкла   АррауМинимум
   Благодарю!
 
Galim_V:

     Задача - найти бар с минимальным закрытием

есть функции iHighest и iLowest (теперь и в МТ5)

 
Taras Slobodyanik:

есть функции iHighest и iLowest (теперь и в МТ5)

  Спасибо!
 
Galim_V:

     Задача - найти бар с минимальным закрытием

 for(int x=0; x<=xBars -1; x++) 

    { 

     counter++;

//     Print(Close[x],",,,",counter); 

     int h = ArrayMinimum(Close[x]);

       if(counter > 20) break;

    }

   Компилятор ругается на Close

Задача поиска минимальной/максимальной цены в MQL4 решается одной строкой:

double fMinClose = iClose(NULL, 0, iLowest(NULL, 0, MODE_CLOSE, <сколько баров>, <начинать с бара>));
 
Taras Slobodyanik:

можно, но это будет не совсем таймер

Спасибо.

Как рассчитывать объём лота с шагом? Если депозит =1000, лот =0.1, депозит стал 2000 лот = 0.2. То есть, при депо 1500 или 1700, лот не увеличивается.

 
PolarSeaman:

Спасибо.

Как рассчитывать объём лота с шагом? Если депозит =1000, лот =0.1, депозит стал 2000 лот = 0.2. То есть, при депо 1500 или 1700, лот не увеличивается.

double percentLot = 0.01,
       lot = NormalizeDouble(MathFloor(AccountInfoDouble(ACCOUNT_BALANCE)*percentLot/10)/10, 1);

Как-то так...

 
Konstantin Nikitin:

Как-то так...

Не-ет, при депо 1100, лот будет 0.11, а мне нужно чтобы до 2000 лот не увеличивался. В настройках как задам шаг =1000?

 
Добрый день скажите пожайлусто можно ли в индекатор добавить координаты мышке если можно на пишите мне на почту кто может это сделать ereminmikola@yandex.ru
 

Здравствуйте программисты. Не могли бы вы подсказать как правильно подступится к следующему условию:

1. Советник открывает 2 рыночных ордера ( buy и sell) одинаковым лотом, указанным в настройках. - Пункт выполняется без замечаний

На следующем возникла проблема, цена может двигаться как и в сторону SELL так и в сторону BUY. Каким образом можно организовать код, чтобы при прохождении n кол-во пунктов, советник сканировать в LIVE прибыльность этих двух сделок и закрыл именно тот ордер у которого после прохождения n кол-ва пунктов оказался отрицательный баланс? Если у вас есть другие идеи как сделать это красиво, подскажите пожалуйста.

Предоставляю код - draft, выполняется только первый пункт, открываются 2 сделки с TP и SL 

2. При прохождении цены заданное в настройках количество пунктов закрывается ордер с минусовым балансом и открываются еще 2 ордера ( buy и sell) одинаковым лотом,

 указанным в настройках и у всех ордеров выставляются стопы на цене открытия первого ордера, то есть, при развороте тренда все 3 ордера должны закрыться одновременно.


extern int    _ms = 1000;  
extern double _lots = 0.01;
extern double _TP = 80;
extern double _SL = 35;

int _mn;
double pt;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  { 
   pt = Point;
   if (Digits==3||Digits==5) {pt*=10;} else pt = Point;
   _mn = MagicNumberGenerator(_ms);
   Print("The magic number is ",_mn);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if (IsNewCandle())
    {
      if (TotalOpenOrders(_mn)==0)
      {
        EnterTrade(OP_BUY);
        EnterTrade(OP_SELL);
      }
    }   
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|   Открытие первых позиций                                        |
//+------------------------------------------------------------------+
void EnterTrade(int type)
{
   double price = 0; double sl = 0; double tp = 0; double lot = _lots;
   
   if      (type == OP_BUY)  price = Ask;
   else if (type == OP_SELL) price = Bid;
   
   int err = 0;
   int ticket = OrderSend(_Symbol, type, lot, price, 30, 0, 0, NULL, _mn, 0, clrGreen);
   if (ticket == -1)
   {
     err = GetLastError();
     Print("Could not place the order due to error ",err," ",ErrorDescription(err));
     if (err == ERR_TRADE_NOT_ALLOWED) Alert("You need to enable you autotrade button");
   }
   else 
   {
     if(!OrderSelect(ticket,SELECT_BY_TICKET))
     {
       err = GetLastError();
       Print("Could not select the order due to error ",err," ",ErrorDescription(err));
     }
     else 
     {
       if (OrderType()==OP_SELL)
       {
         sl = OrderOpenPrice()+(_SL*pt);
         if (_SL==0) sl = 0; 
         tp = OrderOpenPrice()-(_TP*pt);
       }  
       else if (OrderType()==OP_BUY)
       {
         sl = OrderOpenPrice()-(_SL*pt);
         if (_SL==0) sl = 0; 
         tp = OrderOpenPrice()+(_TP*pt);
       }
       if(!OrderModify(ticket, OrderOpenPrice(), sl, tp, 0, clrNONE))
       err = GetLastError();
       Print("Could not modify the order due to error ",err," ",ErrorDescription(err));
     }
   }
}
Причина обращения: