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

 
Motzaart:

Добрый день.

На мультивалютном советнике нужно закрыть отложенный ордер, выставленный на противоход при срабатывании открытой позиции.

Сейчас при закрытии по профиту закрываются все отложенные ордера на всех валютах.

Как изменить код, чтобы закрывался отложенный ордер только тот, который привязан к валютной паре, а остальные оставались выставленными?

Что нужно поменять в этом коде?:

Mn  в этом коде - магический номер отложенного ордера BUY_STOP или SELL_STOP.

Логика такая, что при закрытии открытой позиции по тейк-профиту, остается выставленный ордер с этим магиком и по идее выполняется команда на удаление.

Это работает при тесте каждой пары. Однако в случае работы с остальными валютами удаляются все выставленные ордера по всем парам.

Помогите, кто сможет.

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

Буду очень признателен.

Чтобы понять чего вы там наколбасили, пришлось копировать код в редактор и делать нормальную стилизацию (Ctrl+<).

Итак: прокомментировал в коде то, что там нагорожено:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

В итоге ваш код делает вот это, т.е., равносилен такому коду:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

Теперь спрашивайте - чего от него хотели добиться?

 
Artyom Trishkin:

Чтобы понять чего вы там наколбасили, пришлось копировать код в редактор и делать нормальную стилизацию (Ctrl+<).

Итак: прокомментировал в коде то, что там нагорожено:

В итоге ваш код делает вот это, т.е., равносилен такому коду:

Теперь спрашивайте - чего от него хотели добиться?

Ок.

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

вот тут:

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

При открытии позиции (OP_BUY или OP_SELL ) одновременно выставляются отложенные ордера (OP_SELLSTOP и  OP_BUYSTOP) соответственно.

При закрытии по тейк-профиту открытой позиции должен быть отменен соответствующий ей отложенный ордер. Этот алгоритм на всех валютных парах.

При этом другие выставленные отложенные ордера на других валютах должны остаться.

 

Всем Доброго времени суток!

Есть индикатор MTF_RSI переключается

input ENUM_TIMEFRAMES      TimeFrame   =  0;

Подскажите возможна ли как-то задать автоматическую смену TimeFrame при переключении графика?

что-то вроде

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

Всем Доброго времени суток!

Есть индикатор MTF_RSI переключается

Подскажите возможна ли как-то задать автоматическую смену TimeFrame при переключении графика?

что-то вроде

Создайте структуру или многомерный массив и пусть бежит по нужному измерению, если критерий выполнился работаем с одним столбцом(каждый столбец отвечает за свой таймфрейм), если нет с другим столбцом да и всё. Сама по себе программа имеет доступ сразу ко всем таймфреймам поэтому то что вы пишите возможно, но реализация очень объёмная и на форуме такой объём работы вам не покажут потому что это очень обширно.

 
Seric29:

Создайте структуру или многомерный массив

Спасибо.

 

Почему не прокатывает такой код

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

с простыми функциями работает а тут что-то заморочки какие-то.

 
MakarFX:

Спасибо.

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
Это Вы мне?
 
MakarFX:
Это Вы мне?

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

 
Seric29:

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

Этот вопрос решается проще:

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }