Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 51

 

Может быть, я непонятно спросила.

Находясь на графике периода М1 хочу заполнить буфер, если на периоде М5, линия индикатора “ Stochastic” сейчас находится выше уровня 55.

input ENUM_TIMEFRAMES   TimeFrame2  =  PERIOD_M5; //ЭТО ВО ВНЕШНИХ Н
////////////////////////////////////////////////
       for(int i=limit; i>=0; i--) {
      int bar_sto2_0=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i));
      int bar_sto2_1=iBarShift(Symbol(),TimeFrame2,iTime(Symbol(),TimeFrame2,i+1));
    
      double sto2_0=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_LWMA,STO_CLOSECLOSE,MODE_MAIN,bar_sto2_0);
      double sto2_1=iStochastic(Symbol(),TimeFrame2,kperiod2,dperiod2,slowing2,MODE_LWMA,STO_CLOSECLOSE,MODE_MAIN,bar_sto2_1);
    
      if(sto2_0>55.0)
       {
      BufferUP[i]=low[i]-distance*MyPoint;
       }
      
      if(sto2_0<44.0)
       {
      BufferDN[i]=high[i]+distance*MyPoint;
       }

      Comment(sto2_0);
       }

В комменте текущее значение верное с М5, а на истории стрелки ставит не по условию, хаос.

В чём может быть дело?

В подвале стохастик с М5

Обведены стрелки не по сигналу



xaoc
 

пишу советника, который одновременно выставляет 2 СтопОрдера, один на продажу, второй на покупку.

Как прописать условие, что при срабатывании одного СтопОрдера, второй (противоположный) удаляется?

Спасибо. 

 
RichLux:

пишу советника, который одновременно выставляет 2 СтопОрдера, один на продажу, второй на покупку.

Как прописать условие, что при срабатывании одного СтопОрдера, второй (противоположный) удаляется?

Спасибо. 

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

Это кусок кода для размышления)

void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1, color cl=clrOliveDrab) {
  bool b, s;
  switch(op) {
    case OP_BUY : b=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: s=ExistPositions(sy, OP_SELL, mn); break;
  }

  if(b) {
    DeleteOrders(sy, OP_SELLLIMIT, mn, cl);
    DeleteOrders(sy, OP_SELLSTOP , mn, cl);
  }
  if(s) {
    DeleteOrders(sy, OP_BUYLIMIT, mn, cl);
    DeleteOrders(sy, OP_BUYSTOP , mn, cl);
}}
 
Vitaly Muzichenko, Насколько я понял, еще теперь нужно прописать функции ExistPositions и DeleteOrders
 
RichLux:
Vitaly Muzichenko, Насколько я понял, еще теперь нужно прописать функции ExistPositions и DeleteOrders
Да, нужно.
 
RichLux:
Vitaly Muzichenko, Насколько я понял, еще теперь нужно прописать функции ExistPositions и DeleteOrders
Можно не писать, они есть обе готовые 
 
Vitaly Muzichenko:
Можно не писать, они есть обе готовые 

Ну ..., в учебных целях весьма пользительно...

В практических - очень затратно гонять в каждой функции циклы.

 
Artyom Trishkin:

Ну ..., в учебных целях весьма пользительно...

В практических - очень затратно гонять в каждой функции циклы.

Поэтому сразу и не приложил, а описал и приложил лишь саму логику работы "закрытия противоположной" )
 

Что делать если стоп\тейк 200

но

tp=NormalizeDouble((price+(TakeProfit*_Point)),Digits); 

на доллар-иене даст 317.000 при курсе 117.000

ожидаемый результат 117.200 

 
trader781:

Что делать если стоп\тейк 200

но

tp=NormalizeDouble((price+(TakeProfit*_Point)),Digits); 

на доллар-иене даст 317.000 при курсе 117.000

ожидаемый результат 117.200 

Зачем столько скобок? Дело вкуса, конечно, но перебор, всё-таки.

tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);  

Значения подставляются неправильные, если результат неправильный на выходе, так как эта строка кода вычислит всё правильно, даже с лишними скобками.