Ваши вопросы по языку MQL4

tzvetanov1

Прохожий
Здравствуйте,
Почему я не могу установить MT4
дает мне эти сообщения. Snap1.JPGМожет кто поможет мне
 

qqmber

Почетный гражданин
Первое предположение, это вообще не МТ4, а невесть что. Где вы взяли файл с таким замысловатым названием?
 

mobidik

-----
tzvetanov1
было подобное, когда на старый слабенький ноут пробовал установить 610 билд - не встал, так и остался на 509, по каким-то параметрам не проходит установка.
 

Snaike

Местный житель
Вообщем имею в советнике вот такой код
Код:
extern string T5_1 = "Безубыток для Пирамиды"; 
extern bool   WL            = true;    // Включение, отключение безубытка ордеров. 
extern int    WLstart       = 30;      // Откуда переводим (пункты профита) 
extern int    WLlevel       = 1;       // Куда переводим (пункты профита) 
//--------------------------------------- 
extern string T5_2 = "Trailing для Пирамиды"; 
extern bool   Trailing      = true;    // Вкл. треилинга      
extern int    TrailingStop  = 30;      // Размер трала в пунктах      
extern int    TrailingStep  = 30;      // Шаг трала в пунктах 

//========================================================== 

//+------------------------------------------------------------------+ 
//| global variables                                                 | 
//+------------------------------------------------------------------+ 

double dPiramidTP = 0.0; 
double dWLstart = 0.0; 
double dWLlevel = 0.0; 
double dTrailingStop = 0.0; 
double dTrailingStep = 0.0; 

//+------------------------------------------------------------------+ 
//| expert initialization function                                   | 
//+------------------------------------------------------------------+ 

//---- проверка введенных пользователем данных 
if(WLlevel < 0) WLlevel = 0.0; 
   if(WLstart < 0) WLstart = 0.0; 
   if(TrailingStop < 0) TrailingStop = 0.0; 
   if(TrailingStep < 0) TrailingStep = 0.0; 

//---конвертация данных 

   dWLstart = WLstart; 
   InfoChangeToDigit(_Symbol, dWLstart); 
   dWLlevel = WLlevel; 
   InfoChangeToDigit(_Symbol, dWLlevel); 
   dTrailingStop = TrailingStop; 
   InfoChangeToDigit(_Symbol, dTrailingStop); 
   dTrailingStep = TrailingStep; 
   InfoChangeToDigit(_Symbol, dTrailingStep); 

//+------------------------------------------------------------------+ 
//| expert start function                                            | 
//+------------------------------------------------------------------+ 

//+------------------------------------------------------------------+  
// Трейлинг Стоп ордеров пирамиды 
void PiramidTrailing(){ 
   if(Trailing && TrailingStop > 0.0){ 
      for(int i=OrdersTotal()-1;i>=0;i--){ 
         if(OrderSelect(i,SELECT_BY_POS)){ 
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){ 
               switch(OrderType()){ 
                  case OP_BUY: 
                     double _price = OrderStopLoss();                      
                     if(_price == 0.0 || _price < OrderOpenPrice()) _price = OrderOpenPrice(); 
                     // 
                     if(Bid >= NormalizeDouble(_price+dTrailingStop,Digits)){ 
                        double _new_sl = NormalizeDouble(Bid-dTrailingStep,Digits); 
                        if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl > _price){ 
                           OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                        } 
                     }                      
                     break; 
                  case OP_SELL: 
                     _price = OrderStopLoss(); 
                     if(_price == 0.0 || _price > OrderOpenPrice()) _price = OrderOpenPrice(); 
                     // 
                     if(Ask <= NormalizeDouble(_price-dTrailingStop,Digits)){ 
                        _new_sl = NormalizeDouble(Ask+dTrailingStep,Digits); 
                        if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl < _price){ 
                           OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                        } 
                     } 
                     break; 
               } 
            } 
         } 
      } 
   } 
}  
//+------------------------------------------------------------------+  
// Установка безубытка для ордеров пирамиды 
void PiramidBE(){ 
   if(WL && WLstart > 0){ 
      for(int i=OrdersTotal()-1;i>=0;i--){ 
         if(OrderSelect(i,SELECT_BY_POS)){ 
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){ 
               switch(OrderType()){ 
                  case OP_BUY: 
                     if(OrderStopLoss()==0.0 || OrderStopLoss() < NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits)){ 
                        if(Bid >= NormalizeDouble(OrderOpenPrice()+dWLstart,Digits)){ 
                           double _new_sl = NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits); 
                           if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){    
                              OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                           } 
                        } 
                     } 
                     break; 
                  case OP_SELL: 
                     if(OrderStopLoss()==0.0 || OrderStopLoss() > NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits)){ 
                        if(Ask <= NormalizeDouble(OrderOpenPrice()-dWLstart,Digits)){ 
                           _new_sl = NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits); 
                           if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){    
                              OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                           } 
                        } 
                     } 
                     break; 
               } 
            } 
         } 
      } 
   } 
}

Мне нужно добавить в блок без убытка еще один параметр
Код:
extern int    BU_Start      = 2;       // С какова ордера ничинать выставлять без убыток
А так же в блок трейлинга этого без убытка
Код:
extern int    Trailing_Start= 2;       // С какова ордера ничинать тралить стоп лос без убытка.

Пробовал изменять строку
Код:
for(int i=OrdersTotal()-1;i>=0;i--){

вот таким образом
Код:
for(int i=OrdersTotal()-1;i>=BU_Start;i--){


так же и в трале, но данная работа проходит не коректно и срабатывает по чему то через раз
если сделать i>=2; то без убыток начинает отрабатывать со второго ордера, но если вместо 2 вставлен BU_Start в тестере работает нормально с визуалом, а в онлан режиме переодически и очнь часто глюки появляются, в основном в упор не хочет видеть что ему там выставляешь и шпарит как обычно с первого ордера.

Буду очень признателен если поможете в реализации с пояснениями, я вроде бы как пока начинающий программист и все пояснения были бы мне к стати

Спасибо.
 

AlexeyVik

Программист mql4 mql5
Вообщем имею в советнике вот такой код
Код:
extern string T5_1 = "Безубыток для Пирамиды"; 
extern bool   WL            = true;    // Включение, отключение безубытка ордеров. 
extern int    WLstart       = 30;      // Откуда переводим (пункты профита) 
extern int    WLlevel       = 1;       // Куда переводим (пункты профита) 
//--------------------------------------- 
extern string T5_2 = "Trailing для Пирамиды"; 
extern bool   Trailing      = true;    // Вкл. треилинга      
extern int    TrailingStop  = 30;      // Размер трала в пунктах      
extern int    TrailingStep  = 30;      // Шаг трала в пунктах 

//========================================================== 

//+------------------------------------------------------------------+ 
//| global variables                                                 | 
//+------------------------------------------------------------------+ 

double dPiramidTP = 0.0; 
double dWLstart = 0.0; 
double dWLlevel = 0.0; 
double dTrailingStop = 0.0; 
double dTrailingStep = 0.0; 

//+------------------------------------------------------------------+ 
//| expert initialization function                                   | 
//+------------------------------------------------------------------+ 

//---- проверка введенных пользователем данных 
if(WLlevel < 0) WLlevel = 0.0; 
   if(WLstart < 0) WLstart = 0.0; 
   if(TrailingStop < 0) TrailingStop = 0.0; 
   if(TrailingStep < 0) TrailingStep = 0.0; 

//---конвертация данных 

   dWLstart = WLstart; 
   InfoChangeToDigit(_Symbol, dWLstart); 
   dWLlevel = WLlevel; 
   InfoChangeToDigit(_Symbol, dWLlevel); 
   dTrailingStop = TrailingStop; 
   InfoChangeToDigit(_Symbol, dTrailingStop); 
   dTrailingStep = TrailingStep; 
   InfoChangeToDigit(_Symbol, dTrailingStep); 

//+------------------------------------------------------------------+ 
//| expert start function                                            | 
//+------------------------------------------------------------------+ 

//+------------------------------------------------------------------+  
// Трейлинг Стоп ордеров пирамиды 
void PiramidTrailing(){ 
   if(Trailing && TrailingStop > 0.0){ 
      for(int i=OrdersTotal()-1;i>=0;i--){ 
         if(OrderSelect(i,SELECT_BY_POS)){ 
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){ 
               switch(OrderType()){ 
                  case OP_BUY: 
                     double _price = OrderStopLoss();                      
                     if(_price == 0.0 || _price < OrderOpenPrice()) _price = OrderOpenPrice(); 
                     // 
                     if(Bid >= NormalizeDouble(_price+dTrailingStop,Digits)){ 
                        double _new_sl = NormalizeDouble(Bid-dTrailingStep,Digits); 
                        if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl > _price){ 
                           OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                        } 
                     }                      
                     break; 
                  case OP_SELL: 
                     _price = OrderStopLoss(); 
                     if(_price == 0.0 || _price > OrderOpenPrice()) _price = OrderOpenPrice(); 
                     // 
                     if(Ask <= NormalizeDouble(_price-dTrailingStop,Digits)){ 
                        _new_sl = NormalizeDouble(Ask+dTrailingStep,Digits); 
                        if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0 && _new_sl < _price){ 
                           OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                        } 
                     } 
                     break; 
               } 
            } 
         } 
      } 
   } 
}  
//+------------------------------------------------------------------+  
// Установка безубытка для ордеров пирамиды 
void PiramidBE(){ 
   if(WL && WLstart > 0){ 
      for(int i=OrdersTotal()-1;i>=0;i--){ 
         if(OrderSelect(i,SELECT_BY_POS)){ 
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicPiramid){ 
               switch(OrderType()){ 
                  case OP_BUY: 
                     if(OrderStopLoss()==0.0 || OrderStopLoss() < NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits)){ 
                        if(Bid >= NormalizeDouble(OrderOpenPrice()+dWLstart,Digits)){ 
                           double _new_sl = NormalizeDouble(OrderOpenPrice()+dWLlevel,Digits); 
                           if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){    
                              OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                           } 
                        } 
                     } 
                     break; 
                  case OP_SELL: 
                     if(OrderStopLoss()==0.0 || OrderStopLoss() > NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits)){ 
                        if(Ask <= NormalizeDouble(OrderOpenPrice()-dWLstart,Digits)){ 
                           _new_sl = NormalizeDouble(OrderOpenPrice()-dWLlevel,Digits); 
                           if(NormalizeDouble(OrderStopLoss()-_new_sl,Digits)!=0.0){    
                              OrderModify(OrderTicket(),OrderOpenPrice(),_new_sl,OrderTakeProfit(),OrderExpiration()); 
                           } 
                        } 
                     } 
                     break; 
               } 
            } 
         } 
      } 
   } 
}

Мне нужно добавить в блок без убытка еще один параметр
Код:
extern int    BU_Start      = 2;       // С какова ордера ничинать выставлять без убыток
А так же в блок трейлинга этого без убытка
Код:
extern int    Trailing_Start= 2;       // С какова ордера ничинать тралить стоп лос без убытка.
Пробовал изменять строку
Код:
for(int i=OrdersTotal()-1;i>=0;i--){
вот таким образом
Код:
for(int i=OrdersTotal()-1;i>=BU_Start;i--){
так же и в трале, но данная работа проходит не коректно и срабатывает по чему то через раз
если сделать i>=2; то без убыток начинает отрабатывать со второго ордера, но если вместо 2 вставлен BU_Start в тестере работает нормально с визуалом, а в онлан режиме переодически и очнь часто глюки появляются, в основном в упор не хочет видеть что ему там выставляешь и шпарит как обычно с первого ордера.

Буду очень признателен если поможете в реализации с пояснениями, я вроде бы как пока начинающий программист и все пояснения были бы мне к стати

Спасибо.
Сначала надо разобраться какой ордер первый, а какой второй.
В списке OrdersTotal() ордера как-то отсортированы, но как никто толком не знает. Поэтому каждый по своему определяет первый и последний ордер как в рынке так и в истории.
На днях была дискуссия по сортировке ордеров истории на форуме mql4 и Ренат сказал, что не помнит как сделано и надо смотреть код, а потом так и не ответил. Видимо забыл.
Так-что вот определи первый ордер и при переборе в цикле встретив его тикет команда continue;
 

sig72

Интересующийся
Подскажите функцию торговли по времени чтобы в настройках начала и конца торговли были день недели и время в часах.
 

_SERG_

Активный участник
Сначала надо разобраться какой ордер первый, а какой второй.
В списке OrdersTotal() ордера как-то отсортированы, но как никто толком не знает. Поэтому каждый по своему определяет первый и последний ордер как в рынке так и в истории.
На днях была дискуссия по сортировке ордеров истории на форуме mql4 и Ренат сказал, что не помнит как сделано и надо смотреть код, а потом так и не ответил. Видимо забыл.
Так-что вот определи первый ордер и при переборе в цикле встретив его тикет команда continue;


В МТ4 по умолчанию, без сортировок, рыночные ордера упорядочены по времени открытия, а история, кажется, по времени закрытия ордера.
Но на этом можно не заморачиваться, если отписать процедуру(ы) сортировки по нужному параметру ордера.
 
Последнее редактирование:

Ugar

Гуру форума
В МТ4 по умолчанию, без сортировок, рыночные ордера упорядочены по времени открытия, а история, кажется, по времени закрытия ордера.
Я то же так думал сначала, пока не проверил с перезапуском терминала.
Но на этом можно не заморачиваться, если отписать процедуру(ы) сортировки по нужному параметру ордера.
Всегда надо сортировать в ситуациях когда имеет значение порядок. Тогда гарантировано будет известно в каком порядке ордера.

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

AlexeyVik

Программист mql4 mql5
В МТ4 по умолчанию, без сортировок, рыночные ордера упорядочены по времени открытия, а история, кажется, по времени закрытия ордера.
Но на этом можно не заморачиваться, если отписать процедуру(ы) сортировки по нужному параметру ордера.
Вот с этого поста начался диалог о котором я говорил. _http://forum.mql4.com/ru/60554/page98#925738
Можешь напомнить Ренату о его обещании.
 

_SERG_

Активный участник
Я то же так думал сначала, пока не проверил с перезапуском терминала.

Всегда надо сортировать в ситуациях когда имеет значение порядок. Тогда гарантировано будет известно в каком порядке ордера.

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

Яж не в интерфейсе терминала смотрю, я выводы по OrderSelect(i,...); делаю, по индексу.
 

gince

Местный знаток
Здрасте
Кто может написатть пример кода или дать сылку на выставление виртуальных лимиток и стоповых, когда выставляется по кокому то индикатору iCustom(NULL,0,"xxx",...,0,1).
Максимальное число одноврененно выставленых отложек count=5. При приходе сигнала на выставление шестой отложки - первая удаляется. Первая покупочная отложка удаляет все выставленые отложки на продажу и на оборот.
 

Ugar

Гуру форума
Яж не в интерфейсе терминала смотрю, я выводы по OrderSelect(i,...); делаю, по индексу.
Я именно про программный доступ к ордерам.
Так вот, проверено на старом билде.
Ордера из списка MODE_TRADES располагаются по мере открытия в порядке по времени открытия, после перезапуска терминала в порядке тикетов.
Ордера из списка MODE_HISTORY располагаются по мере закрытия в порядке по времени закрытия, после перезапуска терминала в порядке тикетов.
Как в новом билде не знаю, не проверял. Возможно этот дурдом остался, а могли и поменять.
 

abuuuuuu

Местный знаток
правильно ли я сделал ? советник должен открывать селл если в 1:00 свеча бычья
, в 2:00 свеча бычья или медвежья , в 3:00 свеча бычья и на бай наоборот

Код:
void OnTick()
  {
    {
     if (Hour() == 1 && Open[1] >  Close[1])
     if (Hour() == 2 && (Open[1] <= Close[1] || Open[1] >= Close[1]))
     if (Hour() == 3  && Open[1] >  Close[1])
     OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, slforsell, 0, "Надеюсь прыбль", MagicNumber, 0, clrNONE);
    }
    {
     if (Hour() == 1 && Open[1] <  Close[1])
     if (Hour() == 2 && (Open[1] <= Close[1] || Open[1] >= Close[1]))
     if (Hour() == 3  && Open[1] <  Close[1])
     OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, slforbuy, 0, "Надеюсь прыбль", MagicNumber, 0, clrNONE);
    }   
  }
//+------------------------------------------------------------------+
 

mobidik

-----
Может я и не прав, пока учусь, но, результат должен быть на "первой секунде", тике четвертого часа, тогда для третьего часа будет первый бар, для второго часа - второй бар (не понятно зачем его определять, когда её значение не имеет разницы, что свеча бычья или медвежья), для первого часа - третий бар.
 

_SERG_

Активный участник
Я именно про программный доступ к ордерам.
Так вот, проверено на старом билде.
Ордера из списка MODE_TRADES располагаются по мере открытия в порядке по времени открытия, после перезапуска терминала в порядке тикетов.
Ордера из списка MODE_HISTORY располагаются по мере закрытия в порядке по времени закрытия, после перезапуска терминала в порядке тикетов.
Как в новом билде не знаю, не проверял. Возможно этот дурдом остался, а могли и поменять.

Если сам сортируешь ордера перед их использованием, то не критично, как оставили разработчики.
 

abuuuuuu

Местный знаток
Может я и не прав, пока учусь, но, результат должен быть на "первой секунде", тике четвертого часа, тогда для третьего часа будет первый бар, для второго часа - второй бар (не понятно зачем его определять, когда её значение не имеет разницы, что свеча бычья или медвежья), для первого часа - третий бар.

а что я делю неправильно ? в тестере такую ошибку выдает что делать ?
 

Вложения

  • Безымянный.png
    Безымянный.png
    14,1 КБ · Просмотры: 26

Ugar

Гуру форума
Судя по картинке, пытаешься открывать ордера сразу по нескольким парам?
Если так, то не получится. Тестер умеет выполнять приказы только по той паре которая в нём задана.
 
Верх