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

 

Добрый вечер!

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

Как правильно отличить, к примеру тот факт, что после размещения ордера на покупку, далее я менял в позиции SL и TP? Есть ли для этого специальные поля у позиции или функции??

 
websafe25:

Добрый вечер!

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

Как правильно отличить, к примеру тот факт, что после размещения ордера на покупку, далее я менял в позиции SL и TP? Есть ли для этого специальные поля у позиции или функции??

Это вряд ли.

ИМХО,  не стоит опираться на на текущее состояние позиции или ордеров.  Гораздо надежней когда после рестарта система внутри себя сформирует такое состояние, какое должно быть в текущей рыночной ситуации. И после этого приведет в соответствие позицию и расстановку заявок.

 
pronych:

Это вряд ли.

ИМХО,  не стоит опираться на на текущее состояние позиции или ордеров.  Гораздо надежней когда после рестарта система внутри себя сформирует такое состояние, какое должно быть в текущей рыночной ситуации. И после этого приведет в соответствие позицию и расстановку заявок.

Спасибо за ответ.

Опишу свою  ситуацию.

При достижении позицией профита скажем в 10 пунктов, я хочу перевести позицию в без убыток, то есть я передвигаю стопы к цене открытия + 3 пункта например.

Сейчас происходит такая ситуация.

if(AccountInfo.OrderProfitCheck(_Symbol,ORDER_TYPE_SELL,Lot,PositionInfo.PriceOpen(),NormalizeDouble(PositionInfo.PriceOpen()-ModifyPips*_Point,_Digits)) <= PositionInfo.Profit())
        {
        if(Trade.PositionModify(_Symbol,NormalizeDouble(PositionInfo.PriceOpen()-ModifySLPips*_Point,_Digits),NormalizeDouble(PositionInfo.PriceOpen()-TP*_Point,_Digits)))
          {

Если профит по сделке больше или равен 10 пунктам, то я меняю стопы. Профит растет, и модификация происходит раз за разом, постоянно.Нужно 1 раз передвинул сделку в без убыток, и далее пропускать ее мимо....

Как мне избавиться от этого? Или лучше написать не <= а =? Есть вариант что пока советник будет дойдет до этой операции и начнет сравнивать профит по сделке, там уже не будет равно 10 пунктам, а профит будет больше, тогда в без убыток не закроется?

 

 

P.S> думаю при получении позиции просто смотреть на коем уровне от цены находится SL, если выше цены тогда уже модифицировал... 

Решил это так:

if(PositionInfo.Select(_Symbol))
{
   if(PositionInfo.PositionType()==POSITION_TYPE_BUY)
     {
     if(PositionInfo.StopLoss() > PositionInfo.PriceOpen())
       {
         if(AccountInfo.OrderProfitCheck(_Symbol,ORDER_TYPE_BUY,Lot,PositionInfo.PriceOpen(),NormalizeDouble(SymbolInfo.Ask()+ModifyPips*_Point,_Digits)) >= PositionInfo.Profit())
          {
             Trade.PositionModify(_Symbol,NormalizeDouble(PositionInfo.PriceOpen()+ModifySLPips*_Point,_Digits),NormalizeDouble(PositionInfo.PriceOpen()+TP*_Point,_Digits));
          }
       }
     }
   if(PositionInfo.PositionType()==POSITION_TYPE_SELL)
     {
     if(PositionInfo.StopLoss() < PositionInfo.PriceOpen())
       {
      if(AccountInfo.OrderProfitCheck(_Symbol,ORDER_TYPE_SELL,Lot,PositionInfo.PriceOpen(),NormalizeDouble(PositionInfo.PriceOpen()-ModifyPips*_Point,_Digits)) <= PositionInfo.Profit())
        {
        Trade.PositionModify(_Symbol,NormalizeDouble(PositionInfo.PriceOpen()-ModifySLPips*_Point,_Digits),NormalizeDouble(PositionInfo.PriceOpen()-TP*_Point,_Digits));
        }
       }
     }
}
 
websafe25:

P.S> думаю при получении позиции просто смотреть на коем уровне от цены находится SL, если выше цены тогда уже модифицировал... 

Решил это так:

То, что написано у Вас после P.S. совершенно очевидно. (если уж надо очень точно, вплоть до нахождения уровня по хай/лоу баров с момента последнего измерения.)) но это вряд ли))

Только желательно открепиться от понятия "профит", а повернуться к понятию "пункт".

И красивей будет учитывать не цену последней сделки(Last)( и вообще забыть про такой тип цены), а ask/bid  в выгодном для нас варианте;))

 

Добрый вечер!

К сожалению не где не смог найти конкретного указания, как мне использовать модуль сигнала к примеру RSI. То есть есть запись о том как инициализируется, устанавливаются параметры, но как просто напросто из своего советника проверить условие на покупку -  нет. Что дальше? Как проверить есть ли условие на покупку/продажу?

/--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(-2);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(100);
   signal.ThresholdClose(100);
   signal.PriceLevel(0.0);
   signal.StopLevel(SL);
   signal.TakeLevel(TP);
//--- Creating filter CSignalRSI
   CSignalRSI *filter0=new CSignalRSI;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(-3);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.PeriodRSI(PeriodRSI);
   filter0.Applied(PRICE_CLOSE);
   filter0.Weight(0.8);
 
websafe25:

Добрый вечер!

К сожалению не где не смог найти конкретного указания, как мне использовать модуль сигнала к примеру RSI. То есть есть запись о том как инициализируется, устанавливаются параметры, но как просто напросто из своего советника проверить условие на покупку -  нет. Что дальше? Как проверить есть ли условие на покупку/продажу?

Модуль сигналов подключается к Вашему советнику на этапе проектирования. В каждом модуле сигналов организуется голосование...

В общем статьи к прочтению:

Создай торговый робот за 6 шагов! 

и напоследок

Генератор торговых сигналов пользовательского индикатора

 

Кстати - мне одному кажется, что некоректно в модуле голосования брать среднее арифметическое сигналов?

double CExpertSignal::Direction(void)
  {
   long   mask;
   double direction;
   double result=m_weight*(LongCondition()-ShortCondition());
   int    number=(result==0.0)? 0 : 1;      // number of "voted"
//---
   int    total=m_filters.Total();
//--- loop by filters
   for(int i=0;i<total;i++)
     {
      //--- mask for bit maps
      mask=((long)1)<<i;
      //--- check of the flag of ignoring the signal of filter
      if((m_ignore&mask)!=0)
         continue;
      CExpertSignal *filter=m_filters.At(i);
      //--- check pointer
      if(filter==NULL)
         continue;
      direction=filter.Direction();
      //--- the "prohibition" signal
      if(direction==EMPTY_VALUE)
         return(EMPTY_VALUE);
      //--- check of flag of inverting the signal of filter
      if((m_invert&mask)!=0)
         result-=direction;
      else
         result+=direction;
// Вот тут бы       number+=filter.Weight();

      number++;
      }
//--- normalization
   if(number!=0)
      result/=number; // Вот туточки???
//--- return the result
   return(result);
  }
 
YAndrey:

Кстати - мне одному кажется, что некоректно в модуле голосования брать среднее арифметическое сигналов?

Все логично.

Подробнее статья  Мастер MQL5: Новая версия и вот кусочек рисунка из статьи:

normalization 

 
barabashkakvn:

Все логично.

Подробнее статья  Мастер MQL5: Новая версия и вот кусочек рисунка из статьи:

 

Да разве логично??? Если веса по 1, то - да, логично.

Представим себе, что у меня 2 фильтра-сигнала. Один хороший, толстый, которому я доверяю и поставлю ему вес 1. Другой маленький, вспомогательный, так. для понту, посему вес ему = 0.1.

Толстый дает сигнал на покупку равный 100, а маленький, которым и преебречь то можно на покупку 10 . И что же мне выдаст общий сигнал??? 50.5??? Не странно ли, что этот маленький так занизил оценку ситуации???

 
YAndrey:

Да разве логично??? Если веса по 1, то - да, логично.

Представим себе, что у меня 2 фильтра-сигнала. Один хороший, толстый, которому я доверяю и поставлю ему вес 1. Другой маленький, вспомогательный, так. для понту, посему вес ему = 0.1.

Толстый дает сигнал на покупку равный 100, а маленький, которым и преебречь то можно на покупку 10 . И что же мне выдаст общий сигнал??? 50.5??? Не странно ли, что этот маленький так занизил оценку ситуации???

1. Итоговое число голосования. Его главная характеристика это направление. Вторая характеристика это итоговое значение.
2. Если в Вашей стратегии срабатывают два сигнала: один с силой равной 100*1, а второй силой равной 10*0.1, то стоит пересмотреть свою стратегии в плане выбора сигналов.
Причина обращения: