Эксперт по классической тактике - страница 4

 
Благодарю, granit77, - поставила - работает...
 

Добрый день. Столкнулась с большой проблемой!

И никак не разберусь. Вторые сутки.

У меня в мультивалютном эксперте позиции открываются по сигналам индикатора. Причем только тогда, когда сигналы на 5 тф совпадут.

Мне нужно. Чтобы я могла отключать один или несколько таймфреймов. Т.е. я во внешние параметры вставила:

extern string     __  = "Параметры индикатора BuySellBasketTotal"; 

extern int look_back= 0;
extern int DisplayBars = 250;

extern bool Period_M1=true;
extern bool Period_M5=true;
extern bool Period_M15=true;
extern bool Period_M30=true;
extern bool Period_H1=true;

Таким образом, отключая один или неск. тф я могу формировать сигнал входа так, чтобы результирующий сигнал складывался из сигналов тех тф, кот. я сама задам = true

Но. Оказалось, что таких комбинаций 2^5=32

StartSignal [1,1,1,1,1]

А если учесть сделки в бай и в селл, то их будет уже 64 (!).

Т.е. мне придется 64 раза переписывать вот это условие входа . Исключая таймфреймы в каждом варианте -

if (     BasketPusle_0_1>  BasketPusle_1_1
      && BasketPusle_0_5>  BasketPusle_1_5 
      && BasketPusle_0_15>BasketPusle_1_15
      && BasketPusle_0_30>BasketPusle_1_30
      && BasketPusle_0_60>BasketPusle_1_60   )

КРОМЕ того мне придется так же 64 раза после каждого условия писать сам блок открытия сделок. А т.к. эксперт мультивалютный и там 14 пар и ещё доп. условия и функции И.Кима (наличие/отсутствие позиций) по каждой паре, - то размер этого блока - тоже значительный!

Пож. подскажите.

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

 
if (     (BasketPusle_0_1>  BasketPusle_1_1 || !Period_M1)
      && (BasketPusle_0_5>  BasketPusle_1_5 || !Period_M5) 
      && (BasketPusle_0_15>BasketPusle_1_15 || !Period_M15)
      && (BasketPusle_0_30>BasketPusle_1_30 || !Period_M30)
      && (BasketPusle_0_60>BasketPusle_1_60 || !Period_M60)   )
Если я конечно правильно понял что Вы хотите
 

,Благодарю вас, Figar0 !

Сейчас попробую так сделать.

 

Всё получилось. Работает нормально.

 
Ещё вопрос встал. Пож. подскажите ?
 

Вот такой. В моем мультивалютном эксперте возникла необходимость вставить трейлинг стоп.

Причем так, чтобы он один обслуживал все открытые инструменты.

Сделала вот так:

void TrailPositions() //пороговый трейлинг стоп
{ 
double bid_ ;
double ask_ ;
double point_;

if (OrderSymbol( ) =="AUDJPY")    
{ bid_  = MarketInfo("AUDJPY", MODE_BID);
  ask_  = MarketInfo("AUDJPY", MODE_ASK);
  point_= MarketInfo("AUDJPY",MODE_POINT);}

if (OrderSymbol( ) =="AUDCAD")     
{bid_  = MarketInfo("AUDCAD", MODE_BID);
ask_  = MarketInfo("AUDCAD", MODE_ASK);
point_= MarketInfo("AUDCAD",MODE_POINT);}

.... .... .... .... .... .... .... ....

if (OrderSymbol( ) =="USDJPY")     
{ bid_  = MarketInfo("USDJPY", MODE_BID);
ask_  = MarketInfo("USDJPY", MODE_ASK);
point_= MarketInfo("USDJPY",MODE_POINT);}

int Orders = OrdersTotal();

  for (int i=0; i<Orders; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if ( OrderMagicNumber()==Magic) continue; 
    if (OrderType() == OP_BUY) {
      if (bid_-OrderOpenPrice() > MinProfit*Point) {
        if (OrderStopLoss() < bid_-(TrailingStop+TrailingStep-1)*point_) {
          OrderModify(OrderTicket(), OrderOpenPrice(), bid_-TrailingStop*point_,
                                                    OrderTakeProfit(), 0, Blue);
        }}}
    if (OrderType() == OP_SELL) {
      if (OrderOpenPrice()-ask_ > MinProfit*Point) {
        if (OrderStopLoss() > ask_+(TrailingStop+TrailingStep-1)*point_ || 
                                                      OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), ask_+TrailingStop*point_,
                                                     OrderTakeProfit(), 0, Blue);
        }}}}}
  

