Индикатор неправильно работает.
... и еще одни вопрос, если можно:
в учебнике приведен пример по iCustom:
double val=iCustom(NULL, 0, "SampleInd",13,1,0);параметр,13,
... | - | Parameters set (if necessary). The passed parameters and their order must correspond with the desclaration order and the type of extern variables of the custom indicator. |
...что значит 13? что это за параметры?
Индикатор неправильно работает.
Просто, я заметил в данном индикаторе, что желтая стрелка на покупку в своей очередности никогда не уходит выше красной, в свою очередь, красная стрелка на продажу никогда не уходит в своей очередности ниже желтой стрелки... вот эту особенность индикатора я и хотел использовать для советника, который бы открывал и закрывал сделки используя эти стрелки.
Да, я знаю... он стрелки не на пересечении рисует, а по одной только быстрой машке... но, мне нужно выдернуть данные из буфера, чтобы использовать эту ошибку и заключать сделки по одной только быстрой машке по стрелкам.
Совершенно не волнует алгоритм по которому работает этот индикатор, разговор о том, что индикатор глючит.
... и еще одни вопрос, если можно:
в учебнике приведен пример по iCustom:
параметр,13,... | - | Parameters set (if necessary). The passed parameters and their order must correspond with the desclaration order and the type of extern variables of the custom indicator. |
...что значит 13? что это за параметры?
Эти параметры взяты условно, лишь в качестве примера, на их месте могли быть любые другие. Внимательно ознакомьтесь с работой ф-ии.
В редакторе МЕ на нее (эту ф-ию) встаньте курсором и нажмите F1.
...что значит 13? что это за параметры?
Это параметр индикатора SampleInd. 13 - это значение параметра.
Если использовать пересечение двух машек MA5+MA21+RSI21... то это будет метод Баговино. По нему я смог собрать свой первый советник на основе Moving Average Simple.
#define MAGICMA 20110505 extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; extern double MovingPeriodFast = 5; extern double MovingPeriodSlow = 12; extern double RSIPeriod = 21; //+------------------------------------------------------------------+ //| 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 FastMA; double SlowMA; double RsiSig=0; int res; int sigCurrent=0; int sigPrevious=0; double pipdiffCurrent=0; double pipdiffPrevious=0; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average FastMA=iMA(NULL,0,MovingPeriodFast,0,MODE_EMA,PRICE_CLOSE,0); SlowMA=iMA(NULL,0,MovingPeriodSlow,0,MODE_EMA,PRICE_CLOSE,0); RsiSig=iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0); pipdiffCurrent=(FastMA-SlowMA); Comment("pipdiffCurrent = "+pipdiffCurrent+" "); if (pipdiffCurrent>0 && RsiSig>50) { sigCurrent = 1; //Up } else if (pipdiffCurrent<0 && RsiSig<50) { sigCurrent = 2; //Down } //---- sell conditions if(sigCurrent == 2) {res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return;} //---- buy conditions if(sigCurrent == 1) {res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);return;} //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double FastMA; double SlowMA; double RsiSig=0; int sigCurrent=0; int sigPrevious=0; double pipdiffCurrent=0; double pipdiffPrevious=0; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average FastMA=iMA(NULL,0,MovingPeriodFast,0,MODE_EMA,PRICE_CLOSE,0); SlowMA=iMA(NULL,0,MovingPeriodSlow,0,MODE_EMA,PRICE_CLOSE,0); RsiSig=iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, 0); pipdiffCurrent=(FastMA-SlowMA); Comment("pipdiffCurrent = "+pipdiffCurrent+" "); if (pipdiffCurrent>0 && RsiSig>50) { sigCurrent = 1; //Up } else if (pipdiffCurrent<0 && RsiSig<50) { sigCurrent = 2; //Down } //---- 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(sigCurrent == 2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } if(OrderType()==OP_SELL) { if(sigCurrent == 1) 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(); //---- } //+------------------------------------------------------------------+
В индикаторе еще высчитываются такие параметры, как :
= High[i-1]+5*Point;
= Low[i-1]-5*Point;
Теперь вот с ними никак не разберусь, как их правильно прокомментировать и прочитать?
С комментариями быстрее учится и осваивается...
bool pokup=false; if (iCustom(NULL,0,"test",4,1)>0)pokup=true;
bool prodaza=false; if (iCustom(NULL,0,"test",3,1)>0)prodaza=true;
расчет для 1-го бара
я только учусь)) извиняйте за корявость
... я проверил советом Rosh о значениях буферов:
//+------------------------------------------------------------------+ //| Check.mq4 | //| Rosh | //| | //+------------------------------------------------------------------+ #property copyright "Rosh" #property link "" //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { double bufer1,bufer2,bufer3,bufer4; //---- for (int shift=100;shift>-0;shift--) { bufer1=iCustom(Symbol(),0,"iTest",0,shift); bufer2=iCustom(Symbol(),0,"iTest",1,shift); bufer3=iCustom(Symbol(),0,"iTest",2,shift); bufer4=iCustom(Symbol(),0,"iTest",3,shift); Print("i="," bufer1=",bufer1," bufer2=",bufer2," bufer4=",bufer4," bufer3=",bufer3); } //---- return(0); } //+------------------------------------------------------------------+
первые два буфера выводят значения МА и рисуют линии... а третий и четвертый буфер всегда нули показывает, независимо от того, что индикатор рисует стрелки.
подскажите, как достать данные из буфера 3 и 4 до их обнуления?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Четыре недели бьюсь, голову сломал... никак не могу выдернуть из буфера индикатора данные. (на форуме уже все темы по iCustom перечитал, испробовал все рекомендации)
Индикатор рисует две МА. быструю и медленную. Показывает пересечения, а также, на быстрой МА стрелками рисует точки продажи и покупки.
Хотел эксперта написать, который бы открывал позиции по стрелкам и закрывал один ордер противоположной стрелкой и открывал новый ордер в своем направлении.
Рисунок индикатора:
Здесь четыре буфера.
Два первых рисуют линии, а третий и четвертый используются для расчетов данных по точкам входа и выхода, и там же стрелки.
Только когда вызываю данные из третьего и четвертого буфера, там все время одни нули! Никак не могу найти в буферах моменты появления стрелок...
Я уже в эксперте пробовал выводить на печать все данные всех буферов: Print ("index1=", Indexbufer3) и так далее... там только одни нули!
(вообще-то, я учусь MQL4, поэтому столько вопросов и никак не могу освоить iCustom)