Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 831

 
tsd Tsepkov:

Я про имя фамилию, написано что надо исправить имя на реальное, а сделать это не получается

Да, если у Вас статус "Продавец", то Вы не можете редактировать свои данные:

Попробуйте напишите заявку в сервисдеск с пояснениями.

 
Vladimir Karputov:

Да, если у Вас статус "Продавец", то Вы не можете редактировать свои данные:

Попробуйте напишите заявку в сервисдеск с пояснениями.

В том и дело что нет, чтобы им стать, надо отредактировать. Замкнутый круг...

Ваша заявка на регистрацию в качестве Продавца отклонена модератором.

Пожалуйста, исправьте предоставленные вами данные.

 
tsd Tsepkov:

***

Пожалуйста, исправьте предоставленные вами данные.

Возможно причина в этом? Фотки кривые или тёмные или выполнены не по требованиям ...

 
tsd Tsepkov:

В том и дело что нет, чтобы им стать, надо отредактировать. Замкнутый круг...

Ваша заявка на регистрацию в качестве Продавца отклонена модератором.

Пожалуйста, исправьте предоставленные вами данные.

Ну так и напишите о проблеме в сервисдеск. Это продуктивнее, чем в рельсу стучать на форуме ;)
 
VHS:

Подскажите, пожалуйста, как при программировании на MQL5 использовать метод    void  Ignore(long value)  { m_ignore=value;          } стандартного класса CExpertSignal в пользовательском классе Трейлинга? Как к нему получить доступ?

У меня пользовательский класс сигналов дает методы открытия и закрытия позиций. Но в трейлинге я хотел вести сопровождение позиции по другому методу. Если просто отдельно написать пользовательские классы MySignal и MyTrailing, то закрытие позиции происходит по тому условию, которое сработало первым. Если условия Trailing сработало раньше, то все хорошо. Но иногда поступает новый (реверсный) сигнал от MySignal и позиция переворачивается, а мне после открытия нужно, чтобы она сопровождалась именно трейлингом, не закрывалась и новая не открывалась. Я посмотрел базовые классы и есть ощущение, что за это отвечает m_ignore из базового класса сигналов. Если ему присвоить значение 1 в соответствующем фильтре, то видимо будет работать как надо. Я добавил в класс эксперта в OnInit filter0.Ignore(0). Но я новичок в ООП и никак не пойму, как в классе MyTrailing, который не наследуется от класса CExpertSignal, а является его "кузеном"? поменять это значение (условно так filter0.Ignore(1) ). Подскажите, пожалуйста, как это сделать.

Собственно говоря, более общий вопрос: как передавать информацию между двумя классами, не являющимися наследниками? Как передать информацию из класса трейлинга в класс сигналов? Наверное можно создать глобальную переменную и общаться через нее. Но это выглядит совсем извращенно относительно логики защищенных членов в ООП.


Помогите пожалуйста кто-нибудь! Уже попробовал отойти от встроенного Ignore (что, конечно само по себе не хорошо, люди его старались включали в базовый код) и все-равно никак состыковать не могу. Третьи сутки мучаюсь изобретаю (учебника-то нет).

Уже даже коды классов подправил: ввел в классе MySignal защищенный булевый член (m_permition) и метод Set к нему создал, в лонгкондишн и шоткондишн заправил return(0) если !m_permition. В MyTrailing тоже создал защищенный булевый член m_signal_permition, к нему создал методы Get и Set, научил ЧекТрейлинги им управлять    if(position==NULL) {m_signal_permition = true; return(false);} else m_signal_permition = false;

Не понимаю только одного, где и как мне их свести. Пробовал просто в OnTick на них ссылаться, не проходит.

Прочитал статью Владимира "Как научить ...". Вроде бы идея создания в пользовательском сигнале экземпляр еще одного сигнала и через него общаться понятная, но где-то у меня до конца не стыкуется: классы сигнала и трейлинга не наследуются друг от друга.

Помогите, люди добрые, кто чем может.

 

Здравствуйте коллеги. В котировках МТ5 помимо цены защиты некоторые данные, типа исторического спреда и проскальзывания(который по умолчанию везде одинаков и составляет 10 пятизначных пунктов).

Делая такой запрос после открытия позиции:

Print("Expert name: ",__FILE__,", Открыта поза Sell с магиком №: ",IntegerToString(m_trade.RequestMagic()),", Cпред ",SymbolInfoInteger(_Symbol,SYMBOL_SPREAD),
", Deviation ",IntegerToString(m_trade.RequestDeviation()));

Получаем такой ответ:

Правильно ли я понимаю, что тестер МТ5 считает как спред так и проскальзывание вместе, ровно как в МТ4 я бы выставил вручную спред 13 пунктов, для конкретного примера в скриншоте.

 

Здравствуйте помогите пожалуйста кто нибудь ,как привязать советник мт5  к конкретному номеру счета ?

 
denis basuk:

Здравствуйте помогите пожалуйста кто нибудь ,как привязать советник мт5  к конкретному номеру счета ?

Нужно проверять номер счёта. Делать это нужно в OnInit() и в OnTick(). Пример: 

 

Здравствуйте, пробую перенести индикаторы из MT4 в MT5. Есть простой индикатор, который отображает время до следующего бара. В индикаторе используется OnTimer. Обновление в OnTimer происходит через функцию void refreshClock(). Правильно ли использовать такую конструкцию для других индикаторов, требующих использование OnTimer? Или можно оптимизировать процесс обращения к OnTimer?

#property description "Time"
#property indicator_chart_window
#property indicator_plots   0

                                    
                                                                                             
input int Offset_Minutes = 60;                                                                                                         
input int Font__Size = 10;                                   
input color  Font_Color = clrWhite;                         
input color  Font_No_Bar_Color = clrRed;                        
input ENUM_BASE_CORNER  Corner = CORNER_RIGHT_UPPER;        
input int Time_X = 140;                                          
input int Time_Y = 0;                                            


#define Clock_Name "Тimer"
int selectTime;
int diff;
int offsetHour;

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+

int  OnInit()
{   
   EventSetMillisecondTimer(1000); 
   return(0); 
}

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+

void OnDeinit(const int reason) 
{ 
   if(reason==REASON_REMOVE      || 
      reason==REASON_CHARTCHANGE || 
      reason==REASON_RECOMPILE   || 
      reason==REASON_CHARTCLOSE  || 
      reason==REASON_CLOSE       || 
      reason==REASON_PARAMETERS)    
   { 
     ObjectDelete(0, "Тimer");
     EventKillTimer(); 
   }
  ChartRedraw();
}

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+

void OnTimer( )                 
{ 
   refreshClock();  
}

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+

int  OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
   refreshClock();
   return(rates_total);
}
void refreshClock()
{
   static bool inRefresh = false;
           if (inRefresh) return;
               inRefresh = true;
                              ShowClock(); ChartRedraw();
               inRefresh=false;
}

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+

void ShowClock()
{
   int periodMinutes     = periodToMinutes(Period());
   int currentTime       = (int)TimeCurrent();
   int localTime         = (int)TimeLocal();
   int barTime           = (int)iTime();
   
   diff = (int)MathMax(round((currentTime-localTime)/60.0)*60,-24*3600);
   offsetHour = (int)-Offset_Minutes*60; // сдвиг в минутах
   
   
   int currentTimeReal   = localTime+offsetHour;
   int sel_localTime     = localTime+diff;
   selectTime = sel_localTime;
   
     
      color  theColor;
      string time = getTime(barTime+periodMinutes*60-selectTime,theColor);
      int times = barTime+periodMinutes*60-selectTime;
      if(times < -60 || TerminalInfoInteger(TERMINAL_CONNECTED) == false || 
      currentTimeReal-currentTime > 60 || currentTime-currentTimeReal > 60)
      time = "Time Off";
             
   if(ObjectFind(0, Clock_Name) < 0)   
   ObjectCreate(0, Clock_Name, OBJ_LABEL, 0, 0, 0);
   ObjectSetString(0, Clock_Name, OBJPROP_TEXT, "Time: " + time);
   ObjectSetString(0, Clock_Name, OBJPROP_FONT, "Verdana");
   ObjectSetInteger(0, Clock_Name, OBJPROP_FONTSIZE, Font__Size);
   ObjectSetInteger(0, Clock_Name, OBJPROP_COLOR, theColor);
        ObjectSetInteger(0, Clock_Name, OBJPROP_CORNER, Corner);
        ObjectSetInteger(0, Clock_Name, OBJPROP_XDISTANCE, Time_X);
   ObjectSetInteger(0, Clock_Name, OBJPROP_YDISTANCE, Time_Y);
      
}

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+

string getTime(int times, color& theColor)
{
   string stime = "";
   int    seconds;
   int    minutes;
   int    hours;
   int currentTime       = (int)TimeCurrent();
   int localTime         = (int)TimeLocal();
   
   
   offsetHour = (int)-Offset_Minutes*60;
   
   int currentTimeReal   = localTime+offsetHour;
  
   if (times < 0 || TerminalInfoInteger(TERMINAL_CONNECTED) == false || 
   currentTimeReal-currentTime > 60 || currentTime-currentTimeReal > 60) {
         theColor = Font_No_Bar_Color; times = (int)fabs(times); }
   else  theColor = Font_Color;
   
   seconds = (times%60);
   hours   = (times-times%3600)/3600;
   minutes = (times-seconds)/60-hours*60;

   if (hours>0)
   if (minutes < 10)
         stime = stime+(string)hours+":0";
   else  stime = stime+(string)hours+":";
         stime = stime+(string)minutes;
   if (seconds < 10)
         stime = stime+":0"+(string)seconds;
   else  stime = stime+":" +(string)seconds;
   return(stime);
}

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+
  
datetime iTime(ENUM_TIMEFRAMES forPeriod=PERIOD_CURRENT)
{
   datetime times[]; if (CopyTime(Symbol(),forPeriod,0,1,times)<=0) return(TimeLocal());
   return(times[0]);
}

//+------------------------------------------------------------------+  
  
//+------------------------------------------------------------------+

int periodToMinutes(int period)
{
   int i;
   static int _per[]={1,2,3,4,5,6,10,12,15,20,30,0x4001,0x4002,0x4003,0x4004,0x4006,0x4008,0x400c,0x4018,0x8001,0xc001};
   static int _min[]={1,2,3,4,5,6,10,12,15,20,30,60,120,180,240,360,480,720,1440,10080,43200};

   if (period==PERIOD_CURRENT)
       period = Period();  
            for(i=0;i<20;i++) if(period==_per[i]) break;
   return(_min[i]);  
}
 
VHS:

Помогите пожалуйста кто-нибудь! Уже попробовал отойти от встроенного Ignore (что, конечно само по себе не хорошо, люди его старались включали в базовый код) и все-равно никак состыковать не могу. Третьи сутки мучаюсь изобретаю (учебника-то нет).

Уже даже коды классов подправил: ввел в классе MySignal защищенный булевый член (m_permition) и метод Set к нему создал, в лонгкондишн и шоткондишн заправил return(0) если !m_permition. В MyTrailing тоже создал защищенный булевый член m_signal_permition, к нему создал методы Get и Set, научил ЧекТрейлинги им управлять    if(position==NULL) {m_signal_permition = true; return(false);} else m_signal_permition = false;

Не понимаю только одного, где и как мне их свести. Пробовал просто в OnTick на них ссылаться, не проходит.

Прочитал статью Владимира "Как научить ...". Вроде бы идея создания в пользовательском сигнале экземпляр еще одного сигнала и через него общаться понятная, но где-то у меня до конца не стыкуется: классы сигнала и трейлинга не наследуются друг от друга.

Помогите, люди добрые, кто чем может.

Я за неделю продвинулся! Нашел в классе CExpert метод Signal. Вставил в OnTick код

CExpertSignal *my_signal = ExtExpert.Signal();   my_signal.Ignore(0);

Теперь если в скобках руками на "1" меняю, то метод Ingnore работает - советник сделки по сигналу не совершает.

Осталось только понять, как в OnTick получить информацию об объекте трейлинга. К сожалению, метода ExtExpert.Trailing() для получения ссылки на объект трейлинга нет и, следовательно, компилятор не понимает, к какому объекту я хочу применить свой реализованный в трейлинге метод GetPermition. Может все-таки кто-нибудь подскажет, как быть?

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