//+------------------------------------------------------------------+ //| siLagrange.mq4 | //| Copyright © 2007 Ñåðãååâ Àëåêñåé | //| los@we.kherson.ua | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Ñåðãååâ Àëåêñåé " #property link "mailto: los@we.kherson.ua" #include <WinUser32.mqh> //---- #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 SkyBlue #property indicator_color2 Crimson //---- extern int Pow=3;//Ñòåïåíü ïîëèíîìà Ëàãðàíæà. Æåëàòåëüíî 3..8 extern string ID="Lx";//Èäåíòèôèêàòîð îáúåêòà äëÿ íàõîæäåíèÿ îïîðíûõ òî÷åê extern int Shift=10;//Íà ñêîëüêî áàðîâ ïðîäëåâàåì â áóäóùåå //---- double Lx[];//Ïîëèíîì Ëàãðàíæà double Lx0[];//Ïîëèíîì Ëàãðàíæà â áóäóùåå íà shift áàðîâ int X[];//Íîìåðà áàðîâ ïî êîòîðûì ñòðîèòñÿ ïîëèíîì double Y[];//Çíà÷åíèÿ öåíû â òî÷êàõ double C[];//Êîýôôèöèåíòû ïîëèíîìà int init() { //---- indicator line SetIndexBuffer(0,Lx); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(1,Lx0); SetIndexStyle(1,DRAW_LINE); SetIndexShift(1, Shift); return(0); } void GetPoint() { string name; int i, j=0, n = ObjectsTotal(); ArrayResize(X, n); ArrayResize(Y, n); ArrayResize(C, n); for (i = 0; i<=n; i++) { name = ObjectName(i); if ((ObjectType(name)==OBJ_ARROW)&&(StringFind(name, ID)>=0)) { X[j] = iBarShift(NULL, 0, ObjectGet(name, OBJPROP_TIME1)); Y[j] = ObjectGet(name, OBJPROP_PRICE1); j++; } } if (j<Pow) Print("Íóæíî åùå "+(Pow-j-1)+" îïîðíûõ òî÷åê äëÿ "+ID+" ïîëèíîìà."); //Ñîðòèðîâêà ìàññèâîâ (ìåòîäîì "ïóçûðüêà") double y; bool b=true; while (b) { i = 0; b = false; while (i<j-1) { if (X[i]>X[i+1]) { n = X[i]; X[i] = X[i+1]; X[i+1] = n; y = Y[i]; Y[i] = Y[i+1]; Y[i+1] = y; b = true; } i++; } } } void Lagrange() { int i, j, b; //1. Íàéäåì êîýôôèöèåíòû ïîëèíîìà for (i = 0; i<Pow; i++) { C[i] = 1.0; for (j = 0; j<Pow; j++) if (j != i) C[i] = C[i]*(X[i]-X[j]); C[i] = Y[i]/C[i]; } // 2. Òåïåðü ïðîõîäÿ ïî âñåì áàðàì äî ìàñèìàëüíîãî áàðà, óêàçàííîãî â ðàñ÷åòå ïîëèíîìà //ðàñ÷èòûâàåì ñàì ïîëèíîì (èíäèêàòîð Lx) int bars = X[Pow-1]; double sx; for (b = 0; b<=bars; b++) { Lx[b] = 0.0; for (i = 0; i<Pow; i++) { sx = 1; for (j = 0; j<Pow; j++) if (j != i) sx = sx*(b-X[j]); Lx[b] = Lx[b]+C[i]*sx; } } //3. È ñòðîåì èíäèêàòîð Lx0 â áóäóùåå íà Shift for (b = -Shift; b<=0; b++) { Lx0[b+Shift] = 0.0; for (i = 0; i<Pow; i++) { sx = 1; for (j = 0; j<Pow; j++) if (j != i) sx = sx*(b-X[j]); Lx0[b+Shift] = Lx0[b+Shift]+C[i]*sx; } } } int start() { //1. Îïðåäåëÿåì òàáëèöó çíà÷åíèé X è Y äëÿ ïîñòðîåíèÿ ïîëèíîìà GetPoint(); //2.Ñòðîèì ïîëèíîì Lagrange(); //---- return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: