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

 
Oleg Kubenko OnChartEvent не хочет.

Нужно использовать OnTradeTransaction

Посмотрите ответ, присланный Владимиром Карпутовым

https://www.mql5.com/en/forum/393483

OnTradeTransaction consitently getting called invoked with incorrect values in
OnTradeTransaction consitently getting called invoked with incorrect values in
  • 2022.04.12
  • cdjindia
  • www.mql5.com
Following code always prints Filled Long regardless of whether a Sell order gets filled or buy order gets filled...
 

Я по ходу и сейчас не понимаю куда пихать этот копибуфер если 

hRSI

пихается в хендл мувинга 

 
Mickey Moose #:

Я по ходу и сейчас не понимаю куда пихать этот копибуфер если 

пихается в хендл мувинга 

Что вы хотите получить?

У вас есть код для мт4, чтобы понимать что нужно?

 
Vitaly Muzichenko #:

Что вы хотите получить?

У вас есть код для мт4, чтобы понимать что нужно?

double rsii1[100], rsii2[100],profit_m[100];  int b,s,b1,s1;
extern int       rsi_shift=1;
extern int       rsi_period1=4;
extern int       rsi_period2=14;
extern int       N=5;
extern int       Level1=20;

extern int       Level2=80;
extern int       Level3=30;
extern int       Level4=70;
int signal() //   3. Signal Function

{

    int b = 0, s = 0, b1 = 0, s1 = 0; // Reset conditions

    for (int i = 1; i <= N; i++) // Conditions over the last bars

    {

        rsii1[i] = iRSI(_Symbol, PERIOD_CURRENT, Inp_RSI_ma_period, PRICE_CLOSE, i);

        rsii2[i] = iRSI(_Symbol, PERIOD_CURRENT, Inp_RSI_ma_period, PRICE_CLOSE, i);


        if (rsii1[i] < Level1) b = 1;

        if (rsii1[i] > Level2) s = 1;

        if (rsii2[i] < Level3) b1 = 1;

        if (rsii2[i] > Level4) s1 = 1;

    }

    double rsi1 = iRSI(_Symbol, PERIOD_CURRENT, rsi_period1, PRICE_CLOSE, rsi_shift);

    double rsi2 = iRSI(_Symbol, PERIOD_CURRENT, rsi_period1, PRICE_CLOSE, rsi_shift + 1);

    double rsi3 = iRSI(_Symbol, PERIOD_CURRENT, rsi_period2, PRICE_CLOSE, rsi_shift);

    double rsi4 = iRSI(_Symbol, PERIOD_CURRENT, rsi_period2, PRICE_CLOSE, rsi_shift + 1);


    if (rsi1 > rsi3 && rsi2 <= rsi4 && b == 1 && b1 == 1) return (ORDER_TYPE_BUY);  //открываем покупку

    if (rsi1 < rsi3 && rsi2 >= rsi4 && s == 1 && s1 == 1) return (ORDER_TYPE_SELL);  // открываем продажу


    return(0);

}


я его пытаюсь переделать под 5 вставив в два значения rsi хендл мувинга

 Кросс РСИ и МА выше или ниже заданных уровней

  т.е РСИ выше 70 и МА выше 60 при кроссе сверху вниз открывается шорт, и наоборот РС ниже и МА ниже при кроссе снизу вверх открывается лонг.
вот таких функций у меня с пара десятков и пытаюсь адаптировать их под 5. Что то получается что то нет.


З.Ы. как вы скрываете область кода чтобы не получались такие простыни? я кнопки спойлера не вижу чтобы не кидать полторы тысячи строк на 5ке

 
Mickey Moose #:

double rsii1[100], rsii2[100],profit_m[100];  int b,s,b1,s1;

З.Ы. как вы скрываете область кода чтобы не получались такие простыни? я кнопки спойлера не вижу чтобы не кидать полторы тысячи строк на 5ке

double handle_iRSI;
double handle_iMA;
double buff[1];
int OnInit()
{
  handle_iRSI=iRSI(Symbol(),Period(),14,PRICE_CLOSE);
  if(handle_iRSI==INVALID_HANDLE) {
    Print("Не удалось создать хэндл индикатора iRSI для пары %s/%s, код ошибки %d",GetLastError());
    return(INIT_FAILED);
  }
  handle_iMA=iMA(Symbol(),Period(),50,0,MODE_SMA,PRICE_CLOSE);
  if(handle_iMA==INVALID_HANDLE) {
    Print("Не удалось создать хэндл индикатора iMA для пары %s/%s, код ошибки %d",GetLastError());
    return(INIT_FAILED);
  }
  return(INIT_SUCCEEDED);
}
void OnTick()
{

  for(int i = 1; i <= N; i++) {
    CopyBuffer(handle_iRSI,0,i,1,buf);
    double RSI[i] = buf[0];//iRSI(NULL,0,14,PRICE_CLOSE,i);
    CopyBuffer(handle_iMA,0,i,1,buf);
    double MA[i] = buf[0];//iMA(Symbol(),Period(),50,0,MODE_SMA,PRICE_CLOSE,i);
 

Вот доделал ещё кое что, по идее должно закрывать при получении профита в ххх суммы
я хочу переделать условие на "если у нас есть ордера и они такого то типа и они в прибыли на сумму  OverProfit то при получении противоположного сигнала закрываются. Иначе наша сетка ордеров при достижении убытка усредняет позицию на сумму  OverLoss/
как я понял надо вставить в функцию поиска сигналов запоминающуюся переменную и после закрытия позиций обнулять её. 

Что меня тут напрягает - я понятия не имею как работать с этими структурами и беру куски из базы, поэтому правлю методом тыка.

bool SearchTradingSignals(void)
  {
   double ma[],rsi[];
   ArraySetAsSeries(ma,true);
   ArraySetAsSeries(rsi,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iMA,0,start_pos,count,ma) ||
      !iGetArray(handle_iRSI,0,start_pos,count,rsi))
     {
      return(false);
     }

   int size_need_position=ArraySize(SNeedPosition);
   if(rsi[2]<ma[2] && rsi[1]>ma[1])
     {
      ArrayResize(SNeedPosition,size_need_position+1);
      if(!InpReverse)
         SNeedPosition[size_need_position].pos_type=POSITION_TYPE_BUY;
      else
         SNeedPosition[size_need_position].pos_type=POSITION_TYPE_SELL;
      //---
      return(true);
     }
   if(rsi[2]>ma[2] && rsi[1]<ma[1])
     {
      ArrayResize(SNeedPosition,size_need_position+1);
      if(!InpReverse)
         SNeedPosition[size_need_position].pos_type=POSITION_TYPE_SELL;
      else
         SNeedPosition[size_need_position].pos_type=POSITION_TYPE_BUY;
      //---
      return(true);
     }
//---
   return(true);
  }
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//| Close over xxx                                          |
//+------------------------------------------------------------------+


void ClosebyProfit()   // Если профит превышает значение вызываем функцию
{ 
  double profit1 = PositionGetDouble(POSITION_PROFIT); 
  for(int i = PositionsTotal() - 1; i >= 0; i--)
  {    
      if(m_position.Symbol()==m_symbol.Name() == Symbol() && PositionGetInteger(POSITION_MAGIC) == InpMagic)
      {
        if((PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && profit1 >= OverProfit))
        {
         pos_TIC=PositionGetInteger(POSITION_TICKET);
            m_Trade.PositionClose(pos_TIC);
          continue;
        }
        else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && profit1 >= OverProfit)
        {
          pos_TIC=PositionGetInteger(POSITION_TICKET);
            m_Trade.PositionClose(pos_TIC);
        }
      }
    }
  }
 
Он спрашивает меня"подписка на сигналы не удалась, включите подписку в реальном времени в настройках сигналов."
Как решить эту проблему? Пожалуйста.
 

Привет, я новичок в mql5, но я научился и создал советник, который дает "BREAK OF STRUCTURE". Он печатает "BOS", когда найден BOS, он отлично работает и отображается как объект в тестере стратегий, но я не могу применить его на графике реального времени. Пожалуйста, помогите.

EX5 удален модератором.

Файлы:
Learn.mq5  7 kb
 
Здравствуйте, подскажите где я что упускаю? Открыт график м15, я хочу найти время открытия последней свечи на м1. 

iTime(0, PERIOD_M1, 0) ;

Мне выдаёт 1970.01.01, почему так? История загружена, даже если менять шифт, ставить туда  любое число или ratestotal, результат такой-же. 
 
Vlad Tatarkin #:
iTime(0, PERIOD_M1, 0) ;

Может лучше так попробовать

iTime(NULL, PERIOD_M1, 0);