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

 
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. Может все-таки кто-нибудь подскажет, как быть?

 
void OnTick()
  {
 TimeCurrent(dt); 
//--- Достаточно ли количество баров для работы
   if(Bars(_Symbol,_Period)<10) // общее количество баров на графике меньше 10?
     {
      Alert("На графике меньше 10 баров, советник не будет работать!!");
      return;
     }
//--- сначала нужно записать в массивы значения буферов индиктора Fractal
//--- заполнение данными буфера

   ArraySetAsSeries(Signal,true);
   ArraySetAsSeries(Main,true);

   
   if(CopyBuffer(Stochastic_handle,0,0,100,Main)<=0) return;
   if(CopyBuffer(Stochastic_handle,1,0,100,Signal)<=0) return;

   double Main_1=Main[1];
   Main_1=NormalizeDouble(Main_1,5);
   Print("Main_1=",DoubleToString(Main_1,5));
    
   double Main_2=Main[2];
   Main_2=NormalizeDouble(Main_2,5);
   
   double Main_3=Main[3];
   Main_3=NormalizeDouble(Main_3,5);
   
   double Signal_1=Signal[1];
   Signal_1=NormalizeDouble(Signal_1,5);
   Print("Signal_1=",DoubleToString(Signal_1,5));
   
   double Signal_2=Signal[2];
   Signal_2=NormalizeDouble(Signal_2,5);
   
   double Signal_3=Signal[3];
   Signal_3=NormalizeDouble(Signal_3,5);
   
   
// Для сохранения значения времени бара мы используем static-переменную Old_Time.
// При каждом выполнении функции OnTick мы будем сравнивать время текущего бара с сохраненным временем.
// Если они не равны, это означает, что начал строится новый бар.

   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;

// копируем время текущего бара в элемент New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
   if(copied>0) // ok, успешно скопировано
     {
      if(Old_Time!=New_Time[0]) // если старое время не равно
        {
         IsNewBar=true;   // новый бар
         if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Новый бар",New_Time[0],"старый бар",Old_Time);
         Old_Time=New_Time[0];   // сохраняем время бара
        }
     }
   else
     {
      Alert("Ошибка копирования времени, номер ошибки =",GetLastError());
      ResetLastError();
      return;
     }
     
     
// открытие покупок

     if(Main_1>Signal_1&&Main_2<Signal_2&&Main_3<Signal_3&&Main_2<20)
     {
      if(IsNewBar!=false)
        {
           
              {
               open_by_market();

              }
        }
     }
  

  // закрытие покупок 
 
   if (Signal_3>80&&Signal_2>80&&Signal_1<80)
   {
   if(PositionsTotal()>0)
        {
         for(int i=0;i<PositionsTotal();i++)
           {
            ulong orders_ticket=PositionGetTicket(i);
            if(((PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) ))
              
              
              {  trade.PositionClose(orders_ticket); }        
            
         }
     }           
   }
 
}
   

добрый день. уточните плз как реализовать две задачи ( на примере сигналов на покупку).

дано: точка входа - пересечение линий стохастика ниже 20

закрытие сделки - пересечение уровня 80 сверху вниз медленной линией стохастика

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

2 задача. чтобы закрытие было при втором, а не при первом пересечении уровня 80 сверху вниз медленной линией стохастика

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Файлы:
121.png  27 kb
 
gastinets:

добрый день. уточните плз как реализовать две задачи ( на примере сигналов на покупку).

дано: точка входа - пересечение линий стохастика ниже 20

закрытие сделки - пересечение уровня 80 сверху вниз медленной линией стохастика

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

2 задача. чтобы закрытие было при втором, а не при первом пересечении уровня 80 сверху вниз медленной линией стохастика

Сначала чётко сформулируйте:

  • условие открытия позиции
  • условие закрытия позиции