Но почему то не работает трейлинг. Однако.

Если я его сделаю без MarketInfo("...", MODE_...); то он работает нормально. Но только на той паре, на графике которой стоит этот мультивалютный эксперт.

Пож. подскажите. Где может быть ошибка?

 
Rita >>:

Вот такой. В моем мультивалютном эксперте возникла необходимость вставить трейлинг стоп.

Причем так, чтобы он один обслуживал все открытые инструменты.

Сделала вот так:

Но почему то не работает трейлинг. Однако.

Если я его сделаю без MarketInfo("...", MODE_...); то он работает нормально. Но только на той паре, на графике которой стоит этот мультивалютный эксперт.

Пож. подскажите. Где может быть ошибка?

У вас Point а должен быть point_

if (OrderSymbol( ) =="AUDJPY")    
{ bid_  = MarketInfo("AUDJPY", MODE_BID);
  ask_  = MarketInfo("AUDJPY", MODE_ASK);
  point_= MarketInfo("AUDJPY",MODE_POINT);}

if (OrderSymbol( ) =="AUDCAD")    
{bid_  = MarketInfo("AUDCAD", MODE_BID);
ask_  = MarketInfo("AUDCAD", MODE_ASK);
point_= MarketInfo("AUDCAD",MODE_POINT);}

.... .... .... .... .... .... .... ....

if (OrderSymbol( ) =="USDJPY")    
{ bid_  = MarketInfo("USDJPY", MODE_BID);
ask_  = MarketInfo("USDJPY", MODE_ASK);
point_= MarketInfo("USDJPY",MODE_POINT);}

эквивалентно

bid_  = MarketInfo(OrderSymbol( ), MODE_BID);
  ask_  = MarketInfo(OrderSymbol( ), MODE_ASK);
  point_= MarketInfo(OrderSymbol( ),MODE_POINT);

и вообще

void TrailPositions() //пороговый трейлинг стоп
   {
      double bid_ ;
      double ask_ ;
      double point_;
      int Orders = OrdersTotal();
      for (int i=0; i<Orders; i++)
         {
            if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
            if ( OrderMagicNumber()==Magic) continue;
            bid_  = MarketInfo(OrderSymbol( ), MODE_BID);
            ask_  = MarketInfo(OrderSymbol( ), MODE_ASK);
            point_= MarketInfo(OrderSymbol( ),MODE_POINT);                        
            if (OrderType() == OP_BUY)
               {
                  if (bid_-OrderOpenPrice() > MinProfit*point_)
                     {
                        if (OrderStopLoss() < bid_-(TrailingStop+TrailingStep-1)*point_)
                           {
                              OrderModify(OrderTicket(), OrderOpenPrice(), bid_-TrailingStop*point_,OrderTakeProfit(), 0, Blue);
                           }
                     }
               }
            if (OrderType() == OP_SELL)
               {
                  if (OrderOpenPrice()-ask_ > MinProfit*point_)
                     {
                        if (OrderStopLoss() > ask_+(TrailingStop+TrailingStep-1)*point_ ||  OrderStopLoss() == 0)
                                {
                                    OrderModify(OrderTicket(), OrderOpenPrice(), ask_+TrailingStop*point_,OrderTakeProfit(), 0, Blue);
                                 }
                     }
               }
         }//for (int i=0; i<Orders; i++)
    }
  

а это для чего ???

            if ( OrderMagicNumber()==Magic) continue; 
 

Как для чего? У меня же эксперт открывает все инструменты с этим магиком.г

Благодарю.

Сейчас попробую ваш вариант.

 
Rita >>:

Как для чего? У меня же эксперт открывает все инструменты с этим магиком.г

Благодарю.

Сейчас попробую ваш вариант.

if ( OrderMagicNumber()!=Magic) continue; 

тогда должно быть так

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