Вопросы по программированию в МТ4

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Вопросы по программированию в МТ4

Сообщение Alexandeer » 04 дек 2016, 13:02

Помогите, пожалуйста, разобраться со временем, трелл должен треллить четко на следующий день, а он то в середине дня, то еще когда-нибудь ставит стоп, не знаю, что делать.
1440/Period() - подозреваю, что в этой штуке дело. Тут 1440 секунд при делении должно давать количество баров в данном периоде, если есть варианты по красивее, то буду рад узнать.
Код: выделить все
//+------------------------------------------------------------------+
//|                                                       SoveTT.mq4 |
//|                                                    MagistrSanich |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "MagistrSanich"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum Stop  // Режим
  {
   Tralling, // Треллинг
   NoDamage, // Безубыток
   TrallDamage,// Треллинг и безубыток
   No        // Ничего

  };

input double         Lots=1.0;// Объем лота
input int            Slip=30;// Слип
input int            Magic=0;// Магик
input int            CoundClose=5;//На какой свече закрывать

input Stop           ImagTrall=Tralling;// Режим

input int            Distance=100; //Пройденные пункты от цены открытия
input int            indent=50; // Отступ от цены открытия

                                //Глобальные переменные
double price=-1;  // Текущая цена
int Ticket= 0;
int count = 0;
datetime  timeStop=0;
int       timee=Day();
int       i=0;
double    min,stopLoss,test,dayModify=0;
//+------------------------------------------------------------------+
//|                                                                  |

int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---ACCOUNT_BALANCE

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(timeStop == Time[0]) return;
   else timeStop=Time[0];

//-----------------------------------------------------

   price=MarketInfo(_Symbol,MODE_BID);

   int b = Counter(OP_BUY);
   int s = Counter(OP_SELL);

//Открытие ордеров
   if(b==0 && s==0)
     {
      int type=(int) rand()%2;
      Ticket=OrderSend(_Symbol,type,Lots,Ask,Slip,0,0,"",Magic,0,clrBlue);
      count = 0;
     }

//Закрытие ордера
   if(Ticket)
     {
      count++;
      if(count==CoundClose)
        {
         for(i=0;i<OrdersTotal();i++)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET))
              {
               if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
                 {
                  if(!OrderClose(Ticket,Lots,price,Slip,clrGreen))
                     Print("НЕ УДАЛОСЬ ЗАКРЫТЬ ОРДЕР");
                  Ticket=0;
                 }

              }

           }
        }
     }

//Треллинг

   if(timee!=Day() && (b!=0 || s!=0)) { dayModify++; timee=Day();}
   if(b==0 && s==0) dayModify=0;

   if((ImagTrall==Tralling || ImagTrall==TrallDamage) && dayModify>=2) //dayModify - в какой денб треллить
     {
      double exs;
      if(b==1 && s==0) exs=Low[iLowest(_Symbol,Period(),MODE_LOW,1440/Period(),NULL)];
      else exs=High[iLowest(_Symbol,Period(),MODE_HIGH,1440/Period(),NULL)];
      for(i=0;i<=OrdersTotal();i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
              {
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),exs,0,0,clrYellow))
                  Print("Ошибка модификации ",TimeCurrent(),OrderType()," ",OrderOpenPrice()," exs ",exs);

              }

           }
        }
     }



//Comment(" Now time= ",time);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Counter(int type)// ФУНЦИЯ ПОДСЧЕТА ОРДЕРА, РЕАЛЬНО РАБОТАЕТ
  {
   int n=0;
   for(i=0;i<=(OrdersTotal()+1);i++)
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
            if(OrderType()==type)
               n++;
   return n;
  }
//+------------------------------------------------------------------+
Аватар пользователя
Alexandeer
 
Сообщений: 17
Зарегистрирован: 04 ноя 2016, 04:54
Средств на руках: 8.00 Доллар
Группа: Новые пользователи
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 05 дек 2016, 04:47

Нужно проверять время сервера, и сравнивать его с заданным. Если не равно, то выходить из трала.
Смотрите раздел справки дата и время.
Пример:
if(Hour()!=0 && Minute()!=0) return;
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение Alexandeer » 06 дек 2016, 04:58

Рэндом писал(а):Нужно проверять время сервера, и сравнивать его с заданным. Если не равно, то выходить из трала.
Смотрите раздел справки дата и время.
Пример:
if(Hour()!=0 && Minute()!=0) return;


А почему нельзя просто так: if((ImagTrall==Tralling || ImagTrall==TrallDamage) && Hour()==0)
Аватар пользователя
Alexandeer
 
Сообщений: 17
Зарегистрирован: 04 ноя 2016, 04:54
Средств на руках: 8.00 Доллар
Группа: Новые пользователи
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 06 дек 2016, 05:12

Так тоже можно. Я просто написал абстрактный пример.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение Alexandeer » 06 дек 2016, 05:43

Теперь открывается вовремя, но почему-то постоянно выдает ошибку при модификации селла.
Например:

EURUSD,H1: OrderModify error 130
вывод из Print: 1 Op-exs= 0.02066000000000012

первая цифра это OrderType (). единичка это sell.
Op-exs разница между ценой открытия и экстремумом (для селла High[] максимального бара).
Погуглил error 130 это ошибка со стопом, но для селла цена открытия должна быть меньше стопа, а значит эта разница всегда отрицательна.
Помогите пожалуйста разобраться.
вот код (по сравнении с предыдущем менял только то что после //трэллинг):
Код: выделить все
//+------------------------------------------------------------------+
//|                                                       SoveTT.mq4 |
//|                                                    MagistrSanich |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "MagistrSanich"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum Stop  // Режим
  {
   Tralling, // Треллинг
   NoDamage, // Безубыток
   TrallDamage,// Треллинг и безубыток
   No        // Ничего

  };

input double         Lots=1.0;// Объем лота
input int            Slip=30;// Слип
input int            Magic=0;// Магик
input int            CoundClose=5;//На какой свече закрывать

input Stop           ImagTrall=Tralling;// Режим

input int            Distance=100; //Пройденные пункты от цены открытия
input int            indent=50; // Отступ от цены открытия

                                //Глобальные переменные
double price=-1;  // Текущая цена
int Ticket= 0;
int count = 0;
datetime  timeStop=0;
int       timee=Day();
int       i=0;
double    min,stopLoss,test,dayModify=0;
//+------------------------------------------------------------------+
//|                                                                  |

int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---ACCOUNT_BALANCE

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(timeStop == Time[0]) return;
   else timeStop=Time[0];

//-----------------------------------------------------

   price=MarketInfo(_Symbol,MODE_BID);

   int b = Counter(OP_BUY);
   int s = Counter(OP_SELL);

//Открытие ордеров
   if(b==0 && s==0)
     {
      int type=(int) rand()%2;
      Ticket=OrderSend(_Symbol,type,Lots,Ask,Slip,0,0,"",Magic,0,clrBlue);
      count = 0;
     }

//Закрытие ордера
   if(Ticket)
     {
      count++;
      if(count==CoundClose)
        {
         for(i=0;i<OrdersTotal();i++)
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET))
              {
               if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
                 {
                  if(!OrderClose(Ticket,Lots,price,Slip,clrGreen))
                     Print("НЕ УДАЛОСЬ ЗАКРЫТЬ ОРДЕР");
                  Ticket=0;
                 }

              }

           }
        }
     }

//Треллинг

//if(timee!=Day() && (b!=0 || s!=0)) { dayModify++; timee=Day();}
//if(b==0 && s==0) dayModify=0;

   if((ImagTrall==Tralling || ImagTrall==TrallDamage) && Hour()==0) //dayModify - в какой денб треллить
     {
      double exs;
      if(b==1 && s==0) exs=Low[iLowest(_Symbol,Period(),MODE_LOW,1440/Period(),NULL)];
      else if (b==0 && s ==1) exs=High[iLowest(_Symbol,Period(),MODE_HIGH,1440/Period(),NULL)];
      exs = NormalizeDouble(exs,_Digits);
      for(i=0;i<=OrdersTotal();i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderMagicNumber()==Magic && OrderSymbol()==Symbol())
              {
               if(!OrderModify(OrderTicket(),OrderOpenPrice(),exs,OrderTakeProfit(),0,clrYellow))
                  Print("Ошибка модификации ",OrderType()," Op-exs= ",OrderOpenPrice()-exs);

              }

           }
        }
     }


   Comment(" Hour= ",Hour(),"  Minute=",Minute());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Counter(int type)// ФУНЦИЯ ПОДСЧЕТА ОРДЕРА, РЕАЛЬНО РАБОТАЕТ
  {
   int n=0;
   for(i=0;i<=(OrdersTotal()+1);i++)
      if(OrderSelect(i,SELECT_BY_POS)==true)
         if(OrderMagicNumber()==Magic)
            if(OrderType()==type)
               n++;
   return n;
  }
//+------------------------------------------------------------------+
Аватар пользователя
Alexandeer
 
Сообщений: 17
Зарегистрирован: 04 ноя 2016, 04:54
Средств на руках: 8.00 Доллар
Группа: Новые пользователи
Благодарил (а): 18 раз.
Поблагодарили: 0 раз.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 06 дек 2016, 05:53

iLowest(_Symbol,Period(),MODE_LOW,1440/Period(),NULL)]
NULL это специальный символ обозначающий нет значения.
В этой функции его не должно быть.
Нужен индекс бара начиная с 0.
0 бар это текущий бар истории.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 06 дек 2016, 06:25

И еще расшифровку кода ошибок можно посмотреть в справке.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение ВЯЧЕСЛАВПЕТРОВ » 26 дек 2016, 06:01

Доброго времени суток.
Решил тоже немного просветится в плане программирования.
Вопрос магик записывается на сервер брокера при открытии ордера или только в терминале.
Второй. Магик можно изменить после открытия ордера ?
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.

Re: Вопросы по программированию в МТ4

Сообщение Рэндом » 26 дек 2016, 06:06

Думаю магик записан на сервере. После перезапуска терминала он сохраняется.
Менять магик нельзя.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Вопросы по программированию в МТ4

Сообщение ВЯЧЕСЛАВПЕТРОВ » 26 дек 2016, 17:37

Можно создать в момент работы советника дополнительную глобальную переменную изменять ее в свойствах и удалять.
Читал как работать с файлами и не понял как удалять строки в текстовом файле.
Как я понял скрипт и советник могут работать на одной паре одновременно, а два советника не могут.
Аватар пользователя
ВЯЧЕСЛАВПЕТРОВ
 
Сообщений: 1522
Зарегистрирован: 06 сен 2016, 21:28
Средств на руках: 90.40 Доллар
Награды: 2
Ветеран I (1) Медаль за эрудицию (1)
Группа: Базовая
Благодарил (а): 3574 раз.
Поблагодарили: 434 раз.
Автор Вячеслав Петров. Возьму капитал или счет в управление. В лс.
Мониторинг трех счетной системы. Первый.Второй. Третий.
Четвертый.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения