- Relative Vigor Index - Осцилляторы - Использование технических индикаторов - Графики котировок, технический и фундаментальный анализ
- Relative Vigor Index - Осцилляторы - Индикаторы - Чарты - MetaTrader 5 для Android
- Relative Vigor Index - Осцилляторы - Индикаторы - Чарт - MetaTrader 5 для iPhone
Просто во всех своих индикаторах выбирайте построение по цене открытия бара (Open) и сигнал в течение этого бара никуда гулять уже не будет.
- Спасибо...но можно хоть чуть более подробно...а вообще прошу Вас помочь , сделать условие от цены. Очень буду благодарен.
Как определить начало очередного бара? (Это бывает необходимо, чтобы узнать, что предыдущий бар только что сформировался.) Существует несколько способов.
Первый способ основан на проверке количества баров:
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(); //---- } //+------------------------------------------------------------------+
'Советник на заказ. Инструкция для трейдера.'
Спасибо большое за помощь, помогло двигаться в развитии...а не стоять на месте.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования