Индикатор
//+------------------------------------------------------------------+ //| GOscSAR.mq4 | //| | //| | //+------------------------------------------------------------------+ #property copyright "" #property link "" #property indicator_separate_window #property indicator_minimum -1 #property indicator_maximum 1 #property indicator_buffers 1 #property indicator_color1 Red extern double SARStep = 0; extern double SARMax = 0; //---- buffers double Buffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { SetIndexStyle( 0,DRAW_HISTOGRAM ); SetIndexBuffer( 0,Buffer ); return(0); } double SAR( int bar ) { double ret = iSAR( Symbol(), NULL, SARStep, SARMax, bar ); return (ret); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { for( int bar = 0; bar < Bars ; bar++ ) { double value = 0; double prev = SAR( bar + 1 ); double curr = SAR( bar ); if( prev <= iLow( Symbol(), NULL, bar + 1 ) && curr >= iHigh( Symbol(), NULL, bar ) ) { value = -1; } else if( prev >= iHigh( Symbol(), NULL, bar + 1 ) && curr <= iLow( Symbol(), NULL, bar ) ) { value = 1; } Buffer[ bar ] = value; }//for return(0); } //+------------------------------------------------------------------+
Советник
//+------------------------------------------------------------------+ //| Test01.mq4 | //| | //| | //+------------------------------------------------------------------+ #property copyright "" #property link "" #include "include\GUtils.mqh" extern double Lots = 1; extern int Length = 3; extern double BuyLevel = 0.3; extern double SellLevel = -0.3; extern double SARStep = 0.02; extern double SARMax = 0.2; int m_Ticket = 0; double m_dSAR = 0.0; void CheckClosePos( int ticket ) { double price = -1; if( m_dSAR != 0 ) { int pos = OrderType(); price = GetPrice( pos, false ); }//if if( price > 0 ) { if( !OrderClose( ticket, Lots, price, 0 ) ) { int err = GetLastError(); }//if }//if price } int CheckOpenPos() { double price = 0; int result = 0; int pos = -1; if( m_dSAR > 0 ) { pos = OP_BUY; }//if else if( m_dSAR < 0 ) { pos = OP_SELL; }//else if price = GetPrice( pos, true ); if( price > 0 ) { result = OrderSend( Symbol(), pos, Lots, price, 0, 0, 0 ); }//if return (result); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { m_dSAR = iCustom( Symbol(), NULL, "GOscSAR", SARStep, SARMax, 0, 0 ); Print("GOscSAR: " + m_dSAR); if( OrderSelect( m_Ticket, SELECT_BY_TICKET ) ) { CheckClosePos( m_Ticket ); }//if if( OrdersTotal() == 0 ) { m_Ticket = CheckOpenPos(); }//if return(0); } //+------------------------------------------------------------------+
Может надо так ?
iCustom( Symbol(), 0, "GOscSAR", SARStep, SARMax, 0, 0 );
Rosh:
Советник
Советник
//+------------------------------------------------------------------+ //| Test01.mq4 | //| | //| | //+------------------------------------------------------------------+ #property copyright "" #property link "" #include "includeGUtils.mqh" extern double Lots = 1; extern int Length = 3; extern double BuyLevel = 0.3; extern double SellLevel = -0.3; extern double SARStep = 0.02; extern double SARMax = 0.2; int m_Ticket = 0; double m_dSAR = 0.0; void CheckClosePos( int ticket ) { double price = -1; if( m_dSAR != 0 ) { int pos = OrderType(); price = GetPrice( pos, false ); }//if if( price > 0 ) { if( !OrderClose( ticket, Lots, price, 0 ) ) { int err = GetLastError(); }//if }//if price } int CheckOpenPos() { double price = 0; int result = 0; int pos = -1; if( m_dSAR > 0 ) { pos = OP_BUY; }//if else if( m_dSAR < 0 ) { pos = OP_SELL; }//else if price = GetPrice( pos, true ); if( price > 0 ) { result = OrderSend( Symbol(), pos, Lots, price, 0, 0, 0 ); }//if return (result); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { m_dSAR = iCustom( Symbol(), NULL, "GOscSAR", SARStep, SARMax, 0, 0 ); Print("GOscSAR: " + m_dSAR); if( OrderSelect( m_Ticket, SELECT_BY_TICKET ) ) { CheckClosePos( m_Ticket ); }//if if( OrdersTotal() == 0 ) { m_Ticket = CheckOpenPos(); }//if return(0); } //+------------------------------------------------------------------+
Маленькое дополнение.
Файл #include "includeGUtils.mqh"
содержит функцию GetPrice(), имеющую вид:
double GetPrice( int position, bool isOpen = true ) { double result = 0; if( isOpen ) { switch( position ) { case OP_BUY : result = Ask; break; case OP_SELL : result = Bid; break; }//switch }//if else { switch( position ) { case OP_BUY : result = Bid; break; case OP_SELL : result = Ask; break; }//switch }//else return (result); }
Rosh:
Может надо так ?
Может надо так ?
iCustom( Symbol(), 0, "GOscSAR", SARStep, SARMax, 0, 0 );
Возможно.
А можно пояснить: чем второй параметр 0 отличается от NULL?
PS Установка второго параметра в 0 изменений не принесла. При тестировании использую модель по ценам открытия ( со сформированными барами )
Rosh:
Смените модель на Control Points - должно заработать :)
Смените модель на Control Points - должно заработать :)
Спасибо, заработало :)
To Rosh - мне показалось, что у Параболика можно кроме "сверху/снизу"
выделить "движение/флэт". В зависимости от
или ... и так не делают? задержка в два бара все скушает.
if(SAR(bar)<low && SAR(bar+1))<low && SAR(bar+2))<low) { double d=(SAR(bar)-SAR(bar+1))/(SAR(bar+1)-SAR(bar+2)) ; if(d>1) ...; // Mart Go Up }
или ... и так не делают? задержка в два бара все скушает.
Обычно параболик используют как трендовый индикатор.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
}
//+------------------------------------------------------------------+
У меня есть простая стратегия, которая использует этот индикатор следующим образом. Если значение индикатора 1 - делает buy, если -1 - делает sell, если перед этим был открытый ордер - использует те же самые сигналы 1 и -1 для закрытия.
Проблема состоит в следующем. При тестировании у меня генерируется набор сигналов 1, -1 (окно индикатора под графиком цен) и на барах, где эти сигналы сгенерированы, я ожидаю увидеть открытие/закрытие соответсвующих позиций. Но! Этих открытий/закрытий нет, а в журнале я вижу, что все значения САР-а равны 0 (выводятся строчкой Print("GOscSAR: " + m_dSAR) ). При этом повторяю - индикатор отображается верно.Код имеет вид:
Вопрос: что я сделал неверно? Почему код стратегии получает значения, отличные от тех, которые генерирует мой кастом-индикатор.
З.Ы. Я только начинаю практиковаться, так что буду рад любым замечаниям и предложениям.