Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 90

toni_stark
77
toni_stark  
Здравствуйте! Подскажите пожалуйста, написал советник 1,5 года назад, работал, все нормально было. Не пользовался им все это время, сейчас не устанавливается на график. Кто знает что может быть причиной? Может из-за каких-то обновлений МТ4?
Konstantin Erin
2162
Konstantin Erin  
toni_starkсоветник 1,5 года назад работал, сейчас не устанавливается на график.

подтверждения тезиса: движение=жизнь, покой=смерть. А что пишет в журнале? это внизу правые две вкладки

если бы у меня был бы - проверил бы и исправил бы ...

fxsaber
13475
fxsaber  

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL4 MT4 MetaTrader 4

Ilya Prozumentov, 2017.06.11 13:53

Есть шаблон класса для работы с массивом.
#property strict
#include <ObjectVariables.mqh>
#include <Arrays\varQSort.mqh>
#include <Arrays\objQSort.mqh>

template<typename T1>
class ArrayList
{
   private:
      T1 array[];
      QuickSorts<T1> *qs;
      int size;
      int index;

   public:
      //прочие функции
      void QuickSort();//отсортировать массив
      //прочие функции
};
//+------------------------------------------------------------------+
//| Сортировка массива
template<typename T1>
void ArrayList::QuickSort()
{
   int idx = index;//сохранение положения индекса
   if(IsPointer(array[0])) // true - массив содержит указатели класса
      qs /*ошибка 2*/ = new ObjQSort<T1>();
   else
      qs /*ошибка 2*/ = new VarQSort<T1>();
   qs.Sort(array, 0, index);
   index = idx;
}

Для этого шаблона-класса нужно реализовать сортировку, учитывая тот факт, что массив может хранить сложные типы данных. Например:
ArrayList<PP*> *dde; // PP - класс

Можно написать разные функции для простых типов и сложных, но компилятор не понимает, что функции жёстко разграничены по типу данных и продолжает ругаться:
'<' - illegal operation use    ArrayList.mqh

Тогда я решил встроить интерфейс:

#property strict
template <typename T1>
interface QuickSorts
{
   void Sort(T1 &array[], int beg, int end);
};
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class VarQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end);
   VarQSort(){}
   ~VarQSort(){}
};
template <typename T1>
void VarQSort::Sort(T1 &array[], int beg,int end)
{
   //алгоритм функции
}
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class ObjQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end){}
   ObjQSort(){}
   ~ObjQSort(){}
};

Все части конструкция компилируются. Но если попытаться её объявить:
ArrayList<PP*> *dde; // PP - класс
то, при компиляции файла вот такие ошибки:

'QuickSorts' - template mismatch    varQSort.mqh /*ошибка 1*/
'=' - type mismatch    ArrayList.mqh /*ошибка 2*/


Что нужно исправить в коде, что бы устранить это несоответствие типов? Не понимаю, почему оно вообще возникло.

P.S.
'<' - illegal operation use    varQSort.mqh
преследует меня и в этой конструкции. А именно от неё я и хотел избавиться. Но эта ошибка мне понятна, а вот те две - нет.
template <typename T1>
class VarQSort : public QuickSorts<T1>
//....

template <typename T1>
class ObjQSort : public QuickSorts<T1>
//....
Ilya Prozumentov
304
Ilya Prozumentov  
fxsaber:
Действительно) Ошибка о несоответствии исчезла и вторая вместе с ней. Спасибо.
Arseniy Barudkin
261
Arseniy Barudkin  
Приветствую товарищи форумчане! Нужна помощь с добавлением некоторых изменений в функцию. 
enum _EventYesNo{
      YES            = 1,           //ДА
      NO             = 2            //НЕТ
      };
enum howmuch {one = 1,              //Одна
              two = 2,              //Две
              three = 3             //Три
              };

input    _EventYesNo    monday                     = 2;                 //торгуем в ПОНЕДЕЛЬНИК?
input    howmuch        mondayHM                   = 1;                 //Сколько сделок?
input    string         monday_open1               = "00:00";           //
input    string         monday_open2               = "00:00";           //
input    string         monday_open3               = "00:00";           //

input    _EventYesNo    tuesday                    = 2;                 //торгуем во ВТОРНИК?
input    howmuch        tuesdayHM                  = 1;                 //Сколько сделок?
input    string         tuesday_open1              = "00:00";           //
input    string         tuesday_open2              = "00:00";           //
input    string         tuesday_open3              = "00:00";           //

input    _EventYesNo    wednesday                  = 2;                 //торгуем в СРЕДУ?
input    howmuch        wednesdayHM                = 1;                 //Сколько сделок?
input    string         wednesday_open1            = "00:00";           //
input    string         wednesday_open2            = "00:00";           //
input    string         wednesday_open3            = "00:00";           //

input    _EventYesNo    thursday                   = 2;                 //торгуем в ЧЕТВЕРГ?
input    howmuch        thursdayHM                 = 1;                 //Сколько сделок?
input    string         thursday_open1             = "00:00";           //
input    string         thursday_open2             = "00:00";           //
input    string         thursday_open3             = "00:00";           //

input    _EventYesNo    friday                     = 2;                 //торгуем в ПЯТНИЦУ?
input    howmuch        fridayHM                   = 1;                 //Сколько сделок?
input    string         friday_open1               = "00:00";           //
input    string         friday_open2               = "00:00";           //
input    string         friday_open3               = "00:00";           //

extern int         minutes = 5;          // Время торговли(минут) bool    HOUR = true;                     // Часы Вкл (true) / Выкл (folse) //Отправляет true если по времени разрешено торговать bool isTradeTimeString() { datetime servertime = TimeCurrent(); datetime localtime = TimeLocal(); datetime time = 0; datetime hbegin = 0; datetime hend = 0; string TimeBegin = "00:00"; if(DayOfWeek() == 1){if(monday == 1){TimeBegin = monday_open1;}else{return(false);}} if(DayOfWeek() == 2){if(tuesday == 1){TimeBegin = tuesday_open1;}else{return(false);}} if(DayOfWeek() == 3){if(wednesday == 1){TimeBegin = wednesday_open1;}else{return(false);}} if(DayOfWeek() == 4){if(thursday == 1){TimeBegin = thursday_open1;}else{return(false);}} if(DayOfWeek() == 5){if(friday == 1){TimeBegin = friday_open1;}else{return(false);}} string TimeEnd = TimeToString(StrToTime(TimeBegin)+(60*minutes),TIME_MINUTES); if(servertime > localtime) {   time = servertime - localtime;   hbegin = StrToTime(TimeBegin) + time;   hend = StrToTime(TimeEnd) + time; } if(servertime < localtime) {   time = localtime - servertime;   hbegin = StrToTime(TimeBegin) - time;   hend = StrToTime(TimeEnd) - time; } if(localtime == servertime) {   hbegin = StrToTime(TimeBegin);   hend = StrToTime(TimeEnd); } datetime dtBegin, dtEnd;        // Время начала и окончания работы int      hc, he;                // Часы текущего времени и окончания работы dtBegin=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hbegin,TIME_MINUTES)); dtEnd=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hend,TIME_MINUTES)); hc = TimeHour(TimeCurrent()); he = TimeHour(dtEnd); if(dtBegin>=dtEnd) {   if(hc>=he)    dtEnd+=24*60*60;   else    dtBegin-=24*60*60; } if(HOUR==true) {   if(TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd)    return(true);   else   {    if(CountTrades()==0)     return(false);   } } return(true); }

Мне нужно чтобы, например в понедельник, если требуется открыть 2 или 3 сделки, функция сравнивала время и отправляла тру, а у меня пока сравнивает одно время.

Yaroslav Nykula
54
Yaroslav Nykula  

Здравствуйте уважаемые ... кто подскажет почему указанный код ТрейлингСтопа для BUY ордеров работает корректно ...

       if (OrderType()==OP_BUY && (Bid-8*D*Point)>OrderStopLoss()&&(Bid-8*D*Point)>OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Bid-7*Point,Digits),NormalizeDouble(OrderOpenPrice()+25*D*Point,Digits),0,0);}

... а аналогичный для SELL ордеров вообще не устанавливает SL ... 

       if (OrderType()==OP_SELL &&(Ask+8*D*Point)<OrderStopLoss()&&(Ask+8*D*Point)<OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+7*Point,Digits),NormalizeDouble(OrderOpenPrice()-25*D*Point,Digits),0,0);}

... и причина скорей всего в условии (Ask+8*D*Point)<OrderStopLoss(), если его убрать, то SL устанавливается, но ТрейлингСтоп без указанного условия работает некорректно ...  

Для ордеров BUY условие (Bid-8*D*Point)>OrderStopLoss(), при OrderStopLoss()==0 воспринимается корректно(т.е. некоторая величина > 0) ... 

... а вот для ордеров SELL  условие (Ask+8*D*Point)<OrderStopLoss(), при OrderStopLoss()==0 воспринимается НЕ корректно(т.е. некоторая величина < 0 получается) ... 

может кто подскажет, как правильно сформулировать в коде необходимое условие  (Ask+8*D*Point)<OrderStopLoss() для корректной работы ТрейлингСтопa  с ордерами SELL 

Заранее благодарю всех ответивших.

freeze77
7
freeze77  

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

void ProcessOldCandles(int limit, TickStruct &lastTick)

{

      int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);

   if (hTicksFile < 1)

      return;

      TickStruct tick;

   while (!IsStopped())

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

      if (tick.time >= Time[limit])

         break;

   }

   lastTick = tick;

   int barIndex = iBarShift(NULL, 0, tick.time);

      while (barIndex >= 0)

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

         if (!IsTickBelongToBar(tick, barIndex))

         barIndex = iBarShift(NULL, 0, tick.time);

         ProcessOneTick(barIndex, tick, lastTick);

   }

      FileClose(hTicksFile);

Yaroslav Nykula
54
Yaroslav Nykula  
Yaroslav Nykula:

Здравствуйте уважаемые ... кто подскажет почему указанный код ТрейлингСтопа для BUY ордеров работает корректно ...

... а аналогичный для SELL ордеров вообще не устанавливает SL ... 

... и причина скорей всего в условии (Ask+8*D*Point)<OrderStopLoss(), если его убрать, то SL устанавливается, но ТрейлингСтоп без указанного условия работает некорректно ...  

Для ордеров BUY условие (Bid-8*D*Point)>OrderStopLoss(), при OrderStopLoss()==0 воспринимается корректно(т.е. некоторая величина > 0) ... 

... а вот для ордеров SELL  условие (Ask+8*D*Point)<OrderStopLoss(), при OrderStopLoss()==0 воспринимается НЕ корректно(т.е. некоторая величина < 0 получается) ... 

может кто подскажет, как правильно сформулировать в коде необходимое условие  (Ask+8*D*Point)<OrderStopLoss() для корректной работы ТрейлингСтопa  с ордерами SELL 

Заранее благодарю всех ответивших.


Всем привет ... что-то уж больно низкая активность в этой ветке форума ... данная проблема решается так ... 

 if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL&&OrderLots()<=Lot*3&&(Ask+(Tral+TP)*D*Point)<OrderOpenPrice()&&((OrderStopLoss()!=0&&(Ask+Tral*D*Point)<OrderStopLoss())||OrderStopLoss()==0))
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+Tral*D*Point,Digits),NormalizeDouble(OrderOpenPrice()-Stepp*D*Point,Digits),0,0);}} 

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

danminin
1119
danminin  
Чтобы в экспорте котировок можно было выбрать, с какой и по какую дату ты хочешь закачивать.

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

danminin
1119
danminin  

ввести функцию

OrderCloseByTicket (542534564)

закрытие ордера по тикету с полной лотностью.

чтобы не нужно было указывать лоты, цену, слиппедж.

аналогично нажатию крестика по ордеру в терминале.


ввести функцию

OrderCloseByPos (0)

закрытие ордера по позиции.


и тогда не нужно будет прописывать эти громоздкие конструкции.

  for (int i=1; i<=OrdersTotal(); i++)       //Цикл по всем ордерам,..
     {                                        //отражённым в терминале
      if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий
        {                                     
         // Здесь должен выполняться ..
         // ..анализ характеристик ордеров 
        }
     }                                        //Конец тела цикла