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

 
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 сверху вниз медленной линией стохастика

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

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

 
Подскажите пожалуйста, как в функции OnTick в сконструированном эксперте получить доступ к информации о позиции. Хотя бы открыта она или нет. Где взять указатель на позицию? Или нужно это делать как-то по-другому?
 
VHS:
Подскажите пожалуйста, как в функции OnTick в сконструированном эксперте получить доступ к информации о позиции. Хотя бы открыта она или нет. Где взять указатель на позицию? Или нужно это делать как-то по-другому?

Эксперт сконструирован кем?

Покажите код, пожалуйста.
 
Комментарии, не относящиеся к этой теме, были перенесены в "Вопросы от начинающих MQL4 MT4 MetaTrader 4".
 
Vladimir Karputov:

Эксперт сконструирован кем?

Покажите код, пожалуйста.
Эксперт сконструирован Визардом по пользовательскому классу сигналов и пользовательскому классу трейдинга. Код самого эксперта стандартный. В OnTick запускается ExtExpert.OnTick(), остальное по стандартной библиотеке. Собственно этот вопрос в продолжение предыдущего, на который никто не ответил. Хочется, чтобы эксперт, сконструированный Визардом, пользовательский класс сигналов использовал только для открытия позиций, а закрывал уже только по трейдингу с игнорированием сигналов от сигнального класса. Как заигнорить работу сигналов я разобрался. А как получить в onTick информацию о том, есть ли открытая позиция, чтобы включить игнор, не понимаю. 
 
VHS:
***а закрывал уже только по трейдингу ***

Не понятно. 

 

VHS:
***а закрывал уже только по трейдингу ***

Vladimir Karputov:

Не понятно. 

"Д" и "Л" рядом на клавиатуре. Ошибся.

 
Artyom Trishkin:

"Д" и "Л" рядом на клавиатуре. Ошибся.

Да, Артём, спасибо большое. Видимо автозамена (или кривые руки). И пользовательский класс и закрытие - не трейДинг, а трейЛинг.
В классе CExpert метод Processing заходит сначала в Direction и проверяет наличие сигнала от класса сигналов. А затем (только при условии наличия позиции SelectPosition) проверяет Трейлинг. В результате при наличии открытой позиции она иногда закрывается в отсутствие сигналов от класса трейлинга, получая сигнал от класса сигналов. 
Предыдущий вариант, взять информацию о наличии открытой позиции из класса трейлинга и передать ее через OnTick в Ignore, не прокатил. Я научился запоминать в OnInit объект трейлинга и вытаскивать из него инфу в OnTick. Но это работает только пока позиция открыта. А после того, как она закрылась, процессинг уже не заходит в трейлинг и Ignore так и остаётся заигноренным. То есть остался последний штрих: после закрытия позиции определить этот момент в OnTick и вернуть Ignore значение «0». Но как эффективно получить информацию о (наличии/отсутствии) позиции в OnTick не понимаю. 
 
VHS:
Да, Артём, спасибо большое. Видимо автозамена (или кривые руки). И пользовательский класс и закрытие - не трейДинг, а трейЛинг.
В классе CExpert метод Processing заходит сначала в Direction и проверяет наличие сигнала от класса сигналов. А затем (только при условии наличия позиции SelectPosition) проверяет Трейлинг. В результате при наличии открытой позиции она иногда закрывается в отсутствие сигналов от класса трейлинга, получая сигнал от класса сигналов. 
Предыдущий вариант, взять информацию о наличии открытой позиции из класса трейлинга и передать ее через OnTick в Ignore, не прокатил. Я научился запоминать в OnInit объект трейлинга и вытаскивать из него инфу в OnTick. Но это работает только пока позиция открыта. А после того, как она закрылась, процессинг уже не заходит в трейлинг и Ignore так и остаётся заигноренным. То есть остался последний штрих: после закрытия позиции определить этот момент в OnTick и вернуть Ignore значение «0». Но как эффективно получить информацию о (наличии/отсутствии) позиции в OnTick не понимаю. 

Я думаю можно всё сделать намного проще - в советнике порог на ЗАКРЫТИЕ ставите равным 100, а вес сигналу даёте 0.5 - таким образом сигнал с весом 0.5 НИКОГДА не преодолеет порог 100


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