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

 
toni_starkсоветник 1,5 года назад работал, сейчас не устанавливается на график.

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

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

 

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

Вопросы от начинающих 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>
//....
 
fxsaber:
Действительно) Ошибка о несоответствии исчезла и вторая вместе с ней. Спасибо.
 
Приветствую товарищи форумчане! Нужна помощь с добавлением некоторых изменений в функцию. 
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 сделки, функция сравнивала время и отправляла тру, а у меня пока сравнивает одно время.


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

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

 

Здравствуйте уважаемые ... кто подскажет почему указанный код ТрейлингСтопа для 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 

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

 

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

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:

Здравствуйте уважаемые ... кто подскажет почему указанный код ТрейлингСтопа для 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);}} 

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

 

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

OrderCloseByTicket (542534564)

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

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

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


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

OrderCloseByPos (0)

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


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

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

Здравствуйте! Неправильно сравниваются два минусовых числа q и w, когда они равны, оператор иф считает, что одно больше другого.В чем ошибка?   Когда q = -0,0002 и w тоже -0,0002, то res12=false, почему? 

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред
static bool res12=true;

start()
{   


   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
Причина обращения: