приведите простейший пример для иллюстрации. у нас есть несколько пользовательских индикаторов, которые вызывают пользовательские индикаторы. всё работает правильно.
Текст пользовательского индикатора, использующего DLL:
//+------------------------------------------------------------------+ //| Custom MACD.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- indicator settings #property indicator_separate_window #property indicator_buffers 2 #property indicator_color1 Silver #property indicator_color2 Red #import "AdaptiveFunc.dll" int JMA_Add(int Length, int Phase); void JMA_Clear(); int JMA_Count(); bool JMA_Delete(int ID); double JMA(double Data, int Count, int Shift, int ID); #import //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; //---- indicator buffers double ind_buffer1[]; double ind_buffer2[]; int ID_Buffer[3]; int limit; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- JMA Initialization ID_Buffer[0] = JMA_Add(FastEMA,0); ID_Buffer[1] = JMA_Add(SlowEMA,0); ID_Buffer[2] = JMA_Add(SignalSMA,0); //---- 3 additional buffers are used for counting. IndicatorBuffers(2); //---- 4 indicator buffers mapping SetIndexBuffer (0, ind_buffer1); SetIndexBuffer (1, ind_buffer2); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,1); SetIndexDrawBegin(1,SignalSMA); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1); //---- name for DataWindow and indicator subwindow label IndicatorShortName("JMA MACD("+FastEMA+","+SlowEMA+","+SignalSMA+")"); SetIndexLabel(0,"JMA MACD"); SetIndexLabel(1,"Signal"); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { for (int i = 0; i <= 2; i++) JMA_Delete(ID_Buffer[i]); if (JMA_Count() == 0) JMA_Clear(); return(0); } //+------------------------------------------------------------------+ //| Moving Averages Convergence/Divergence | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- macd counted in the 1-st buffer for (int i = limit; i >= 0; i--) ind_buffer1[i]= JMA(Close[i],Bars,i,ID_Buffer[0]) - JMA(Close[i],Bars,i,ID_Buffer[1]); //ind_buffer1[i]= iCustom(NULL,0,"JMA",SignalSMA,0,i);// - iCustom(NULL,0,"JMA",SlowEMA,0,i); //---- signal line counted in the 2-nd buffer; for (i = limit; i >= 0; i--) ind_buffer2[i] = JMA(ind_buffer1[i],Bars,i,ID_Buffer[2]); //---- done return(0); }
При добавлении на график, данный индикатор работает нормально. Но я не могу получить его значения через вызов iCustom из другого индикатора либо советника.
Пример такого вызова:
//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // initial data checks // it is important to make sure that the expert works with a normal // chart and the user did not make any mistakes setting external // variables (Lots, StopLoss, TakeProfit, // TrailingStop) in our case, we check TakeProfit // on a chart of less than 100 bars if(Bars<100) { Print("bars less than 100"); return(0); } if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // check TakeProfit } // to simplify the coding and speed up access // data are put into internal variables /* MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1); */ MacdCurrent=iCustom(NULL,0,"JMA MACD",12,26,9,0,0); MacdPrevious=iCustom(NULL,0,"JMA MACD",12,26,9,0,1); SignalCurrent=iCustom(NULL,0,"JMA MACD",12,26,9,1,0); SignalPrevious=iCustom(NULL,0,"JMA MACD",12,26,9,1,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); total=OrdersTotal(); if(total<1) { // no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // check for long position (BUY) possibility if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // check for short position (SELL) possibility if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } // it is important to enter the market correctly, // but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { if(OrderType()==OP_BUY) // long position is opened { // should it be closed? if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position return(0); // exit } // check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else // go to short position { // should it be closed? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position return(0); // exit } // check for trailing stop if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } // the end.
Возможно это потому, что dll написан на делфи... В предидущем посте на эту тему мне так ответ никто и не дал... Дело в том, что передать массив в пользовательскую функцию я вообще не могу. Ну да ладно, это я вроде бы обошел (пока что обошелся без массивов). Но вот еще один глюк - MrtaTrader вылетает как только я удаляю свой индикатор.
Возможно у всех этих проблем один источник - длл написана на делфи...
Прошу разъяснить ситуацию, поскольку без этого сложно что либо дальше делать.
Возможно у всех этих проблем один источник - длл написана на делфи...
Прошу разъяснить ситуацию, поскольку без этого сложно что либо дальше делать.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пробовал allow dll imports. Не помогает!