Как в данном iCustom передать данные стрелок в эксперт?
Индикатор неправильно работает.
... и еще одни вопрос, если можно:
в учебнике приведен пример по 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 до их обнуления?
Четыре недели бьюсь, голову сломал... никак не могу выдернуть из буфера индикатора данные. (на форуме уже все темы по iCustom перечитал, испробовал все рекомендации)
Индикатор рисует две МА. быструю и медленную. Показывает пересечения, а также, на быстрой МА стрелками рисует точки продажи и покупки.
Хотел эксперта написать, который бы открывал позиции по стрелкам и закрывал один ордер противоположной стрелкой и открывал новый ордер в своем направлении.
Рисунок индикатора:
Здесь четыре буфера.
Два первых рисуют линии, а третий и четвертый используются для расчетов данных по точкам входа и выхода, и там же стрелки.
Только когда вызываю данные из третьего и четвертого буфера, там все время одни нули! Никак не могу найти в буферах моменты появления стрелок...
Я уже в эксперте пробовал выводить на печать все данные всех буферов: Print ("index1=", Indexbufer3) и так далее... там только одни нули!
(вообще-то, я учусь MQL4, поэтому столько вопросов и никак не могу освоить iCustom)