Как создать условие выполнения?

 
Например есть условие, допустим пересечение, как сделать так чтоб этот сигнал считать верным только если он появился в начале периода или можно такое условие от цены например если данная цена соответствует цене открытия бара + - несколько пунктов, а не посередине бара или в конце....Большое спасибо всем откликнувшимся .
 

Просто во всех своих индикаторах выбирайте построение по цене открытия бара (Open) и сигнал в течение этого бара никуда гулять уже не будет.

 
solandr -

         - Спасибо...но можно хоть чуть более подробно...а вообще прошу Вас помочь , сделать условие от цены. Очень буду благодарен.
 
Объем посмотреть или время прошедшее от открытия бара.
 
Что же больше помощи ждать не стоит...? Тогда СПАСИБО !!!
 
'Особенности написания экспертов'

  • Как определить начало очередного бара? (Это бывает необходимо, чтобы узнать, что предыдущий бар только что сформировался.) Существует несколько способов.


    Первый способ основан на проверке количества баров:

    static int prevbars = 0;
    ...
    if(prevbars == Bars) return(0);
    prevbars = Bars;
    ...

    Этот способ может не сработать при подкачке истории. То есть, количество баров изменилось, а "предыдущий" еще не сформировался. В этом случае можно усложнить проверку на разницу между значениями, равную единице.

    Следующий способ основан на том, что значение "Volume" формируется на основе количества тиков, пришедших для каждого бара, и первый тик означает, что у вновь формирующегося бара значение "Volume" равно 1:

    if( Volume[0] > 1) return(0);
    ...

    Этот способ может не сработать при слишком интенсивном поступлении ценовых тиков. Дело в том, что обработка приходящих ценовых тиков производится в отдельном потоке. И если этот поток занят во время поступления очередного тика, то во избежание излишней загрузки вычислительных ресурсов этот пришедший тик не обрабатывается! В этом случае можно также усложнить проверку, используя сохранение предыдущего значения "Volume".

    Третий способ основан на времени открытия бара:

    static datetime prevtime=0;
    ...
    if(prevtime == Time[0]) return(0);
    prevtime = Time[0];
    ...

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

  •  

    Вот пример эксперта, который работает только по сформированным барам.
    Взято из МТ4.

    //+------------------------------------------------------------------+
    //|                                               Moving Average.mq4 |
    //|                      Copyright © 2005, MetaQuotes Software Corp. |
    //|                                       https://www.metaquotes.net// |
    //+------------------------------------------------------------------+
    #define MAGICMA  20050610
     
    extern double Lots               = 0.1;
    extern double MaximumRisk        = 0.02;
    extern double DecreaseFactor     = 3;
    extern double MovingPeriod       = 12;
    extern double MovingShift        = 6;
    //+------------------------------------------------------------------+
    //| Calculate open positions                                         |
    //+------------------------------------------------------------------+
    int CalculateCurrentOrders(string symbol)
      {
       int buys=0,sells=0;
    //----
       for(int i=0;i<OrdersTotal();i++)
         {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
            {
             if(OrderType()==OP_BUY)  buys++;
             if(OrderType()==OP_SELL) sells++;
            }
         }
    //---- return orders volume
       if(buys>0) return(buys);
       else       return(-sells);
      }
    //+------------------------------------------------------------------+
    //| Calculate optimal lot size                                       |
    //+------------------------------------------------------------------+
    double LotsOptimized()
      {
       double lot=Lots;
       int    orders=HistoryTotal();     // history orders total
       int    losses=0;                  // number of losses orders without a break
    //---- select lot size
       lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
    //---- calcuulate number of losses orders without a break
       if(DecreaseFactor>0)
         {
          for(int i=orders-1;i>=0;i--)
            {
             if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
             if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
             //----
             if(OrderProfit()>0) break;
             if(OrderProfit()<0) losses++;
            }
          if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
         }
    //---- return lot size
       if(lot<0.1) lot=0.1;
       return(lot);
      }
    //+------------------------------------------------------------------+
    //| Check for open order conditions                                  |
    //+------------------------------------------------------------------+
    void CheckForOpen()
      {
       double ma;
       int    res;
    //---- go trading only for first tiks of new bar
       if(Volume[0]>1) return;
    //---- get Moving Average 
       ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
    //---- sell conditions
       if(Open[1]>ma && Close[1]<ma)  
         {
          res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
          return;
         }
    //---- buy conditions
       if(Open[1]<ma && Close[1]>ma)  
         {
          res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);
          return;
         }
    //----
      }
    //+------------------------------------------------------------------+
    //| Check for close order conditions                                 |
    //+------------------------------------------------------------------+
    void CheckForClose()
      {
       double ma;
    //---- go trading only for first tiks of new bar
       if(Volume[0]>1) return;
    //---- get Moving Average 
       ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
    //----
       for(int i=0;i<OrdersTotal();i++)
         {
          if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
          if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;
          //---- check order type 
          if(OrderType()==OP_BUY)
            {
             if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
             break;
            }
          if(OrderType()==OP_SELL)
            {
             if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
             break;
            }
         }
    //----
      }
    //+------------------------------------------------------------------+
    //| Start function                                                   |
    //+------------------------------------------------------------------+
    void start()
      {
    //---- check for history and trading
       if(Bars<100 || IsTradeAllowed()==false) return;
    //---- calculate open orders by current symbol
       if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
       else                                    CheckForClose();
    //----
      }
    //+------------------------------------------------------------------+
     
    Вот здесь также разбирается ваш случай:
    'Советник на заказ. Инструкция для трейдера.'
     
    solandr

    Спасибо большое за помощь, помогло двигаться в развитии...а не стоять на месте.
    Причина обращения: